Ejecutar aplicacion de escritorio como Administrador

microsoft-logo Una de las cosas que he necesitado hacer, y que nunca lo recuerdo, es tener la posibilidad de ejecutar directamente una aplicación como administrador.

Esta claro, que siempre tienes la posibilidad de, utilizando el botón derecho del ratón, seccionar la opción de “Ejecutar como administrador” (como se aprecia en la siguiente imagen)

RunAs

Pero existe veces en los que quieres que tu aplicación, solo permita ejecutarse con permisos de Administrador de la maquina, lo que permite realizar ciertas acciones que de otra forma no podrías. En este caso lo que hay que hacer es añadir un archivo de manifiesto o (app.manifest), donde se especifican múltiples metadatos de la aplicación, entre los que destaca, la seguridad.

Para añadir un archivo app.manifest a nuestra aplicacion, solo tienes que:

  • Aañadir desde Visual Studio, un nuevo archivo del tipo “Archivo de manifiesto de aplicación” como podemos apreciar:

app-manifest

  • Una vez añadido, editamos el archivo y donde aparece:
 

lo modificamos para que sea:

 

 

  • Por ultimo, solo nos queda acceder a las propiedades del proyecto, y dentro de Aplicación, seleccionar el archivo de manifiesto que hemos añadido:

app-manifest_2

Así la próxima vez que ejecutes la aplicación, solicitará credenciales de Administrador.

Referencia: Assembly Manifest

 

Configurar tu adaptador de red con un archivo .bat

Windows8  A partir de la versión de Windows 7, Microsoft cambió los parámetros del comando Netsh, con la inclusión del protocolo IPv6 en sus sistemas operativos.

Si normalmente trabajas en múltiples clientes, con diferentes configuraciones de Red, te pasarás todo el día cambiando los parámetros de configuración de tu adaptador de red. Para poder automatizar esto, os propongo el uso de este conjunto de comandos, que puede incluirse en un archivo .bat (archivo de procesamiento por lotes) para automatizar la labor de cambiar la configuración del adaptador.

Para ello solo tienes que crear un archivo de texto plano, con extensión .bat y añadir lo siguiente (dependiendo la opción que desees):

  • Para especificar una Dirección IP, Mascara de subred, Puerta de enlace predeterminada y DNSs deberás escribir lo siguiente:
netsh interface ipv4 set address name=“Ethernet” source=static address=192.168.1.10 mask=255.255.255.0 gateway=192.168.1.1
netsh interface ipv4 add dnsserver name=”Ethernet” address=8.8.8.8 index=1
netsh interface ipv4 add dnsserver name=”Ethernet” address=8.8.4.4 index=2

En este caso deberás modificar los siguientes parámetros:

  1. Parámetro name: “Ethernet” -> Nombre de tu adaptador de red
  2. Parámetro address: 192.168.1.10 -> Dirección IP
  3. Parámetro mask: 255.255.255.0 -> Mascara de subred
  4. Parámetro gateway: 192.168.1.10 -> Puerta de enlace predeterminada
  5. Parámetro address: 8.8.8.8 -> Dirección IP del DNS primario
  6. Parámetro address: 8.8.4.4 ->Dirección IP del DNS secundario

Este es el resultado de la ejecución del comando anterior:

ConfigIPv4

 

  • En el caso que, en vez de configurar manualmente el adaptador, prefieras que el DHCP te asigne una dirección de forma dinámica, deberás escribir esto:
netsh interface ipv4 set ADDRESS “Ethernet” source=DHCP
netsh interface ipv4 set DNS “Ethernet” source=DHCP

En este caso solo deberás modificar el siguiente parámetro:

  1. Parámetro name: “Ethernet” -> Nombre de tu adaptador de red

Este es el resultado de la ejecución de estos dos comandos:

ConfigIPv4_2

 

IMPORTANTE: La ejecución de estos comandos, bien desde una consola del sistema, o bien desde un archivo .bat ha de ejecutarse como Administrador.

Referencia: Netsh commands for Interface Internet Protocol version 4 (IPv4)

 

Visual Studio 2013 – We were unable to automatically populate your Team Foundation Service accounts

Visual StudioUna cosa algo extraña me paso ayer con el Visual Studio 2013… nada mas abrirlo revivo el siguiente error: “We were unable to automatically populate your Team Foundation Service accounts” y posteriormente me indica: “Not valid for use in specified state“.

He de indicar que tengo múltiples conexiones a diferentes servidores de TFS, y el problema es que no podía conectar con ninguno de los citados servidores de TFS.

Después de perder mucho tiempo buscando una solución al problema, di con la solución al problema, es necesario acceder al registro de Windows (REGEDIT.exe) y eliminar la siguiente clave: ‘HKEY_CURRENT_USER\Software\Microsoft\VSCommon\12.0\ClientServices\TokenStorage‘.

En la siguiente imagen se aprecia cual es la rama a borrar:

ErrorVS2013

 

Referencia: Blog de Trevor Hancock.

 

Error en el paso de implementación ‘Desinstalar aplicación para SharePoint’: No se puede conectar con el sitio de SharePoint.

sharepoint2013 Antes de nada, indicar que este error: “Error en el paso de implementación ‘Desinstalar aplicación para SharePoint’: No se puede conectar con el sitio de SharePoint” o en inglés “Error occurred in deployment step ‘Uninstall app for SharePoint’: Cannot contact site at the specified URL” se produce cuando hemos desarrollado una solución y queremos implementarla en SharePoint 2013/Office 365 desde el Visual Studio 2012/2013 (en mi caso es una solución de una App para SharePoint 2013 auto-hospedada, que un compañero me ha pasado) .

El motivo de este error, puede producirse por varios motivos (básicamente es porque no tienes permisos en el sitio y base de datos), pero muchas veces se nos pasa por alto verificar una cosa tan simple, como que la propiedad “URL del sitio”, que debe de tener la url de nuestra colección de sitio, creada con la plantilla de “Sitio del desarrollador”.

Para verificar esto, en Visual Studio debemos abrir la ventana de propiedades del proyecto que utilizamos para empaquetar la solucion de SharePoint (normalemente puedes acceder a ella pulsando la tecla: F4) y ver si la propiedad “URL del sitio” esta correctamente rellena:

SiteUrlEmpty

En caso que no sea así, introducir un valor correcto y volver a implementar la solución…

 

Al menos uno de los tipos de campo no se ha instalado correctamente. Vaya a la página de configuración de la lista para eliminar estos campos.

sharepoint2010Este es el mensaje de error que me muestra cuando intento acceder a una página de un sitio de publicación tras una migración de SharePoint 2007 a SharePoint 2010: “Al menos uno de los tipos de campo no se ha instalado correctamente. Vaya a la página de configuración de la lista para eliminar estos campos” o en ingles “One or more field types are not installed properly. Go to the list settings page to delete these fields“.

ErrorTiposCampoInstalados

Este problema se produce porque cuando se activa la característica de SharePoint “Server Publishing Infrastructure“, esta crea una lista interna (esta oculta) llamada “Relationships List“, donde se almacena información de las variaciones y la información de esta lista no es correcta o no se ha actualizado correctamente.

Para solucionarlo lo que hay que hacer, únicamente es borrar la información que hay en esta lista, para ello hay que realizar los siguientes pasos, entre los que destacan la ejecución de varios comandos de PowerShell:

  1. Acceder con el navegador web a la lista “Relationships List” y eliminar los elementos que haya en esta: (http://<HostName>/<Site>/Relationships%20List/allitems.aspx)
  2. Desactivar la característica “Infraestructura de publicación de SharePoint Server“, de la colección de sitio: Disable-SPFeature –Identity f6924d36-2fa8-4f0b-b16d-06b7250180fa –url http://<HostName>/<Site>
  3. Activar la misma característica de Infraestructura: Enable-SPFeature –Identity f6924d36-2fa8-4f0b-b16d-06b7250180fa –url http://<HostName>/<Site>
  4. Desactivar la característica de “Publicación de SharePoint Server” a nivel de sitio: Disable-SPFeature –Identity 94c94ca6-b32f-4da9-a9e3-1f3d343d7ecb –url http://<HostName>/<Site>
  5. Activar característica de Publicación: Enable-SPFeature –Identity 94c94ca6-b32f-4da9-a9e3-1f3d343d7ecb –url http://<HostName>/<Site>

Tras la realización de estos pasos, podrás acceder sin problemas a todas las paginas existentes en el sitio con este problema.

IMPORTANTE: Esta solución propuesta solo es valida para plataformas SharePoint 2010.

 

Service Pack 1 para Office 2013 y SharePoint 2013

sharepoint2013Hoy día 25 de Frebrero, Microsoft ha anunciado la salida del Service Pack 1 para Office 2013 y SharePoint 2013.

Esta nueva versión del Service Pack 1, proporciona correcciones para mejorar: la estabilidad general, funcionalidad y seguridad en Office, SharePoint Server y productos relacionados. Entre las mejoras en la funcionalidad, destaca:

  • Correcciones de compatibilidad para Windows 8.1 e Internet Explorer 11.
  • Mejor soporte para hardware moderno, como dispositivos de alto DPI y la precisión la precisión del touchpad.
  • Nuevas capacidades para Apps de Office y APIs para desarrolladores :).
  • Power Map para Excel, una herramienta de visualización 3D para la cartografía, la exploración y la interacción con los datos geográficos y temporales en Excel (ya está disponible para clientes de Office 365 con  suscripción ProPlus).
  • Mejoras en la tecnología de virtualización Click-to-Run que instala y actualiza aplicaciones de Office 365 de escritorio.
  • SkyDrive Pro es ahora OneDrive for Business (únicamente ha habido un cambio de nombre del producto).

Para mas información, puedes visitar los siguientes KBs para más información sobre las actualizaciones del  Service Pack 1 de los siguientes productos:

Update KB Article
Office 2013 SP1. Covers these applications:

  • Access
  • Excel
  • InfoPath
  • Lync
  • OneDrive for Business
  • OneNote
  • Outlook
  • PowerPoint
  • Publisher
  • Word

 

2817430
Project 2013 SP1 2817433
Visio 2013 SP1 2817443
SharePoint Designer 2013 SP1 2817441
SharePoint Server 2013 SP1 2817429
Project Server 2013 SP1 2817434
Office Web Apps Server 2013 SP1 2817431
All other desktop products and language packs 2850036
All other server products and language packs 2850035

 

IMPORTANTE: Siempre es bueno probar cualquier Service Pack en un entorno no productivo, para detectar y corregir posibles problemas, y así evitar males mayores.

Para mas información: http://support.microsoft.com/kb/2817429

 

“Configurar grupos para este sitio” en SharePoint 2010

sharepoint2010Una de las cosas que echo de menos de SharePoint 2007 en SharePoint 2010 es la pagina de “Configurar grupos para este sitio” o en inglés “Set up Groups for this site“, donde el usuario puede especificar quién puede tener acceso a un  sitio en concreto. Esta claro que he mejorado mucho la forma de gestionar los grupos y usuarios, pero hecho en falta esta pagina (y sobre todo su funcionalidad)…

 

ConfigurarGrupos

Por algún motivo, el equipo de SharePoint decidió que esta funcionalidad “Configurar grupos de este sitio” debía de estar oculta en el menú de Permisos del Sitio. Si que esta visible, cuando creas un Sitio nuevo (si lo creas con la opción de permisos únicos), la malo es que luego, no hay forma de ver los grupos asignados a cada perfil.

Si necesitas realizar cambios en la asignación de grupos y como esta funcionalidad sigue estando en SharePoint 2010, siempre es posible acceder a la pagina por url: /_layouts/permsetup.aspx

 

ViewFormPagesLockdown para aumentar la seguridad en SharePoint 2010

sharepoint2010 Ayudando a un amigo, vimos que en portales públicos en los que se utiliza SharePoint 2010, puedes tener una mala configuración que a nivel de seguridad, puede ser problemático.

Cuando creas un portal publico (usando las características de Publicación) basado en SharePoint, has de configurar el acceso de usuarios, como anónimo, por lo que por defecto permite que cualquier usuario acceda a los siguientes recursos:

  • /_layouts/viewlsts.aspx
  • /Lists/[ListName]/AlItems.aspx

Esto es un problema de seguridad, ya que estas dando una información muy importante a usuarios anónimos, que podrían usar en tu contra… pero no hay problema ya que SharePoint trae una característica oculta a nivel de Site, llamada ViewFormPagesLockdown, que deshabilita el acceso a estos recursos de forma anónima.

Para activar esta funcionalidad, hay que utilizar un par de comandos de PowerShell:

1) Obtenemos el GUID de la característica ViewFormPagesLockdown, la cual como he comentado esta oculta con el siguiente comando:

Get-SPFeature | where { $_.DisplayName -eq "ViewFormPagesLockdown"}

ViewFormPagesLockdown

2) Una vez tenemos el GUID o identificador, lo que hacemos es activarlo:

Enable-SPFeature -url http://sharepoint -identity 7c637b23-06c4-4724-9a9a-7c175762c5c4 -confirm:$false

Tras este cambio, los usuarios tendrán que autenticarse, para acceder a estos recursos.

IMPORTANTE: Puedes tener problemas si dentro de esta colección de sitio, tienes subsitios de tipo Blog, en los que los usuarios pueden realizar comentarios sobre post o similares… para solucionar este tipo de problema, en el blog de sharepointblues.com te explican como se puede solucionar.

Como lanzar un Workflow programaticamente en SharePoint

Tras un periodo de inactividad, vuelvo con un nuevo post… Esta vez se trata, de la necesidad de lanzar un nuevo Workflow a nivel de listas o biblioteca en todos los ítems, previamente creados. Si el Workflow se configura para que se lance a la creación o modificación del ítem, puede que haya muchos ítems, que por antigüedad, no se modifiquen y no se lance el Workflow asociado.

Para realizar esto desde el API de SharePoint, la forma mas sencilla es la siguiente:

static private void LanzarWorkflow()
{
  //definición de variables necesarias para la ejecución
  string SP_URL = "http://mi_sharepoint";
  string LIST_NAME = "Pages";
  //este es el GUID del BaseID del Workflow que queremos ejecutar
  Guid wfBaseId = new Guid("b81abdd8-faf4-4bed-86ca-a49d9cc9913e");
  //se ejecuta con privilegios elevados
  SPSecurity.RunWithElevatedPrivileges(delegate
  {
	try
	{
	  using (SPSite site = new SPSite(SP_URL))
	  {
		using (SPWeb web = site.OpenWeb())
		{
		  SPList list = web.Lists[LIST_NAME];
		  SPListItemCollection items = list.Items;
		  for (int i = 0; i < items.Count; i++)
		  {
			web.AllowUnsafeUpdates = true;  
			//selecciona el item actual
			SPListItem item = items[i];
			Console.WriteLine(string.Format("[Item] Lanzando workflow para el item Id: {0} ", item.ID));
			//obtiene el objeto plantilla de WF asociado a la lista que queremos
			SPWorkflowAssociation associationTemplate = list.WorkflowAssociations.GetAssociationByBaseID(wfBaseId);
			//lanzar el WF a nivel del item
			web.Site.WorkflowManager.StartWorkflow(item, associationTemplate, associationTemplate.AssociationData);
			web.AllowUnsafeUpdates = false; //bloquea cambios por codigo
		  }
		}
	  }
	}
	catch (Exception ex) { Console.WriteLine(string.Format("***ERROR*** {0}", ex.ToString())); }
  });
}

Los únicos parámetros que necesita esta función son:

  • SP_URL: Url del sitio de SharePoint donde se encuentra la lista que tiene asociada el Workflow que deseamos lanzar
  • LIST_NAME: Nombre de la lista o biblioteca que tiene el Workflow
  • wfBaseId: por ultimo el Base ID del Workflow (este GUID lo puedes ver, por ejemplo, desde SharePoint Designer, editando el archivo XML de configuración del propio Workflow)

 

Listado de permisos de usuarios de un sitio en SharePoint 2010

powershellUna de las ultimas cosas que me han solicitado es recuperar todos los usuarios y sus permisos de una colección de sitio o subsitio en SharePoint 2010

La forma mas rápida que se me ocurrió es la de crear un script de PowerShell para ello. Como creo que os podría ser de utilidad, lo comparto con todos vosotros:

function Get-UsersPermissions([string]$portalurl, [String[]]$excludewebs, [string]$onesite) 
{ 
    [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") 
    $farm = [Microsoft.SharePoint.Administration.SPFarm]::Local 
	#añade la barra si no existe
    if (-not $portalurl.EndsWith("/")) { $portalurl = $portalurl + "/" } 
	#recorre todos los servicios de la granaja
    foreach ($spService in $farm.Services) 
	{ 
        if (!($spService -is [Microsoft.SharePoint.Administration.SPWebService])) { continue; } 
        foreach ($webApp in $spService.WebApplications) 
		{ 
            if ($webApp -is [Microsoft.SharePoint.Administration.SPAdministrationWebApplication]) { continue; } 
			$webAppUrl = $webApp.GetResponseUri('Default').AbsoluteUri 
			if ($webAppUrl.ToUpper() -eq $portalurl.ToUpper())
			{ 
				#recorre las colecciones que existen en la aplicacion web
				foreach ($site in $webApp.Sites) 
				{ 
					#si existe algun parametro 
					if (($onesite -ne $null) -and ($onesite -ne "")) 
					{ 
						#verifica si se ha incluido el parametro Web
						if ($site.Url.ToUpper() -ne $onesite.ToUpper()) { continue; } 
					} 
					#recorre los sitios que existen en la coleccion
					foreach ($web in $site.AllWebs) 
					{ 
						if ($excludewebs -contains $web.Url) 
						{ 
							Write-Host "Se ha excluido el sigioente sitio: " $web.Url 
							continue 
						} 
						foreach ($user in $web.SiteUsers)
						{ 
							#excluye al usuario: sharepoint\system 
							if ($user.Loginname.StartsWith("SHAREPOINT\")) { continue; } 
							#recupera la informacion a mostrar
							$data = @{ 
										"Coleccion" = $site.Url 
										"Url sitio" = $web.Url 
										"Nombre sitio" = $web.Title 
										"Usuario" = $user.Loginname 
										"Nombre" = $user.Name 
										"Roles" = $user.Roles 
										"Grupos" = $user.Groups 
							} 
							New-Object PSObject -Property $data 
						} 
						$web.Dispose(); 
					} 
					$site.Dispose() 
				} 
			} 
		} 
	} 
}

#---------------------------------------------------------------
#Opcion 1: Listas de los usuarios y sitio del la Aplicacion Web: http://intranet, pero solo muestra los usuarios y permisos del subsitio: http://intranet/sites/test
# Get-UsersPermissions -portalurl:http://intranet/  -onesite:http://intranet/sites/test | Out-GridView
#---------------------------------------------------------------
#Opcion 2: Listas de los usuarios y sitio del la Aplicacion Web http://intranet, pero excluye los 3 sitios: /gastos, /docs y /rrhh
# Get-UsersPermissions -portalurl:http://intranet/ -excludewebs:@('http://intranet/gastos','http://intranet/docs','http://intranet/rrhh')  | Out-GridView
#---------------------------------------------------------------
#Opcion 3: Lista todas los sitios y usuarios de la Aplicacion Web: http://intranet
# Get-UsersPermissions -portalurl:http://intranet/ | Out-GridView
#---------------------------------------------------------------