martes, 26 de junio de 2012

SharePoint 2010: The HTTP service located at PerformancePointService.svc is too busy

Síntoma:

DashBoardDesigner:

Imposible conectarse a los objetos creados de Inteligencia de Negocios desde SharePoint Desginer.  Mensaje: File not found o bien Loading por algunos minutos.

Visor de Eventos Windows:

Log Name: Application

Source: Microsoft-SharePoint Products-PerformancePoint Service

Date: 26/06/2012 09:41:35 a.m.

Event ID: 4

Task Category: PerformancePoint Services

Level: Error

Keywords:

User: domain\useraccountt

Computer: FQDN SharePoint Server

Description:

An unexpected error occurred. Error 52068.

System.ServiceModel.ServerTooBusyException: The HTTP service located at http://servername/583c95dc76b64fc2a204f238cf5e276f/PerformancePointService.svc is too busy. ---> System.Net.WebException: The remote server returned an error: (503) Server Unavailable.

at System.Net.HttpWebRequest.GetResponse()

at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)

IIS Manager:

El application Pool de la cuenta que ejecuta el servicio de PerformancePoint se  detiene cada vez que se ejecuta Dashboard Designer.

 

Causa:

Fue cambiado la contraseña de la cuenta que ejecuta el Application Pool de PerformancePoint  (Esto puede validarlo con los usuarios administradores si fue realizado, el problema surge cuando reinician el servidor y este cambio se hace efectivo).

Solución:

Desde el Central Administration, En Security, Managed Accounts, Seleccione la cuenta que ejecuta PerformancePoint, seleccione la opción Edit y actualice de nuevo la contraseña.

Si esto no le funciona, nuevamente provisione el servicio con el siguiente script que debe de ejecutar dese PowerShell para SharePoint:

Get-SPServiceApplication

$sts = Get-SPServiceApplication | ?{$_ -match "PerformancePoint"}

$sts

$sts.StatusOnline

$sts.Provision()

Referencia: http://social.technet.microsoft.com/Forums/en-SG/sharepoint2010customization/thread/489feb6b-590a-4968-b53f-74ee5edf80da

O bien Cree de nuevo el servicio y configúrelo correctamente para ello consulte el siguiente link:

http://technet.microsoft.com/en-us/library/ee748644.aspx

 

PerformancePointing!

Juan Manuel Herrera Ocheita

domingo, 24 de junio de 2012

SharePoint Fundation 2010: Una alternativa para copiar sitios desde el explorador

SharePoint Fundation 2010 es la versión de SharePoint que viene incluida en una licencia de Windows Server 2008 por lo que las opciones para manipular el contenido son limitadas, no cuenta con la utilidad de Site Manager de la versión SharePoint Server 2010 que se obtiene al activar la característica de publicación.  

A nivel de Interfaz Web accesible para administradores de algún sitio o de la colección de sitios en SharePoint Foundation no hay una alternativa explicita, pero si una solución alterna y es la capacidad de crear una plantilla de sitio incluyendo el contenido.

El procedimiento es el siguiente:

1) Con permisos de Full-Control sobre el sitio que se desea copiar, haga lo siguiente: Site Actions, Site Settings.

2)  En la sección Site Actions, seleccione la opción “Save site as template”.

image

3) Escribe el nombre del archivo, Nombre de la plantilla y Descripción y seleccione la opción “Include Content”.  Presione para finalizar el botón OK.

image

El resultado debe ser el siguiente:

image

Ahora vamos a crear un sitio basado el contenido de la plantilla que acabamos de crear.

Para ello debemos de navegar a la dirección dentro de la colección de sitios donde deseamos crear el sitio basado en la plantilla.  Allí ubicados siga los siguientes pasos:

1) Haga clic con permisos de Full-Control en el sitio donde desea crear el sub-sitio: La opción Site Actions y luego New Site.

2) Luego seleccione la categoria “Blank & Custom”.

image

3) Seleccione la plantilla CopiaSitio y luego seleccione el nombre del sitio y luego el URL.  Para finalizar presione el botón Create.

image

 

Si no deseamos que el contenido este disponible para otro administrador de otro sitio, deberemos eliminar la plantilla creada, el procedimiento es el siguiente:

1) En el sitio primario de la colección de sitios, haga clic en Site Actions, Site Settings.

2) En la sección Galleries seleccione la opción Solutions.

image

3) Seleccione la plantilla recién creada y luego seleccione la opción “Deactivate”

image

 

4) Una nueva ventana se levantará y luego seleccione “Deactivate” nuevamente

image

5) Seleccione nuevamente la plantilla desactivada y seleccione la opción Delete.

image

6) Confirme la eliminación presionando el botón Ok.

image

 

En este artículo vimos como podemos resolver el problema de copiar sitios desde la interfaz Web de SharePoint Foundation 2010 que es la versión básica de SharePoint para iniciarse en la plataforma.

 

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

jueves, 21 de junio de 2012

Procedimiento adecuado para eliminar los archivos avhd de una virtual de SharePoint en Hyper-V

La virtualización para servidores de SharePoint es una realidad hace algún tiempo y en Hyper-V es una realidad con alto rendimiento.  Pero es necesario que conozcamos algunas interioridades de Hyper-V para no provocar una disminución del rendimiento en el servidor de SharePoint y una inesperada situación de falta de espacio que pueden provocar problemas mas  serios.  Un Snapshot o Instantánea es una funcionalidad muy popular en el ambiente de virtualización pero como todo tiene sus pros y cons, por lo que revisaremos el adecuado mantenimiento de estos.

Los Snapshots nos permiten volver a un estado de la máquina a partir del momento en que se crearon pero inicia un proceso de actualización de la instantánea para que registre todos los cambios que tendrá que eliminar si encaso deseamos regresar a este momento, por lo que consumirá espacio en disco y recursos  de procesamiento en el proceso de actualización. 

Si eliminamos el SnapShot porque analizamos que no fue necesario recuperar el estado de la máquina en ese punto.  Esto lo podemos realizar desde Hyper-V Manager, pero al hacerlo y aunque visualmente ya no este en el Hyper-V Manager el proceso esta lejos de haber terminado.

Cada máquina virtual consta de dos conjuntos de Archivos uno para la definición de la máquina virtual y el otro conjunto que solamente es un archivo para el disco virtual de la máquina virtual donde realmente esta almacenado todo el contenido de la máquina virtual, Este archivo tiene extensión vhd de Virtual Hard Drive.  

Los archivos avhd son los snapshot que se han realizado y que aunque ya se hayan eliminado del Hyper-v Manager estos no desaparecen hasta que la máquina virtual este en estado Off, por lo que es necesario programar un mantenimiento y esperar que realice el proceso de Merge y convierta en un solo archivo.   Microsoft recomienda que no se eliminen directamente los archivos ya que seguramente sufrirá perdidas de información y posiblemente que ya no se pueda operar la máquina virtual.

Así que el procedimiento es apagar la máquina virtual hasta su estado OFF

 

image

Y los archivos que estan separados  y que ocupan espacio se convertirán en un solo por el espacio total definido en la virtual

image

El proceso pueda que demore algunos minutos en iniciar.  En la parte inferior izquierda luego de seleccionar la máquina virtual podrá apreciarse el proceso de merge o la cancelación del mismo.

image

 

Al finalizar debería quedar un solo archivo y el espacio liberado.   Además mejora el rendimiento ya que esto provoca una reducción del mismo debido a que debe mantener el estado de la máquina virtual a partir de la creación del Snapshot.

image

 

En este artículo vimos como liberar el espacio y mejorar el rendimiento desde la prespectiva de Hyper-V para un servidor de SharePoint el cual se creo en algún momento el Snapshot y se eliminó pero no se terminó el proceso adecuadamente hasta el momento que se colocó en estado de Apagado u Off para que iniciará el proceso de Merge o la cancelación del mismo y no se pierda información vital del estado de la máquina virtual.

VirtualiSharePoint4Fun!,

Juan Manuel Herrera Ocheita

domingo, 17 de junio de 2012

Automatización de la instalación de la búsqueda de contenido de PDF para SharePoint Server 2010

He extraído de SPAutoInstaler el script que automatiza el proceso de instalación del PDF para la inclusión de los contenidos del PDF en instalaciones existentes de SharePoint que no lo tengan instalados. 

El Script modificado solicita los siguientes parámetros:

param (

[string]$iFilter = "$(Read-Host '-ConfigureAdobeDPFiFilter [e.g. $true | $false]')"

,[string]$Icon = "$(Read-Host '-ConfigureAdobePDFIcon [e.g. $true | $false]')"

,[string]$MIMEType = "$(Read-Host '-ConfigureAdobePDFMIMEType [e.g. $true | $false]')"

,[string]$WebAppUrl = "$(Read-Host '-WebAppUrl [e.g. http://fqdn]')"

)

ConfigureAdobeDPFiFilter : El primer parámetro si se pasa el valor verdadero extraerá del sitio de Adobe Acrobat el Filtro y lo instala en el servidor, incluyendo la modificación en el registro de Windows .  También agrega la extensión del archivo en el servicio de Search.

ConfigureAdobePDFIcon : El segundo parámetro extrae el Icono del sitio de Adobe y lo agrega al archivo DOCICON.XML.

MIMEType y WebAppUrl :  Estos dos parámetros van juntos ya que es necesario agregar la Aplicación Web para agregar el MIMEType que permitirá abrir los documentos desde el navegador.

 

NOTA: Para ejecutar este script es necesario tener acceso a Internet para que automáticamente descargue los archivos y los instale.  Puede pasar un parámetro a la vez y revisar cada proceso que realiza o bien ejecutarlos todos a la vez.  La línea de comando a ejecutar es la siguiente, asumiendo que el script se nombre de la siguiente forma:  ConfigurePDFSearchAndIcon.ps1

c:\>.\ConfigurePDFSearchAndIcon.ps1 –ConfigureAdobeDPFiFilter $true –ConfigureAdobePDFIcon $false –ConfigureAdobePDFMIMEType $false –WebAppUrl http://miportal.miempresa.com

 

El resto del script es el siguiente:

function main()

{

# check if the SharePoint DLLs are installed

$snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}

if ($snapin -eq $null)

{

Write-Verbose "Loading SharePoint Powershell Snapin"

Add-PSSnapin "Microsoft.SharePoint.Powershell"

}

Write-Host -ForegroundColor White " - Configuring PDF file search, display and handling..."

$SharePointRoot = "$env:CommonProgramFiles\Microsoft Shared\Web Server Extensions\14"

$SourceFileLocations = @("$bits\PDF\","$bits\AdobePDF\","$env:TEMP\")

If ($iFilter -eq $true)

{

$PDFiFilterUrl = "http://download.adobe.com/pub/adobe/acrobat/win/9.x/PDFiFilter64installer.zip"

Write-Host -ForegroundColor White " - Configuring PDF file iFilter and indexing..."

# Look for the installer or the installer zip in the possible locations

ForEach ($SourceFileLocation in $SourceFileLocations)

{

If (Get-Item $($SourceFileLocation+"PDFFilter64installer.msi") -ErrorAction SilentlyContinue)

{

Write-Host -ForegroundColor White " - PDF iFilter installer found in $SourceFileLocation."

$iFilterInstaller = $SourceFileLocation+"PDFFilter64installer.msi"

Break

}

ElseIf (Get-Item $($SourceFileLocation+"PDFiFilter64installer.zip") -ErrorAction SilentlyContinue)

{

Write-Host -ForegroundColor White " - PDF iFilter installer zip file found in $SourceFileLocation."

$ZipLocation = $SourceFileLocation

$SourceFile = $SourceFileLocation+"PDFiFilter64installer.zip"

Break

}

}

# If the MSI hasn't been extracted from the zip yet then extract it

If (!($iFilterInstaller))

{

# If the zip file isn't present then download it first

If (!($SourceFile))

{

Write-Host -ForegroundColor White " - PDF iFilter installer or zip not found, downloading..."

If (Confirm-LocalSession)

{

$ZipLocation = $env:TEMP

$DestinationFile = $ZipLocation+"\PDFiFilter64installer.zip"

Import-Module BitsTransfer | Out-Null

Start-BitsTransfer -Source $PDFiFilterUrl -Destination $DestinationFile -DisplayName "Downloading Adobe PDF iFilter..." -Priority High -Description "From $PDFiFilterUrl..." -ErrorVariable err

If ($err) {Write-Warning " - Could not download Adobe PDF iFilter!"; Pause "exit"; break}

$SourceFile = $DestinationFile

}

Else {Write-Warning " - The remote use of BITS is not supported. Please pre-download the PDF install files and try again."}

}

Write-Host -ForegroundColor White " - Extracting Adobe PDF iFilter installer..."

$Shell = New-Object -ComObject Shell.Application

$iFilterZip = $Shell.Namespace($SourceFile)

$Location = $Shell.Namespace($ZipLocation)

$Location.Copyhere($iFilterZip.items())

$iFilterInstaller = $ZipLocation+"\PDFFilter64installer.msi"

}

Try

{

Write-Host -ForegroundColor White " - Installing Adobe PDF iFilter..."

Start-Process -FilePath "msiexec.exe" -ArgumentList "/i $iFilterInstaller /passive /norestart" -NoNewWindow -Wait

}

Catch {$_}

If ((Get-PsSnapin |?{$_.Name -eq "Microsoft.SharePoint.PowerShell"})-eq $null)

{

Write-Host -ForegroundColor White " - Loading SharePoint Powershell Snapin..."

$PSSnapin = Add-PsSnapin Microsoft.SharePoint.PowerShell

}

Write-Host -ForegroundColor White " - Setting PDF search crawl extension..."

$searchApplications = Get-SPEnterpriseSearchServiceApplication

If ($searchApplications)

{

ForEach ($searchApplication in $searchApplications)

{

Try

{

Get-SPEnterpriseSearchCrawlExtension -SearchApplication $searchApplication -Identity "pdf" -ErrorAction Stop | Out-Null

Write-Host -ForegroundColor White " - PDF file extension already set for $($searchApplication.DisplayName)."

}

Catch

{

New-SPEnterpriseSearchCrawlExtension -SearchApplication $searchApplication -Name "pdf" | Out-Null

Write-Host -ForegroundColor White " - PDF extension for $($searchApplication.DisplayName) now set."

}

}

}

Else {Write-Warning " - No search applications found."}

Write-Host -ForegroundColor White " - Updating registry..."

If ((Get-Item -Path Registry::"HKLM\SOFTWARE\Microsoft\Office Server\14.0\Search\Setup\Filters\.pdf" -ErrorAction SilentlyContinue) -eq $null)

{

$item = New-Item -Path Registry::"HKLM\SOFTWARE\Microsoft\Office Server\14.0\Search\Setup\Filters\.pdf"

$item | New-ItemProperty -Name Extension -PropertyType String -Value "pdf" | Out-Null

$item | New-ItemProperty -Name FileTypeBucket -PropertyType DWord -Value 1 | Out-Null

$item | New-ItemProperty -Name MimeTypes -PropertyType String -Value "application/pdf" | Out-Null

}

If ((Get-Item -Path Registry::"HKLM\SOFTWARE\Microsoft\Office Server\14.0\Search\Setup\ContentIndexCommon\Filters\Extension\.pdf" -ErrorAction SilentlyContinue) -eq $null)

{

$registryItem = New-Item -Path Registry::"HKLM\SOFTWARE\Microsoft\Office Server\14.0\Search\Setup\ContentIndexCommon\Filters\Extension\.pdf"

$registryItem | New-ItemProperty -Name "(default)" -PropertyType String -Value "{E8978DA6-047F-4E3D-9C78-CDBE46041603}" | Out-Null

}

##Write-Host -ForegroundColor White " - Restarting SharePoint Foundation Search Service..."

##Restart-Service SPSearch4

If ((Get-Service OSearch14).Status -eq "Running")

{

Write-Host -ForegroundColor White " - Restarting SharePoint Search Service..."

Restart-Service OSearch14

}

Write-Host -ForegroundColor White " - Done configuring PDF iFilter and indexing."

}

If ($Icon -eq $true)

{

$PDFIconUrl = "http://helpx.adobe.com/content/dam/kb/en/837/cpsid_83709/attachments/AdobePDF.png"

$DocIconFolderPath = "$SharePointRoot\TEMPLATE\XML"

$DocIconFilePath = "$DocIconFolderPath\DOCICON.XML"

Write-Host -ForegroundColor White " - Configuring PDF Icon..."

$pdfIcon = "AdobePDF.png"

If (!(Get-Item $SharePointRoot\Template\Images\$pdfIcon -ErrorAction SilentlyContinue))

{

ForEach ($SourceFileLocation in $SourceFileLocations)

{

# Check each possible source file location for the PDF icon

$CopyIcon = Copy-Item -Path $SourceFileLocation\$pdfIcon -Destination $SharePointRoot\Template\Images\$pdfIcon -PassThru -ErrorAction SilentlyContinue

If ($CopyIcon)

{

Write-Host -ForegroundColor White " - PDF icon found at $SourceFileLocation\$pdfIcon"

Break

}

}

If (!($CopyIcon))

{

Write-Host -ForegroundColor White " - `"$pdfIcon`" not found; downloading it now..."

Import-Module BitsTransfer | Out-Null

Start-BitsTransfer -Source $PDFIconUrl -Destination "$SharePointRoot\Template\Images\$pdfIcon" -DisplayName "Downloading PDF Icon..." -Priority High -Description "From $PDFIconUrl..." -ErrorVariable err

If ($err) {Write-Warning " - Could not download PDF Icon!"; Pause "exit"; break}

}

If (Get-Item $SharePointRoot\Template\Images\$pdfIcon) {Write-Host -ForegroundColor White " - PDF icon copied successfully."}

Else {Throw}

}

$xml = New-Object XML

$xml.Load($DocIconFilePath)

If ($xml.SelectSingleNode("//Mapping[@Key='pdf']") -eq $null)

{

Try

{

Write-Host -ForegroundColor White " - Creating backup of DOCICON.XML file..."

$backupFile = "$DocIconFolderPath\DOCICON_Backup.xml"

Copy-Item $DocIconFilePath $backupFile

Write-Host -ForegroundColor White " - Writing new DOCICON.XML..."

$pdf = $xml.CreateElement("Mapping")

$pdf.SetAttribute("Key","pdf")

$pdf.SetAttribute("Value",$pdfIcon)

$pdf.SetAttribute("EditText","Adobe Acrobat or Reader X")

$pdf.SetAttribute("OpenControl","")

$xml.DocIcons.ByExtension.AppendChild($pdf) | Out-Null

$xml.Save($DocIconFilePath)

Write-Host -ForegroundColor White " - Restarting IIS..."

iisreset

}

Catch {$_; Pause "exit"; Break}

}

}

If ($MIMEType -eq $true)

{

# Add the PDF MIME type to each web app so PDFs can be directly viewed/opened without saving locally first

# More granular and generally preferable to setting the whole web app to "Permissive" file handling

$MimeType = "application/pdf"

Write-Host -ForegroundColor White " - Adding PDF MIME type `"$MimeType`" web apps..."

$WebApp = Get-SPWebApplication -Identity $WebAppUrl

If ($WebApp.AllowedInlineDownloadedMimeTypes -notcontains $MimeType)

{

Write-Host -ForegroundColor White " - "$WebAppUrl": Adding "`"$MimeType"`"..." -NoNewline

$WebApp.AllowedInlineDownloadedMimeTypes.Add($MimeType)

$WebApp.Update()

Write-Host -ForegroundColor White "Done."

}

Else

{

Write-Host -ForegroundColor White " - "$WebAppUrl": "`"$MimeType"`" already added."

}

}

Write-Host -ForegroundColor White " - Done configuring PDF indexing and icon display."

}

Function Confirm-LocalSession

{

# Another way

# If ((Get-Process -Id $PID).ProcessName -eq "wsmprovhost") {Return $false}

If ($Host.Name -eq "ServerRemoteHost") {Return $false}

Else {Return $true}

}

#EndRegion

main

Inspirado en el buen trabajo de  AndrewWoody en el sitio de codeplex para automatizar el proceso de instalación de SharePoint extraje la instalación de PDF para realizarlo sobre instalaciones de SharePoint ya realizadas y facilitar la instalación.

Script4Fun,

Juan Manuel Herrera

domingo, 10 de junio de 2012

Nueva documentación de Microsoft Technet resuelve el problema: PerformancePoint Service is not configured correctly

La documentación actualizada el 16 de Abril del 2012 del sitio Microsoft Technet del artículo: Identity delegation for PerformancePoint Services (SharePoint Server 2010) revela importante información para resolver el error que en algunos casos reporta PerformancePoint Service cuando estamos utilizando Kerberos para delegar la identidad del usuario que esta accediendo las fuentes de datos a través de un reporte diseñado en Dashborad Designer.

Los cambios encontrados en esta nueva documentación comparada con SP2010 Kerberos Guide o Configuring Kerberos Authentication for Microsoft SharePoint 2010 Products es la siguiente:

1) El registro del servicio de PerformancePoint para la cuenta que ejecutará este servicio cambio de:

SETSPN -S SP/svcPPS vmlab\svcPPS

a

SETSPN -S SP/PPS vmlab\svcPPS

2) El  detalle de la pólitica de seguridad locald de la cuenta C2WTS para los servicios que requieren “Kerberos constrained delegation“ como lo son PerformancePoint y Excel Services, entre otros.  Abajo dicho detalle:



Next, configure the required local server permissions the C2WTS requires. You have to configure these permissions on each server the C2WTS runs on. In our example this is VMSP10APP01. Log onto the server and give the C2WTS the following permissions:


  1. Add the service account to the local Administrators Groups.
  2. In local security policy (secpol.msc) under user rights assignment give the service account the following permissions:

    1. Act as part of the operating system
    2. Impersonate a client after authentication
    3. Log on as a service

Con eso resolví el problema que me reportaba Dashboard Desiner cuando intentaba utilizar la opción “Per User Identity” en la definición de la autenticación de la fuente de datos.  Espero que también en su caso amigo lector pueda resolver el problema como a mí me sucedió también.


 


SharePoint4Fun!,


Juan Manuel Herrera Ocheita

viernes, 8 de junio de 2012

Script para la Creación en masa de colecciones de sitios con sus respectivas bases de datos de contenido individuales en PowerShell para SharePoint 2010

Dentro de las recomendaciones de Microsoft están el separar las colecciones de sitios en bases de datos de contenido separadas ayudan a la maniobrabilidad, recuperación, respaldo del contenido ingresado en el portal, ya que Microsoft ha definido un umbral para el tamaño de las bases de datos de contenido de 100 GB para no afectar el rendimiento y cómo máximo 200 GB si es una única colección de sitios dentro de la base de datos de contenido.  Este número debe de tomarse en cuenta incluyendo el contenido que el usuario ha eliminado y que esta aún en la papelera de reciclaje y que es controlado si hemos definido una cuota para la colección de sitios.

Una Aplicación Web puede hospedar hasta 300 bases de datos de contenido y por instancia de base de datos de SQL Server el número es de 50 base de datos y SharePoint Server Enterprise Edition consta de por lo menos 22 base de datos entre servicios, configuración y contenido por lo que tenemos alrededor de 28 base de datos por la instancia de SQL primaria que tengamos disponibles.  Por servidor Web el número es de 10 Application Pools para no afectar el rendimiento y esto se reparte en Servicios de Aplicación y Aplicaciones Web por lo que estamos tener alrededor de 5 Aplicaciones Web en cada servidor Web Front End disponible.   Esta información pueden verificarla en http://technet.microsoft.com/en-us/library/cc262787.

Como vemos se debe de planear cuidadosamente la creación de las bases de datos de contenido y sus colecciones, por lo que es necesario automatizar esta tarea luego de contar con la distribución adecuada para crear la bases y colecciones.  En el siguiente ejemplo vamos a realizar un script para automatizar este proceso y facilitar la creación de bases y colecciones. 

Escenario:

Se deben de crear bases y colecciones para las aplicaciones desarrolladas para SharePoint con la plantilla de sitios en blanco.  El formato de la dirección URL para cada sitio debe de ser el siguiente: https://FQDN/app/[site collection name] donde app el la ruta administrada para indicar donde inician las colecciones de sitios.  El listado de aplicaciones es el siguiente:

· Ventas

· Monitoreo de rutas

· Monitoreo de Indicadores Claves de Gestión

· Cambio de contraseñas

· Automatización de Formularios

· Recursos Humanos

· Portal Corporativo

· Reuniones

Solución:

Creación de dos scripts para automatizar el proceso de creación de base y colecciones.  El primer script ejecutará los dos comandos necesarios para crear la base y colección de recibir los parámetros necesarios para crear lo requerido.  Veamos el código del script:

# Principio del script SiteCreation.ps1-----

# Los parametros a recibir

param (
     [string]$WebApplication = "$(Read-Host 'Enter the Url [e.g.http://hostname]')"
     ,[string]$ManagedPath = "$(Read-Host 'Enter the Managed Path [e.g. /sites/]')"
     ,[string]$SiteName = "$(Read-Host 'Enter the Site Name [e.g. sales]')"
     ,[string]$Title = "$(Read-Host 'Enter the Site Title [e.g. Control of Sales]')"
     ,[string]$PrimaryOwner = "$(Read-Host 'Enter the Primary Owner [e.g. domainname\username]')"
     ,[string]$SecondaryOwner = "$(Read-Host 'Enter the Secondary Owner [e.g. domianname\username]')"
 
)

# La función que ejecutará la creación de bases y colecciones
function main()
{

    # Valida si esta cargado el Snapin de SharePoint
    $snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}
    if ($snapin -eq $null)
    {
      Write-Verbose "Loading SharePoint Powershell Snapin"
      Add-PSSnapin "Microsoft.SharePoint.Powershell"
    }

   #  Valida si fueron enviado todos los parametros

    if ( $WebApplication -ne $null -and $ManagedPath -ne $null -and $SiteName -ne $null -and $PrimaryOwner -ne $null -and $SecondaryOwner -ne $null -and $Title -ne $null)
    {

      # Construye el nombre de la base de contenido con el parámetro $SiteName
     
  $DatabaseName = "WSS_Content_" + $SiteName
     

      # Construye la dirección URL con el formato
     
  $FullUrl = $WebApplication + $ManagedPath + $SiteName
     # Lenguaje de la colección de sitios
    
   $Language = 1033

        Write-Host $DatabaseName

        Write-Host $FullUrl

        # Crea la base de datos de contenido cuidando que no exceda el número deseado de colecciones de sitios que es de uno.

        New-SPContentDatabase -Name $DatabaseName -WebApplication $WebApplication -MaxSiteCount 1 -WarningSiteCount 0 | out-null
       # Crea la colección de sitios con la plantilla de sitio en blanco STS#1 en la base de datos de contenido arriba creada con el titulo del sitio $Title y definiendo los dueños primario y segundario   
        New-SPSite -Url $FullUrl -Template "STS#1" -ContentDatabase $DatabaseName -Name $Title  -owneralias $PrimaryOwner -SecondaryOwnerAlias $SecondaryOwner -Language $Language | out-null
    }
}


main

# Fin del Script ------

El segundo script ejecutará la colección de instrucciones para las diferentes aplicaciones, echémosle un vistazo:

#Inicio del Script BulkSiteCreation.ps1 ---

Start-Transcript c:\configuracion\bulksitecreation.log

.\sitecreation.ps1 -WebApplication https://miportal.midominio.com -ManagedPath /app/ -SiteName MICG -Title "Monitoreo de Indicadores Claves de Gestión" -PrimaryOwner midomio\miusuario -SecondaryOwner midominio\otrousuario
.\sitecreation.ps1 -WebApplication https://miportal.midominio.com -ManagedPath /app/ -SiteName CHGPWD -Title "Cambio de Contraseñas" -PrimaryOwner infowareguate\spadmin -SecondaryOwner midominio\otrousuario
.\sitecreation.ps1 -WebApplication https://miportal.midominio.com -ManagedPath /app/ -SiteName AUTOFORMS -Title "Automatización de Formularios" -PrimaryOwner midomio\miusuario -SecondaryOwner midominio\otrousuario
.\sitecreation.ps1 -WebApplication https://miportal.midominio.com -ManagedPath /app/ -SiteName PortalCorp -Title "Porta Corporativo" -PrimaryOwner midomio\miusuario -SecondaryOwner midominio\otrousuario
.\sitecreation.ps1 -WebApplication https://miportal.midominio.com -ManagedPath /app/ -SiteName RRHH -Title "Portal de Recursos Humanos" -PrimaryOwner midomio\miusuario -SecondaryOwner midominio\otrousuario
.\sitecreation.ps1 -WebApplication https://miportal.midominio.com -ManagedPath /app/ -SiteName Reuniones -Title "Gestión de Reuniones" -PrimaryOwner midomio\miusuario -SecondaryOwner midominio\otrousuario

Stop-Transcript

#Fin del Script BulkSiteCreation.ps1

Nota:  Este proceso consume recursos del servidor, por lo que es recomendado ejecutarlo en un horario inhábil o bien programar la tarea para que se ejecute de noche una sola vez.

En este artículo vimos primero la importancia de planificar la distribución del contenido a través de la creación de base de datos de contenido y sus colecciones de sitios  para no impactar el rendimiento y mantener la maniobrabilidad en el respaldo y recuperación del contenido adecuados conociendo de antemano los límites y fronteras recomendadas por Microsoft para la plataforma de SharePoint.

 

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

lunes, 4 de junio de 2012

Moviendo un sub-sitio a una colección de sitios

Esta necesidad es imperante cuando el bases de datos de contenido de SharePoint alcanzan su tamaño optimo que es 100 GB o máximo para una sola colección de sitios dentro de la base de datos de 200 GB, para ambientes de intranet de colaboración.

Mas información sobre estos límites en: http://technet.microsoft.com/en-us/library/cc262787.aspx#Boundaries

En este artículo planteo como trasladar un sitio a una nueva colección de sitios que este en una nueva base de datos de contenido.
El procedimiento a realizar el el siguiente:
1) Crear una copia de respaldo del sitio que deseamos migrar
2) Crear una nueva base de datos de contenido donde vamos a depositar el contenido migrado
3) Crear un sitio con la misma plantilla de la copia de respaldo del sitio que se desea migrar.
3) Restaurar la copia de respaldo del sitio en la nueva ubicación
4) Validar que el contenido este subido y haya respetado los permisos.
5) Eliminar el contenido que fue migrado para liberar espacio en la base de datos de contenido.

En este ejemplo existe un sitio llamado MiEmpresa el cual será trasladado a una nueva colección de sitios dentro de una nueva base de datos de contenido.
image
Donde dicho sitio esta ubicado en la base de datos de contenido WSS_Content_Portal y esta contiene 5 sitios colecciones de sitios; con lo cual esperamos al final tener en la nueva base de datos de contenido una nueva colección de sitios también.
image
Para extraer la información vamos utilizar el comando de SharePoint Management Shell Export-SPWeb de la siguiente forma:
Export-SPWeb -Identity http://demosp2010/miempresa -path c:\temp\miempresa.cmp -IncludeUserSecurity -IncludeVersions All
Esto generó 3 archivos y al revisar el log se puede validar que no hubieron inconvenientes y podemos proseguir con el procedimiento.
image

Ahora vamos a crear la nueva base de datos de contenido y lo vamos hacer con la línea de comando New-SPContentDatabase de la siguiente forma:
New-SPContentDatabase -Name WSS_Content_MiEmpresa -WebApplication http://demosp2010
El Mensaje de una operación exitosa debería ser similar al de abajo:

Id               : 997aa020-1f9a-4e19-92b8-a0b8435cdb9d
Name             : WSS_Content_MiEmpresa
WebApplication   : SPWebApplication Name=SharePoint - 80
Server           : demosp2010
CurrentSiteCount : 0
Desde el CA podemos ver en la sección Manage Content Database la nueva base de datos de contenido recién creada con ninguna colección de sitios aún.
image
Ahora vamos a crear la colección de sitios en la nueva base de datos de contenido.  Esto lo vamos hacer con el comando New-SPSite de la siguiente forma:
New-SPSite -url http://demosp2010/sitios/miempresa -owneralias "demo\administrator" -Template "STS#0" -ContentDatabase WSS_Content_MiEmpresa
Nota: Donde –url es la url de la nueva colección de sitios.  /sitios/ es una ruta administrada o Managed Path para indicarle a SharePoint donde inicia la colección de sitios. La plantilla “STS#0” Equivale a la plantilla de sitio de Equipo, y por ultimo indicamos el nombre de la base de datos de contenido donde va hacer creada esta colección.
El mensaje final luego de ejecutar este comando es el siguiente:
Url
---
http://demosp2010/sitios/miempresa
image
Ahora vamos a importar el contenido sobre esta nueva colección de sitios.  Esto lo vamos hacer con el comando Import-SPWeb de la siguente manera:
Import-SPWeb -Identity http://demosp2010/sitios/miempresa -path c:\temp\miempresa.cmp -force -includeusersecurity -UpdateVersions Overwrite
Nota: Debemos indicarle el parámetro –force ya que es necesario que sobreescriba sobre el contenido que se creo con la plantilla de equipo.
Si revisamos el log validamos si no hubieron errores.  Que en este ejemplo solo finalizamos con una advertencia, con lo que podemos dar como éxito la migración.
image
Si vemos el sitio ahora tiene la apariencia del sitio que decidimos migrar.
image
Nota: Hay un elemento web indicando error pero esto se debe a que esta apuntando a otro lado y como no es parte del contenido, no hay mayor problema de que preocuparse.  En en este caso si deseáramos corregirla solo debemos corregir hacia donde esta apuntando o bien eliminar el elemento Web si ya no lo deseamos.
Por ultimo vamos a eliminar el sitio anterior para liberar el espacio deseado. Eso lo vamos hacer con la línea de comando Remove-SPWeb de la siguiente manera:
Remove-SPWeb -Identity http://demosp2010/miempresa
Pero surge que esta sitio tiene sub-sitios por lo que no podemos eliminarlo de una sola vez.  El mensaje que desplegó al ejecutar el comando es el siguiente:
Confirm
Are you sure you want to perform this action?
Performing operation "Remove-SPWeb" on Target "http://demosp2010/miempresa".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):y
Remove-SPWeb : Error deleting Web site "/miempresa". You can't delete a site th
at has subsites.
At line:1 char:13
+ Remove-SPWeb <<<<  -Identity http://demosp2010/miempresa
    + CategoryInfo          : InvalidData: (Microsoft.Share...CmdletRemoveWeb:
   SPCmdletRemoveWeb) [Remove-SPWeb], SPException
    + FullyQualifiedErrorId : Microsoft.SharePoint.PowerShell.SPCmdletRemoveWe
   b
Para conocer que sub-sitios están debajo del sitio a eliminar ejecutamos la siguientes líneas:
$web = get-spweb http://demosp2010/miempresa
$webs = $web.GetSubwebsForCurrentUser()
foreach($miweb in $webs) {write-host $miweb.url}
El resultado es el siguiente:
http://demosp2010/miempresa/MiBlog
http://demosp2010/miempresa/MyBlog
Podemos crear un script para eliminarlos todos o bien hacerlo uno por uno como lo hare con las siguientes líneas ya que son pocos
Remove-SPWeb -Identity http://demosp2010/miempresa/miblog -confirm:$false
Remove-SPWeb -Identity http://demosp2010/miempresa/myblog -confirm:$false
Remove-SPWeb -Identity http://demosp2010/miempresa -confirm:$false
Si vemos las base de contenido observaremos que WSS_Content_MiEmpresa ya tiene una colección de sitios.
image
Eso es todo amigos!.
En este artículo vimos como migrar un sub-sitio a una nueva colección de sitios y esta dentro de una nueva base de datos de contenido, con el propósito de liberar el espacio en la base de datos de contenido existente.
Los comandos que utilizamos para realizar esta tarea fueron:
Export-SPWeb
New-SPContentDatabase
New-SPSite
Import-SPWeb
Remove-SPWeb
Get-SPWeb

SharePoint4Fun!,
Juan Manuel Herrera Ocheita