Mostrando las entradas con la etiqueta PowerShell para SharePoint 2010. Mostrar todas las entradas
Mostrando las entradas con la etiqueta PowerShell para SharePoint 2010. Mostrar todas las entradas

martes, 8 de agosto de 2017

Buenas practicas para desarrollo de soluciones en SharePoint

Una de las buenas practicas para cuando iniciamos una solución en SharePoint no importa la versión es crear una colección de sitios para dicha solución y esta con su bases de datos de contenido,  Esto permitirá que sea portable la solución desarrollada.

Para realizar esto debemos hacer lo siguiente:

1) Crear la base de datos de contenido
2) Crear la colección de sitios para la base de datos nueva

Como buen desarrollador prefiero utilizar la línea de comando que la interfaz de usuario.  Así que aquí les va en línea de comando:

Crear la base de datos de contenido

PS C:\Users\Administrator> Mount-SPContentDatabase -Name WSS_Content_ArchivoDigi
tal -WebApplication http://sp2013bi

---resultado ----
Id               : 47b71298-e23c-421b-bb6a-5e65428b8a4d
Name             : WSS_Content_ArchivoDigital
WebApplication   : SPWebApplication Name=SharePoint - 80
Server           : sp2013bi\powerpivot
CurrentSiteCount : 0

Crear la colección de sitios para la base de datos nueva

PS C:\Users\Administrator> New-SPSite -Url http://sp2013bi/sites/ADigital -Langu
age 1033 -Template STS#0 -Name "Archivo Digital" -OwnerAlias "Administrator" -Co
ntentDatabase WSS_Content_ArchivoDigital -Verbose

---resultado---
VERBOSE: Leaving BeginProcessing Method of New-SPSite.
VERBOSE: Performing operation "New-SPSite" on Target
"http://sp2013bi/sites/ADigital".

Url                                                     CompatibilityLevel
---                                                     ------------------
http://sp2013bi/sites/ADigital                          15
VERBOSE: Leaving ProcessRecord Method of New-SPSite.
VERBOSE: Leaving EndProcessing Method of New-SPSite.



Ayudas:

Para revisar las plantillas para la colección de sitios ejecutar el comando:
get-SPWebTemplate


Name                 Title                                    LocaleId   Compat
                                                                         ibilit
                                                                         yLevel
----                 -----                                    --------   ------
GLOBAL#0             Global template                          1033       15
STS#0                Team Site                                1033       15
STS#1                Blank Site                               1033       15
STS#2                Document Workspace                       1033       15
MPS#0                Basic Meeting Workspace                  1033       15
MPS#1                Blank Meeting Workspace                  1033       15
MPS#2                Decision Meeting Workspace               1033       15
MPS#3                Social Meeting Workspace                 1033       15
MPS#4                Multipage Meeting Workspace              1033       15
CENTRALADMIN#0       Central Admin Site                       1033       15
WIKI#0               Wiki Site                                1033       15
BLOG#0               Blog                                     1033       15
SGS#0                Group Work Site                          1033       15
TENANTADMIN#0        Tenant Admin Site                        1033       15
APP#0                App Template                             1033       15
APPCATALOG#0         App Catalog Site                         1033       15
ACCSRV#0             Access Services Site                     1033       15
ACCSVC#0             Access Services Site Internal            1033       15
ACCSVC#1             Access Services Site                     1033       15
BDR#0                Document Center                          1033       15
DEV#0                Developer Site                           1033       15
DOCMARKETPLACESITE#0 Academic Library                         1033       15
EDISC#0              eDiscovery Center                        1033       15
EDISC#1              eDiscovery Case                          1033       15
OFFILE#0             (obsolete) Records Center                1033       15
OFFILE#1             Records Center                           1033       15
OSRV#0               Shared Services Administration Site      1033       15
PPSMASite#0          PerformancePoint                         1033       15
BICenterSite#0       Business Intelligence Center             1033       15
SPS#0                SharePoint Portal Server Site            1033       15
SPSPERS#0            SharePoint Portal Server Personal Space  1033       15
SPSPERS#2            Storage And Social SharePoint Portal ... 1033       15
SPSPERS#3            Storage Only SharePoint Portal Server... 1033       15
SPSPERS#4            Social Only SharePoint Portal Server ... 1033       15
SPSPERS#5            Empty SharePoint Portal Server Person... 1033       15
SPSMSITE#0           Personalization Site                     1033       15
SPSTOC#0             Contents area Template                   1033       15
SPSTOPIC#0           Topic area template                      1033       15
SPSNEWS#0            News Site                                1033       15
CMSPUBLISHING#0      Publishing Site                          1033       15
BLANKINTERNET#0      Publishing Site                          1033       15
BLANKINTERNET#1      Press Releases Site                      1033       15
BLANKINTERNET#2      Publishing Site with Workflow            1033       15
SPSNHOME#0           News Site                                1033       15
SPSSITES#0           Site Directory                           1033       15
SPSCOMMU#0           Community area template                  1033       15
SPSREPORTCENTER#0    Report Center                            1033       15
SPSPORTAL#0          Collaboration Portal                     1033       15
SRCHCEN#0            Enterprise Search Center                 1033       15
PROFILES#0           Profiles                                 1033       15
BLANKINTERNETCONT... Publishing Portal                        1033       15
SPSMSITEHOST#0       My Site Host                             1033       15
ENTERWIKI#0          Enterprise Wiki                          1033       15
PROJECTSITE#0        Project Site                             1033       15
PRODUCTCATALOG#0     Product Catalog                          1033       15
COMMUNITY#0          Community Site                           1033       15
COMMUNITYPORTAL#0    Community Portal                         1033       15
SRCHCENTERLITE#0     Basic Search Center                      1033       15
SRCHCENTERLITE#1     Basic Search Center                      1033       15
visprus#0            Visio Process Repository                 1033       15
GLOBAL#0             Global template                          1033       14
STS#0                Team Site                                1033       14
STS#1                Blank Site                               1033       14
STS#2                Document Workspace                       1033       14
MPS#0                Basic Meeting Workspace                  1033       14
MPS#1                Blank Meeting Workspace                  1033       14
MPS#2                Decision Meeting Workspace               1033       14
MPS#3                Social Meeting Workspace                 1033       14
MPS#4                Multipage Meeting Workspace              1033       14
CENTRALADMIN#0       Central Admin Site                       1033       14
WIKI#0               Wiki Site                                1033       14
BLOG#0               Blog                                     1033       14
SGS#0                Group Work Site                          1033       14
TENANTADMIN#0        Tenant Admin Site                        1033       14
ACCSRV#0             Access Services Site                     1033       14
ACCSRV#1             Assets Web Database                      1033       14
ACCSRV#3             Charitable Contributions Web Database    1033       14
ACCSRV#4             Contacts Web Database                    1033       14
ACCSRV#6             Issues Web Database                      1033       14
ACCSRV#5             Projects Web Database                    1033       14
BDR#0                Document Center                          1033       14
OFFILE#0             (obsolete) Records Center                1033       14
OFFILE#1             Records Center                           1033       14
OSRV#0               Shared Services Administration Site      1033       14
PPSMASite#0          PerformancePoint                         1033       14
BICenterSite#0       Business Intelligence Center             1033       14
SPS#0                SharePoint Portal Server Site            1033       14
SPSPERS#0            SharePoint Portal Server Personal Space  1033       14
SPSMSITE#0           Personalization Site                     1033       14
SPSTOC#0             Contents area Template                   1033       14
SPSTOPIC#0           Topic area template                      1033       14
SPSNEWS#0            News Site                                1033       14
CMSPUBLISHING#0      Publishing Site                          1033       14
BLANKINTERNET#0      Publishing Site                          1033       14
BLANKINTERNET#1      Press Releases Site                      1033       14
BLANKINTERNET#2      Publishing Site with Workflow            1033       14
SPSNHOME#0           News Site                                1033       14
SPSSITES#0           Site Directory                           1033       14
SPSCOMMU#0           Community area template                  1033       14
SPSREPORTCENTER#0    Report Center                            1033       14
SPSPORTAL#0          Collaboration Portal                     1033       14
SRCHCEN#0            Enterprise Search Center                 1033       14
PROFILES#0           Profiles                                 1033       14
BLANKINTERNETCONT... Publishing Portal                        1033       14
SPSMSITEHOST#0       My Site Host                             1033       14
ENTERWIKI#0          Enterprise Wiki                          1033       14
SRCHCENTERLITE#0     Basic Search Center                      1033       14
SRCHCENTERLITE#1     Basic Search Center                      1033       14
SRCHCENTERFAST#0     FAST Search Center                       1033       14

visprus#0            Visio Process Repository                 1033       14

SharePoint4fun!,

Juan Manuel Herrera O.

lunes, 9 de enero de 2017

Una línea de comando de PowerShell sencilla pero poderosa en su contenido SharePoint 2010,2013,2016

Distribuir contenido es de vital importancia, pero cuando son muchas las bases de datos y colecciones de sitios creadas al restaurar una granja se complica saber donde esta la colección de sitios, por lo que es importanet que contenmos con un listado de las aplicaciones web, sus colecciones y base de datos de contenido.
 
Cuando creamos de cero una granja y deseamos montar manualmente las base de datos de contenido, es importante saber cual es la base de datos de contenido que tiene la colección de sitios primaria ya que esta debe de restaurarse de primera instancia. 

También es importante cuando el contenido esta distribuído que base de datos de contendio tiene la colección de sitios que deseamos restaurar.




El comando deberá ejecutarse desde un servidor de SharePoint desde SharePoint Management Shell.  Y la línea de comando  es la siguiente:

Get-spsite -Limit all | select url, webapplication, contentdatabase | Export-Csv e:\infoware\listados\ColeccionesSitios.csv -NoTypeInformation

Url WebApplication ContentDatabase
http://miportal SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content
http://miportal/logistica SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_DataCross
http://miportal/portales SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Portales
http://miportal/sites/permisos SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Search_Center
http://miportal/sites/apps SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=SharePoint_OC
http://miportal/sites/capacitacion SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=SharePoint_OC
http://miportal/sites/inversiones SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Inversiones
http://miportal/sites/seguridad SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content
http://miportal/sites/Proyectos SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_ProyectosIT
http://miportal/sites/prueba_EC SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Esthela_Prueba
http://miportal/sites/search SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Search_Center
http://miportal/sites/sharedspace SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_SharedSpace
http://miportal/sites/temp SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content
http://miportal/sites/temporal SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_ProyectosIT
http://miportal/sitios/rrhh SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=SharePoint_OC
http://miportal/sitios/prueba3 SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Esthela_Prueba
http://miportal/sitios/test SPWebApplication Name=SharePoint - 80 SPContentDatabase Name=WSS_Content_Portales
http://miportal:21387/sites/prueba SPWebApplication Name=Aplicacion Prueba SPContentDatabase Name=WSS_Content_PRUEBA
http://miportal:21387/sites/prueba2 SPWebApplication Name=Aplicacion Prueba SPContentDatabase Name=WSS_Content_PRUEBA
http://miportal:21387/sites/prueba3 SPWebApplication Name=Aplicacion Prueba SPContentDatabase Name=WSS_Content_PRUEBA
http://miportal:24301/sites/prueba SPWebApplication Name=Sitio Federado SPContentDatabase Name=WSS_Content_SITIOFEDERADO

En este ejemplo ficticio vemos que la base de datos de contenido primaria se llama WSS_Content.


Esta será la primera que debemos de montar a través del comando

mount-SPContentDatabase -Name Wss_Content -url http://miportal

Para más información sobre el comando puede utilizar la siguiente línea de comando:

get-help mount-SPContentDatabase -full

Eso esto por este artículo.

SharePoint4Fun!,

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

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

martes, 17 de abril de 2012

Script para permitir a las bibliotecas abrir los archivos PDFS en SharePoint 2010

Esta opción esta bloqueada en SharePoint 2010 de forma predeterminada y a pesar que habilitemos a nivel de Aplicación Web el navegador de manejo de archivos a permisivo, esto solo funcionará para las bibliotecas del sitio primario de la colección de sitios, pero no para las bibliotecas de otros sub-sitios, ya que SharePoint 2010 tiene a nivel interno de cada biblioteca esta opción definida como estricta y no permisiva.

Al final hay que habilitar cada biblioteca en la colección de sitios la opción “browserfilehandling” como permisiva, para ello necesitamos ejecutar un script a nivel de línea de comando apoyados en powershell.

Un agradecimiento por su contribución a la comunidad de SharePoint a Kim Nguyen en:  http://www.freakingsharepoint.com/2010/08/sp2010-forces-users-to-save-pdfs.html

Lo que hice, fue modificar un poco el script para que funcione para cualquier colección de sitios y para que valide que la lista siempre sea un documento library.

Para ejecutar el script sugiero creen un archivo ps1 como por ejemplo:

ChangePermissiveOptionInLibs.ps1

La sintaxis es la siguiente:

.\ChangePermissiveOptionInLibs.ps1 –siteurl http://yoursitecollectionAddress

Y el script es el siguiente:

# Inicio del Script

param (
     [string]$siteUrl = "$(Read-Host 'Enter the Site Collection URL. [e.g. http://sp2010vm]')"
 
)
 
function main() {
 
# check to ensure Microsoft.SharePoint.PowerShell is loaded
  $snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}
  if ($snapin -eq $null)
{
   Write-Host "Loading SharePoint Powershell Snapin"
   Add-PSSnapin "Microsoft.SharePoint.Powershell"
  }
 
$site = Get-SPSite($siteUrl)
write-host $siteurl

  foreach ($web in $site.AllWebs)
  { 
       write-host "web:" $web.Title
    foreach ($list in $web.Lists)
    {
        write-host "list:" $list.Title $list.BaseType
        if ($list.BaseType -eq "DocumentLibrary")
        {
 
            write-host "browserfilehandling:" $list.browserfilehandling
            if($list.browserfilehandling -eq "Strict")
            {
            $list.browserfilehandling = "Permissive";
            $list.update();
            write-host $site.url, $list.title, $list.browserfilehandling
            }
        }
    } 
  }


$site.Dispose()
 
}
 
main

# Fin del Script

 

En este artículo vimos como habilitar la opción para permitir el manejo de archivos en el navegador que esta bloqueada de forma predeterminada en SharePoint 2010.  Esto aunque representa un riesgo, es una funcionalidad habitual que los usuarios de SharePoint están acostumbrados a utilizar y que desean este disponible en el portal.

Enable4Fun!,

Juan Manuel Herrera Ocheita

martes, 27 de marzo de 2012

Creando un archivo csv con la plantilla utilizada en todos los sitios con una sola línea en PowerShell para SharePoint 2010

Es muy útil en el proceso de migración listar las plantillas utilizadas en cada sitio para ubicar posibles errores de plantillas que no están instaladas o que no serán migradas.

Podemos utilizar el poder de PowerShell para SharePoint 2010 para en una sola línea generar un archivo csv que luego podemos filtrar en excel.  Veamos la línea de comando:

get-spsite http://yousitecolleccion_ulr | get-spweb -limit all | select -property title , url ,webtemplate  | export-csv plantillas.csv

Desglosemos y expliquemos que esta haciendo:

1) Instanciamos en memoria la colección de sitios

get-spsite http://yousitecolleccion_ulr

2) Del objeto instanciado en memoria solicitamos todos sus sitios web

| get-spweb -limit all

3) De cada sitio web queremos consultar las propiedades title, url y webtemplate

| select -property title , url ,webtemplate

4) Escriba el resultado en un archivo separados por comas y comillas

| select -property title , url ,webtemplate

Luego en Excel podemos abrir el archivo y seleccionar autofiltro y filtar la columna que deseemos, como se muestra a continuación:

image

Eso es todo, PowerShell4Fun!,

Juan Manuel Herrera Ocheita

viernes, 24 de febrero de 2012

Cómo programar un script de PowerShell para SharePoint 2010 para que se ejecute periódicamente

El problema:

Necesitamos realizar una tarea de mantenimiento periódicamente en el portal de SharePoint 2010, sin requerir mucho esfuerzo administrativo y que sea automático.

Solución:

Realizar un script que ejecute de lado del servidor en el Front-End de SharePoint 2010 y se ejecute periódicamente asistido por el Task Scheduler de Windows.

Para ello vamos a crear una tarea de Windows que se ejecute periódicamente y para ello necesitamos crear un archivo de lotes con extensión .bat para que el Task Scheduler lo ejecute el contenido de este archivo de lotes debe ser el siguiente:

C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe  c:\Directorio\MiScriptSharePoint2010.ps1

El script debe de validar si tiene el snap-in de SharePoint habilitado para ello escriba dentro del archivo ps1 la siguiente instrucción:

$snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}
if ($snapin -eq $null)
{
  Write-Host "Loading SharePoint Powershell Snapin"
  Add-PSSnapin "Microsoft.SharePoint.Powershell"
}

El procedimiento para crear una tarea en el Task Scheduler de Windows Server 2008 r2 es muy intuitivo y esta documentado por todas partes por lo que no lo voy a documentar en el artículo.  Aquí uno de estos enlaces: http://allcomputers.us/windows_server/windows-server-2008-r2--task-scheduler.aspx

Recomendación:

Para evidenciar que el script se ejecutó y realizó la operación requerida registre en un archivo log.  Para ello utilice Start-Transcript para iniciar el registro del log y Stop-Transcript para finalizarlo.  Para registrar cada evento utilice Write-Host.

Ejemplo:

Start-Transcript [ruta del archivo log]

Write-Host (“Mensaje”+Variable)

Stop-Transcript

El Script completo puede ver se de la siguiente forma:

image

Si quiere saber mas del propósito de este Script vea el siguiente artículo: http://jmhogua.blogspot.com/2012/02/script-de-power-shell-de-sharepoint.html .

La tarea en el Task Scheduler puede lucir similar a la siguiente imagen:

image

En esta ocasión revisamos el procedimiento para programar una tarea que se ejecuta periódicamente y nos apoya en una labor de mantenimiento para el servidor SharePoint 2010.

SharePointJust4Fun!,

Manolo Herrera

jueves, 27 de octubre de 2011

PowerShell para SharePoint 2010: Como sacar una copia de los web.config de las Aplicaciones Web de nuestra granja

He estado trabajando en la automatización del mantenimiento de los servidores de la granja de SharePoint 2010, y surgió la necesidad de sacar una copia de respaldo de estos archivos que guardan llaves de configuración, cadenas de conexión y otras configuraciones especificas de la instalación de SharePoint, por ello decidí utilizar PowerShell para SharePoint para automatizar esta tarea la cual la explico en las siguientes líneas:

get-ChildItem -recurse c:\inetpub\wwwroot\wss\virtualdirectories -include *.config

Esta línea de comando nos permitirá obtener todas las rutas de los archivos con extensión .config.   utilizamos el signo pipa para agregar otro comando relacionado con el anterior.

foreach{$ruta = get-itemproperty  $_.pspath;write-host $ruta }

La línea de arriba obtendrá la propiedad pspasth de cada línea que devuelva get-ChildItem y la desplegará (para ello utilizamos write-host) y el loop foreach para recorrer cada elemento obtenido de get-ChildItem.  Ahora vamos agregar luego de ruta a través de “;” otra línea para reemplazar el valor de la variable $ruta por el destino donde deseamos ubicar la copia de los archivos.

$destino = $ruta -replace "inetpub\\wwwroot\\wss\\virtualdirectories","migracion\reporte";

Coloqué doble \\ para que pudiese encontrar y reemplazar el valor. El valor de reemplazo no es necesario el doble \\.

$destino = $destino -replace "c:","f:";$directorio = $destino -replace "\web.config","";write-host $destino;

Ahora vamos a reemplazar el drive lógico por el del destino y por ultimo eliminar el nombre de archivo que no lo vamos a necesitar. Por último mandamos a imprimir el valor para asegurarnos que fue reemplazado con éxito.

new-item -itemType Directory -path $directorio -force ;copy-item $ruta -destination $destino –force;

Esta última línea va a crear la estructura de directorio deseado y luego copia el valor de la variable $ruta al destino que estuvimos preparando. 

La línea de comando completa es la siguiente:

get-ChildItem -recurse c:\inetpub\wwwroot\wss\virtualdirectories -include *.config | foreach{$ruta = get-itemproperty  $_.pspath;write-host $ruta ;$destino = $ruta -replace "inetpub\\wwwroot\\wss\\virtualdirectories", "migracion\reporte";$destino = $destino -replace "c:","f:";$directorio = $destino -replace "\web.config","";write-host $destino; new-item -itemType Directory -path $directorio -force ;copy-item $ruta -destination $destino -force }

En este artículo vimos como automatizar la copia de los achivos web.config de las aplicaciones web de los servidores front-end de SharePoint 2010.

SharePoint4Fun!,

Juan Manuel Herrera