En este post vamos a hablar de las posibles causas de un error muy común que podemos obtener cuando intentamos conectarnos a una colección de sitios de SharePoint desde una aplicación de consola con el modelo de objetos de servidor, aunque la estemos ejecutando con un usuario que pertenece al grupo de administradores de la máquina, o incluso al grupo de administradores de la granja. Este error es el que da título al post:

«The Web application at http://contoso.com/site could not be found. Verify that you have typed the URL correctly. If the URL should be serving existing content, the system administrator may need to add a new request URL mapping to the intended application.»

Un ejemplo muy simple de la aplicación de consola con la que, en la primera línea, podríamos estar obteniendo el error, sería el siguiente:

using (SPSite site = new SPSite("http://contoso.com/site"))
{
    SPWeb web = site.OpenWeb(); 
}

A continuación vamos a ver las posibles causas más comunes, y las soluciones para resolver este error:

  • La primera y más obvia, es que la URL que estamos indicando no es la correcta; por lo que tendríamos que cambiarla o revisar los AAM (Alternate Access Mapping).
  • La aplicación se está ejecutando en una máquina que no forma parte de la granja de servidores de SharePoint, mientras que el modelo de objetos de servidor únicamente se puede ejecutar desde alguno de los servidores de la granja.
  • La aplicación ha sido compilada bajo la plataforma “x86”; por lo que tendríamos que cambiar la plataforma de compilación a “x64” o a “Any CPU”.
  • La aplicación está utilizando una versión del framewok .Net diferente a la que le corresponde a la versión de SharePoint; por lo que tendríamos que configurarla con la adecuada: 3.5 para SharePoint 2010, 4.5 para 2013 y 4.5 o superior para 2016.

Además de estas cuatro posibles causas que suelen ser las más comunes, en este post me gustaría prestar especial atención a otra que, en mi opinión, es algo más difícil de detectar:

Para que un usuario pueda acceder a contenido y/o configuración de SharePoint (ya sea de la Administración Central o de otra aplicación web) mediante el modelo de objetos de servidor desde una aplicación de consola, no es suficiente con que sea administrador de la colección de sitios a la que se está intentando conectar, o que sea miembro del grupo de Administradores local de los servidores o del grupo de administradores de la granja de SharePoint; sino que se tienen que cumplir los dos siguientes requisitos:

  • El usuario tiene que ser miembro del grupo de usuarios de Windows WSS_ADMIN_WPG.
  • El usuario debe tener el rol SharePoint_Shell_Access en la base de datos de la aplicación web o de la colección de sitios a la que quiere acceder.

Del mismo modo, si el usuario no cumple estas condiciones, tampoco podrá acceder a la configuración de la granja y/o el contenido de una colección de sitios mediante comandos PowerShell.

Para configurar al usuario de este modo, podemos utilizar el comando PowerShell Add-SPShellAdmin que, básicamente, lo que hace son estas dos acciones mencionadas (también podríamos hacerlas a mano, aunque no es lo recomendable). Por tanto, si ejecutamos el siguiente comando, el usuario será añadido al grupo WSS_Admin_WPG en cada servidor de la granja, y se le asignará el rol SharePoint_Shell_Access en la base de datos de configuración:

Add-SPShellAdmin -UserName CONTOSO\User1

Del mismo modo, si queremos acceder al contenido de una colección de sitios (por ejemplo, una lista), deberemos ejecutar el mismo comando pero para la base de datos de contenido correspondiente, ya que sino, en este caso obtendremos un error de permisos en dicha base de datos:

«Cannot open database «wss_content_contoso» requested by the login. The login failed. Login failed for user CONTOSO\User1″

El comando para este último caso sería el siguiente:

Get-SPDatabase | ?{$_.Name -eq "WSS_Content_Contoso"} | Add-SPShellAdmin -UserName CONTOSO\User1

Dados los permisos que se van a atribuir a un usuario, es necesario que el usuario que ejecute estos comandos tenga el rol db_owner en la base de datos en la que se va a realizar la configuración, y el rol securityadmin en la instancia de SQL de la granja.

Podéis encontrar información más detallada de este comando en el siguiente enlace: https://technet.microsoft.com/es-es/library/ff607596.aspx