Micro publicaciones guía para Power Apps, Power Automate, SharePoint y ademas algunos temas de Azure Dev Ops, Desarrollo Web, SQL Server, Asp.net.
martes, 8 de agosto de 2017
Buenas practicas para desarrollo de soluciones en SharePoint
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
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 = 1033Write-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\otrousuarioStop-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 $siteurlforeach ($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:
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:
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:
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.
Juan Manuel Herrera
