miércoles, 9 de diciembre de 2015

Como descargar una solución de granja instalada en SharePoint 2010 y 2013

Cómo descargar una solución de granja instalada es un requerimiento muy usual cuando se esta migrando versiones de SharePoint, por ejemplo de 2010 a 2013.  O bien migrando de un conjunto de servidores a otros por temas de problemas con el existente.

image

Bueno antes de resolver el tema hablemos un poco de las soluciones de granja.  Estas son empacadas en paquetes con extensión WSP, aunque no son las únicas ya que las soluciones Sandbox, las plantillas de sitio y las famosas apps utilizan este formato de paquete para que puedan ser ejecutados desde SharePoint.  Estos paquetes no son mas que empacados que contiene un conjunto de documentos y archivos binarios que componen la solución de granja o Farm Solution.

Es esto posible si por medio de PowerShell podemos realizar esta tarea que en versiones 2007 era impensable.

$FolderPath = "c:\Solutions"

foreach ($solution in Get-SPSolution) 

    $id = $Solution.SolutionID 

    $title = $Solution.Name 

    $filename = $Solution.SolutionFile.Name 

    $solution.SolutionFile.SaveAs("$FolderPath\$filename") 

}

 

Si se migra el paquete de 2010 a 2013 y este no tiene depedencias que hayan variado en la versión 2013, puede intentar el siguiente comando luego de extraer el paquete wsp de la granja SharePoint 2010.

Install-SPSolution –Identity Solution.wsp –GACDeployment –CompatibilityLevel All e intenar ejecutar el sitio en modo 2010.

https://technet.microsoft.com/en-us/library/dn673579.aspx

viernes, 27 de noviembre de 2015

Script para saber el tamaño de una carpeta de una biblioteca en SharePoint 2010-2013

 

Esta solicitud me hicieron hace un momento y como no vi un ejemplo en especifico para esto decidi compartirlo con mis amigos lectores.

Los tres parametros que necesitamos son: url del sitio web en cuestion, el nombre de la biblioteca y el nombre de la carpeta.  Como se muestra abajo:

$urlWebSite = “http://hostname/siteurl/sub-siteurl

$nombreLibreria = "Nombre-Libreria"

$nombreCarpeta = "Nombre-Carpeta"

Luego debemos de obtener el objeto SPWeb para encontrar la bilioteca de la siguiente forma:

$web = get-SPWeb $urlWebSite

Una vez que lla obtuvimos el objeto SPWeb que representa el sitio web en SharePoint obtenemos la biblioteca con la colección Folders del objeto SPWeb, como se muestra a continuación:

$folder =  $web.Folders[$nombreLibreria]

Ahora que almacenamos en la variable $folder la bilbioteca en cuestion, necesitamos obtener la carpeta que buscamos a través de la colección SubFolerds del objeto SPFolder, de la siguiente forma:

$subfolder = $folder.SubFolders[$nombreCarpeta]

Con eso tenemos ya la ubicación deseada para iniciar el proceso de lectura de los bytes ocupados en la carpeta y sub carpetas, para ello necesitamos crear un funcion que llamemos de forma recursiva hasta que obtengamos el espacio total ocupado.

[long]$total = 0

$total = GetFolderSize($subfolder)

La función es la siguiente:

function GetFolderSize ($Folder)

{

    [long]$folderSize = 0 

    foreach ($file in $Folder.Files)

    {

        write-host "Nombre documento" $file.Name

        $folderSize += $file.Length;

        write-host "Total en bytes que va acumulando:" $folderSize

    }

    foreach ($fd in $Folder.SubFolders)

    {

        $folderSize += GetFolderSize -Folder $fd

    }

    return $folderSize

}

Lo que nos falta entonces es convertir los bytes en megas, y en gigas es es lo que hacemos a continuación:

$totalInMb = ($total/1024)/1024

$totalInMb = "{0:N2}" -f $totalInMb

$totalInGb = (($total/1024)/1024)/1024

$totalInGb = "{0:N2}" -f $totalInGb

write-host "Tamaño total de la carpeta" $StartWeb "es" $total " Bytes,"

write-host "son " $totalInMb "MB o " $totalInGb "GB"

Y ahora necesitamos indicarle a Windows que libere el recurso en memoria que ocupamos a través del objeto SPWeb la invocar el comando  $web = get-SPWeb $urlWebSite , y lo hacemos de la siguiente forma:

$web.Dispose()

Para poner todo en orden debemo de prepar un contenedor de este script en un archivo con extension .ps1, por ejemplo:

C:\>GetFolderSize.ps1

y debera contener el siguiente orden del código descripto arriba:

<!--- Begin of File –->

function GetFolderSize ($Folder)

{

    [long]$folderSize = 0 

    foreach ($file in $Folder.Files)

    {

        write-host "Nombre documento" $file.Name

        $folderSize += $file.Length;

        write-host "Total en bytes que va acumulando:" $folderSize

    }

    foreach ($fd in $Folder.SubFolders)

    {

        $folderSize += GetFolderSize -Folder $fd

    }

    return $folderSize

}

$urlWebSite = “http://hostname/siteurl/sub-siteurl

$nombreLibreria = "Nombre-Libreria"

$nombreCarpeta = "Nombre-Carpeta"

$web = get-SPWeb $urlWebSite

$folder =  $web.Folders[$nombreLibreria]

$subfolder = $folder.SubFolders[$nombreCarpeta]

$totalInMb = ($total/1024)/1024

$totalInMb = "{0:N2}" -f $totalInMb

$totalInGb = (($total/1024)/1024)/1024

$totalInGb = "{0:N2}" -f $totalInGb

write-host "Tamaño total de la carpeta" $StartWeb "es" $total " Bytes,"

write-host "son " $totalInMb "MB o " $totalInGb "GB"

$web.Dispose()

<!--- End of File –->

Y por ultimo utilizamo el Management Shell for SharePoint para ejecutar el script de la siguiente forma:

c:\>.\GetFolderSize.ps1

Eso es todo amigos.

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

martes, 17 de noviembre de 2015

Autenticación Mixta en SharePoint 2013 no se lleva bien con las SharePonit Apps

image

El problema

Recientemente habilitamos para un cliente en Azure un SharePoint Foundatio 2013 con autenticación mixta, Windows y Azure AD.   Pero las apps no respondian adecuadamente, mostrandonos el error típico de las apps cuando no son correctamente configuradas. 

image

Al parecer cuando esta en modo mixto las apps no saben como resolver la autenticación.  Cuando retornabamos al Windows las apps comenzaron a funcionar correctamente.

image

Pensamos que el problema era la autenticación con los usuarios de AD de Azure, aunque nos parecia incorrecta esta apreciación.   Por lo que se nos ocurrió ahislar el problema y en vez de adicionar otro proveedor de autenticación a la aplicación Web existente lo que se nos occurió fue extender la aplicación Web.

Identity Providers dialog box in Azure

La Estrategía y solución

Extender la aplicación Web es una opción de SharePoint que lo que hace es hacer una copia del Web Site del IIS actual en otro Web Site y diferenciarlo por el nuevo nombre de la aplicación Web.  Si deseamos utilizar el puerto http es necesario utilizar un host header diferente.   Por lo que para este ejemplo utilizaremos el nombre extranet.midominio.com  para diferenciarlo de la zona predeterminada de la Aplicación Web, que diremos se llama portal.midominio.com.   Al momento de extenderla le indicamos que el proveedor de autenticación ya no era windows sino el Azure Provider la etiqueta que le pusimos al configurar al autenticación de Azure Active Directory.

Con eso nuestra sorpresa fue que las Apps empezaron a funcionar correctamente.  Ya que teniamos una entrada por autenticación Windows a través del url http://portal.midominio.com y para usuarios del Azure AD la dirección http://extranet.midominio.com

image

Enalces de referencia relacionados al tema:

Usar Active Directory de Microsoft Azure para autenticación de SharePoint 2013

https://technet.microsoft.com/es-es/library/dn635311.aspx

Extender las aplicaciones web basadas en notificaciones en SharePoint 2013

https://technet.microsoft.com/es-es/library/gg276325.aspx

Configuración de un entorno para aplicaciones de SharePoint (SharePoint 2013)

https://technet.microsoft.com/es-es/library/fp161236.aspx

En conclusión hasta hoy podré decir que la recomendación es no utilizar la autenticación mixta en SharePoint adicionando el proveedor de autenticación en la misma Aplicación Web, sino mejor extender la Aplicación Web con el siguiente método de autenticación.

Espero pueda salvarles el dia amigo lector.

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

sábado, 14 de noviembre de 2015

Enterese lo nuevo en SharePoint 2016

 

Nacida en la  nueva esta nueva versión nos prometen Cero DownTime, orientado a las necesidades de los usuarios,

Servicio de Búsqueda Hibrida

Permitirá habilitar el contenido mixto o solo para un ambiente Nube o Local.  Esto permitirá que la Aplicación Delve que analiza el trabajo realizado en SharePoint este disponible en una vista cenntralizada desde delve y veas tu trabajo más reciente y frecuente al alcance de una vista en Delve, con contenido mixto en SharePoint On Prem o bien en la nube en Office 365 con SharePoint Online.

MinRoles

Para IT Pros… la instalación nos presenta una variación, la definición del Rol del Servidor el cual instala los bits optimizados para el rol en especifico.

image

El App Laucher de Office 365 estará disponible para SharePoint 2016 permitiendo acceso rápido a las aplicaciones favoritas del usuario.

image

Nuevo centro de cumplimiento para administración del cotenido.  Ahora de forma mas clara y centralizada hay un lugar centralizado donde se puede definir politicas de retención de documentos, colecciones de sitios y plantillas.

 

New SharePoint 2016 Compliance Center

Nueva Interfaz de Usuario para dispositivos Moviles

La idea primaria del equipo de SharePoint es traer SharePoint al usuario final desde los dispositivos móviles, se esta realizando esfuerzos importantes para mejorar esta interfaz y que pueda operase SharePoint de una forma ágil y habitual para el usuario con dispositivos moviles (tabletas, telefonos de cualquier proveedor)

New Collaboration Experience in SharePoint 2016

 

SharePoint user voice

Por ultimo el equipo de Microsoft esta escuchando a los usuarios que les gusta y que no, Que quisieran tener, que quisieran que se mejorará, si quieres aportar abajo te dejo el enlace para hacerlo.

https://sharepoint.uservoice.com/

image

Asi que esperamos el próximo año un producto renovado, mejorado y productivo.

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

martes, 13 de octubre de 2015

Dando formato a una carta en un elemento Web de SharePoint

Hay veces que necesitamos construir el formato de una carta para ser desplegada en un elemento Web.  Para darle formato necesitamos escribir código HTML de forma dinámica y luego desplegarla al momento que elemento Web es cargado en la página de SharePoint.

image

Lo primero es definir un control asp.net Literal ya que este escribe exactamente lo que le enviemos sin realizar ninguna conversión, esto nos permitirá enviar código HTML dentro del texto.  Asi como se demuestra a continuación:

   <asp:Literal runat="server" ID="uiCarta"></asp:Literal>

En el código adyacente o Code Behind podemos encontrar la siguiente declaración.

public string Carta
       {
           set
           {
               uiCarta.Text = value;
           }
       }

Definimos una propiedad tipo String y definimos el valor a ingresar es para la propiedad Text del control Literal.

Para facilitar su comprensión asumiremos de la definición al obtendremos de codigo definido a continuacion.

var carta = @”

Señores

<b>[NombreUsuario]</b>

<br>

[Departamento]

<br><div style=”text-align:justify”>

Por este medio deseo indicarle…. blalablalallal

</div><br>

<table style=”width=100%;”>

<tr>

<td style=”width=50%;”>

Vo.Bo.

</td>

<td style=”width=50%;”>

Revisado

</td>

</tr>

</table>

”;

carta= carta.replace(“[Usuairo]”,SPContext.Current.Web.CurrentUser.Name).Replace(“[Departamento]”,userDepartmentVariable);

_vista.Carta = carta;

El Resultado es el siguiente:

image

Eso es todo.   Una solución sencilla para un requerimiento común.

Code4Fun!,

Juan Manuel Herrera Ocheita

jueves, 8 de octubre de 2015

Ojo con las dependencias al desinstalar una solución de granja en SharePoint

Las soluciones de granja de SharePoint siguen siendo requeridas por los clientes con instalaciones On Premises.  Como es una solución de granja afecta a toda la granja de SharePoint y esto incluye las Aplicaciones Web configuradas en la granja a pesar que cuando lo instalé indique que era sobre una aplicación Web en especifico.

El Escenario

AjaxControlToolKit.dll es una libreria que nos ayudará a mejorar los controles disponibles en asp.net y como empresa nosotros la utilizamos en las aplicaciones que entregamos a nuestros clientes sobre SharePoint Server.  Esta libreria no le va bien instalada en el Global Assembly Cache, es mejor instalarla en el directorio bin de la aplicación Web elegida.

Esto lo hacemos especificando en el Package del Proyecto de SharePoint Visual Web Part que incluya el ensamblado a nivel de la WebApplication, como se muestra en la imagen de abajo.

image

El Problema

En esta granja de SharePoint habian otras aplicaciones Web donde habiamos instalado otras soluciones utilizando la libreria AjaxControlToolKit.dll.   Lo que sucedio fue que al actualizar la solución en la granja la desinstalamos y la volvimos a instalar, a través de los comandos uninstall-SPSolution y Remove-SPSolution, eliminó de las otras aplicaciones Web la libreria AjaxControlToolKit.dll.  Y aunque volvimos a instalar la solución que estabamos probando con add-SPSolution y install-SPSolution, no volvio a instalar la libreria en las demás aplicaciones Web.

Los comandos ejecutados para re-instalar fueron los siguientes:

PS C:\> Uninstall-SPSolution –Identity infoware.doc.publicadosui.wsp 

PS C:\> Remove-SPSolution -Identity infoware.doc.publicadosui.wsp

PS C:\> Add-SPSolution –LiteralPath c:\instaladores\infoware.doc.publicadosui.wsp

PS C:\> Install-SPSolution -Identity infoware.doc.publicadosui.wsp -WebApplicat
on http://sitioprueba -GACDeployment

La Solución

Al repotarnos el error el usuario final, lo que hicimos fue copiar la libreria AjaxControlToolKit.dll en las aplicaciones Web que nos reportaron el error.  La solución fue sencilla, pero nos sorprendió la forma de comportarse al desintalar la solución de granja sobre el resto de aplicaciones Web.

Lexión Aprendida

A pesar que dirigimos la instalación a una aplicación Web por cuanto es una solución de Granja necesitamos realizar un respaldo del directorio bin y validar las librerias dependientes que coicidan con la solución que estamos instalando nosotros, y validar que continuen funcionando como lo solian hacer.

Code4Fun & Share2KeepBusy,  Smile

Juan Manuel Herrera Ocheita

viernes, 2 de octubre de 2015

Cannot unregister UpdatePanel since it was not registered with ScriptManager en un elemento Web de SharePoint

 

El error es el siguiente:

clip_image002

El error es algo confuso, ya que posiblemente ya hayamos definido el update panel en otro elemento web y no nos da el error.

El problema es en la definición declarativa de los elementos en SharePoint.   En mi particular caso el elemento Web estaba siendo implementado dentro de la solución WSP adicionandolo a una pagina que despliega el elemento web, como se muestra a continuación el código de la página.

clip_image002[5]

Si puedes observar el WebPartZone se llama wpSeguros2 pero en la definición de Elements.xml del Modulo que se utiliza para crear una pagina que incluya el elemento web cuando se instala la solución.  (Si quieres saber mas de como agregar una pagina de elementos web que se incluya dentro de tu solución pueder ver el siguiente enlace https://amalhashim.wordpress.com/2013/02/14/sharepoint-deploy-webpart-page-using-module/)

image

El problema se debio a que no coincide el WebPartZone ya que se llama wpSeguros y allí esta todo el problema, ya que SharePoitn si incluye el elemento Web a la página pero en una nueva zona que no esta definida en la plantilla y esto le afecto el updatepanel.

 

clip_image002[7]

Esto es todo espero a verles ayudado.

SharePoint4Fun!,

Juan Manuel Herrera Ocheita