Mostrando las entradas con la etiqueta PowerShell para SharePoint 2013. Mostrar todas las entradas
Mostrando las entradas con la etiqueta PowerShell para SharePoint 2013. 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





viernes, 29 de enero de 2016

Como migrar el contenido de un sitio de WordPress a las bibliotecas de SharePoint Online

La estrategia es muy sencilla y va ser la siguiente:
1) Descargar el contenido a un almacenamiento local a través de una herramienta FTP.
2) Definir una estrategia para almacenar el contenido en SharePoint Online
2) Crear un Script que lea el contenido migrado y suba los archivos a bibliotecas de SharePoint.
La herramienta
Describamos un poco la herramienta llamada FileZila.   Esta herramienta de FTP es gratuita y esta disponible para los sistemas operativos más populares.   Lo mas importante si estamos en un entrono Windows es que vamos a poder acceder el contenido de WordPress que esta en Linux.
El enlace para descargar la herramienta es el siguiente: https://filezilla-project.org/ 
Veamos ahora la conexión hacia el servicio ftp


La información que debes de solicitar para hacer la conexión es la siguiente:
Dirección IP del servidor Linux
Puerto (Opcional solo si el cliente utiliza un puerto en especifico diferente el predeterminado [21] colocarlo allí).
Luego Las credenciales un usuario con acceso y una contraseña.
Seleccionamos lo que deseamos descargar y con el clic derecho del ratón seleccionamos la opción Download.


La estrategia
Para la estrategia vamos a crear bibliotecas por cada carpeta principal ya que en SPO hay un límite de despliegue de documentos de 5,000 por razones de rendimiento.  Por lo que debemos de tomar eso en cuenta.








Para reducir el trabajo en el script vamos a crear manualmente las bibliotecas porque tampoco son muchas en mi este caso de lo contrario deberíamos tomar eso en cuenta en el script y crear con comandos de Powershell las bibliotecas.



El Script
A través de este script invocamos los comandos de CSOM Client SharePoint Object Model y no el Modelo de objetos de SharePoint.   Porque razón?, bueno porque SharePoint Online no esta local sino en la nube y la forma de acceder remotamente las librerias de SharePoint es através de CSOM que no es mas que llamadas de servicios Web por medio de un módelo de objetos definido para ese propósito.

Ahora vemos el script que hace la magia:
/* Cargamos las librerias de CSOM */
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

/* El método Ensure_Folder nos asegurará que la carpeta este creada antes de copiar el contenido */
Function Ensure-Folder()
{
Param(
  [Parameter(Mandatory=$True)]
  [Microsoft.SharePoint.Client.Web]$Web,

  [Parameter(Mandatory=$True)]
  [Microsoft.SharePoint.Client.Folder]$ParentFolder,

  [Parameter(Mandatory=$True)]
  [String]$FolderUrl

)
    $folderNames = $FolderUrl.Trim().Split("/",[System.StringSplitOptions]::RemoveEmptyEntries)
    $folderName = $folderNames[0]
    Write-Host "Creating folder [$folderName] ..."
    $curFolder = $ParentFolder.Folders.Add($folderName)
    $Web.Context.Load($curFolder)
    $web.Context.ExecuteQuery()
    Write-Host "Folder [$folderName] has been created succesfully. Url: $($curFolder.ServerRelativeUrl)"

    if ($folderNames.Length -gt 1)
    {
        $curFolderUrl = [System.String]::Join("/", $folderNames, 1, $folderNames.Length - 1)
        Ensure-Folder -Web $Web -ParentFolder $curFolder -FolderUrl $curFolderUrl
    }
}

/* El método Upload-File  recibe como parametros el url relativo de la carpeta destino y la ubicación local del archivo */
Function Upload-File()
{
Param(
  [Parameter(Mandatory=$True)]
  [Microsoft.SharePoint.Client.Web]$Web,

  [Parameter(Mandatory=$True)]
  [String]$FolderRelativeUrl,

  [Parameter(Mandatory=$True)]
  [System.IO.FileInfo]$LocalFile

)
    try {
     $folderUrl = $LocalFile.Name.ToLower().Replace($SourceFolderPath.ToLower(),"")
    
     $fileUrl = $FolderRelativeUrl + "/" + $folderUrl

       write-host "FileUrl:" $fileUrl
       Write-Host "Uploading file [$($LocalFile.FullName)] ..."
       [Microsoft.SharePoint.Client.File]::SaveBinaryDirect($Web.Context, $fileUrl, $LocalFile.OpenRead(), $true)
       Write-Host "File [$($LocalFile.FullName)] has been uploaded succesfully. Url: $fileUrl"
    }
    catch {
       write-host "An error occured while uploading file [$($LocalFile.FullName)]"
    }
}

/* El método Upload-Files es la principal ya que localiza cata archivo local y define la url destino para subir el archivo  a SPO.  Este método recibe como parameto la url destino, el usuario de O365, la contraeña, el nombre de la biblioteca de SharePoint destino, y la rutal local donde esta ubicado el contenido.  Como es recursivo solo debemos de dar el punto de partida de donde deseamos iniciar la carga de información. */

function Upload-Files()
{

Param(
  [Parameter(Mandatory=$True)]
  [String]$Url,

  [Parameter(Mandatory=$True)]
  [String]$UserName,

  [Parameter(Mandatory=$False)]
  [String]$Password,

  [Parameter(Mandatory=$True)]
  [String]$TargetListTitle,

  [Parameter(Mandatory=$True)]
  [String]$SourceFolderPath

)
    if($Password) {
       $SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force
    }
    else {
      $SecurePassword = Read-Host -Prompt "Enter the password" -AsSecureString
    }

# Abajo la autenticación a O365 para acceder los objetos de SharePoint Online
    $Context = New-Object Microsoft.SharePoint.Client.ClientContext($Url)
    $Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName,$SecurePassword)
    $Context.Credentials = $Credentials
    #Instanciamos el Web Site que vamos acceder
    $web = $Context.Web
    $Context.Load($web)

    # Instanciamos la biblioteca destino
    $list = $web.Lists.GetByTitle($TargetListTitle);
    $Context.Load($list.RootFolder)

#Ejecutamos el conjunto de lineas anteriores
    $Context.ExecuteQuery()
#Recorremos cada directorio local del parametró de ruta origen que indicamos al ejecutar el método

    Get-ChildItem $SourceFolderPath -Recurse | % {
       if ($_.PSIsContainer -eq $True) {
          $folderUrl = $_.FullName.ToLower().Replace($SourceFolderPath.ToLower(),"")
          $folderUrl = $folderUrl.Replace("\","/").Replace(".","")  
          if($folderUrl) {
             Ensure-Folder -Web $web -ParentFolder $list.RootFolder -FolderUrl $folderUrl
          } 
       }
       else{

          # Basado en la ubicación local creamos un Url Relativo reciproco en la biblioteca de SPO
          $folderRelativeUrl = $list.RootFolder.ServerRelativeUrl + $_.DirectoryName.ToLower().Replace($SourceFolderPath.ToLower(),"").Replace("\","/").Replace(".","") 

          #Ejecutamos el métod que subira el archivo a la ruta destino
          Upload-File -Web $web -FolderRelativeUrl $folderRelativeUrl -LocalFile $_
       }
    }
}

#End of file
La ejecución
Para ejecutar el archivo uploadfiles-csom.ps1 deberemos declarar los siguientes parámetros:

$Url =
https://miempresa.sharepoint.com/sites/miSitio
$UserName = misuario@midominio.onmicrosoft.com
$Password = "******"
$TargetListTitle = "BibliotecaDestino"   #Target Library
$SourceFolderPath = "X:\www\data\uploads\CarpetaOrigen"  #Source Physical Path


#Comando
Upload-Files -Url $Url -UserName $UserName -Password $Password -TargetListTitle $TargetListTitle -SourceFolderPath $SourceFolderPath


Y eso es todo amigos.
Hasta la próxima, SharePoint4Fun!
Juan Manuel Herrera Ocheita

jueves, 8 de enero de 2015

Script en PowerShell para actualizar correo y puesto del perfil de usuario

Con la tendencia mundial de migración hacia la nube y en especial a Office 365, la migración de dominios que estén listos para Office 365 es uno de los caminos a seguir, pero en este proceso de migración pueden salir las cosas mal, por ello he escrito un Script en PowerShell para que actualice la propiedad de WorkEmail y Title (o sea Puesto) en el servicio de Perfiles de Usuario, basado en un archivo CSV con el objetivo de corregir algún error que se haya efectuado o bien porque no se han migrado aún los correos al nuevo dominio pero es necesario que sigan funcionando las alertas de SharePoint con la cuenta de correo anterior… Bueno y lo del puesto no sería necesario si se sincroniza, pero si se desea hacer una rápida actualización de un puñado de usuarios de esta propiedad sin necesidad de sincronizar todos los usuarios, es una solución práctica.

Como el Script se basa en un archivo CSV vamos a describir el formato de este archivo.

Formato del Archivo CSV

El formato CSV es un archivo de texto que tiene en su primera línea contiene el nombre de cada columna como parte del encabezado y se separa por una coma. Luego cada línea siguiente representa una fila y se separa igualmente por comas

Los nombres de las columnas del archivo CSV deben de tener por lo menos las siguientes:

NewAccount: Es la cuenta de usuario. Ejemplo: DOMINIO\NOMBRE_USUARIO

Title: El Puesto del usuario. Ejemplo: NOMBRE DEL PUESTO

Email: EL correo del usuario. Ejemplo: nombre_usuario@dominio.com

Un ejemplo del contenido de un archivo es el siguiente

NewAccount,Title,Email

DOMINIO\NOMBRE_USUARIO,Nombre del Puesto,nombre_usuario@dominio.com

El Script

 

#Primera línea de archivo UpdateUPAProperties.ps1

#Primero solicitaremos dos parámetros; $archivoEntrada = Que es la ruta de la ubicación del archivo csv y $misitioUrl que la URL de My Site. 

param (
    [string]$archivoEntrada , [string]$miSitioUrl
)

#Valida si fue ingresado el parámetro $archivoEntrada, sino le asigna un valor predeterminado para pruebas
if ($archivoEntrada -eq $null -or $archivoEntrada -eq "")
{
    $archivoEntrada = "E:\Infoware\Scripts\PruebaActualizaPropiedadesPerfilUsuario.csv"

    Write-Host "No ha recibido parametro archivoEntrada"
}

#Valida si fue ingresado el parámetro $miSitioUrl sino le asigna uno predeterminado
if ($miSitioUrl -eq $null -or $miSitioUrl -eq ""){
    $miSitioUrl = http://misitio.dominio.com
}

#Se Cargan las librerias de SharePoint para ejecutar la actualización de los perfiles de usuario

if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {
    Add-PSSnapin Microsoft.SharePoint.PowerShell;
}
[reflection.assembly]::Loadwithpartialname("Microsoft.Office.Server.Search") | out-null
[reflection.assembly]::Loadwithpartialname("Microsoft.Office.Server") | out-null

#Se Carga en memoria el Administrador de Perfiles de Usuario para ello es necesario la url que solicitamos en el parámetro e instanciar en memoria la colección de sitios y el sitio principal de MySite.
$site=Get-SPSite $miSitioUrl
$web=$site.RootWeb
$serverContext=[Microsoft.Office.Server.ServerContext]::GetContext($site)
$upm=New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($serverContext)


# Ahora cargaremos en memoria como una tabla el archivo CSV
$FileExists = (Test-Path $archivoEntrada -PathType Leaf)
if ($FileExists) {
   "Loading $archivoEntrada for processing..."
   $listadoUsuarios = Import-CSV $archivoEntrada
} else {
   "$archivoEntrada not found - stopping import!"
   exit
}

#El objetivo de esta función es actualizar el valor de la propiedad del perfil de usuario en cuestión

function set-SPProfileProperty([string]$propertyName, [string]$val, $up)
{

        #Validamos que no venga el perfil de usuario nulo
         if($up -ne $null)
        {

            #Obtenemos la propiedad por su nombre
            $property = $up.Properties.GetPropertyByName($propertyName)

     #Validamos que no si hayamos obtenido la propiedad


            if (-not [System.String]::IsNullOrEmpty($property))
            {
                $up[$propertyName].value = $val;
                $up.Commit();
                write-host "Actualizo la propiedad " $propertyName " con el valor" $val -ForegroundColor yellow
            }
        }
 
    Write-Host "Done" -foregroundcolor green
}

#Recorremos la tabla en memoria del archivo CSV

foreach ($row in $listadoUsuarios)
{
   $loginName = $row.NewAccount

   #Validamos que obtuvimos la columna NewAccount que trae la cuenta del usuario
   if( $loginName)
   {
        #validamos que el usuario exista en los perfiles de usuario
        if($upm.UserExists($loginName)){

            #Obtenemos el Perfil del Usuario
            $up = $upm.GetUserProfile($loginName);

            #Validamos que hayamos obtenido el perfil del usuario
            if($up) {
                $Puesto = $row.Title
                $Correo = $row.email       

                    #Si la columna Title trae valor invocamos la función para que modifique la propiedad en UPA
                    if($Puesto) {
                        set-SPProfileProperty -propertyName "Title" -val $Puesto -up $up
                
                    }

                   #Si la columna Corre trae valor invocamos la función para que modifique la propiedad en UPA

                    if($Correo) {
                        set-SPProfileProperty -propertyName "WorkEmail" -val $Correo -up $up
                    }
            }    
        }else
        {
            Write-Host "Usuario no existe " $loginName -ForegroundColor Red
        }
   }
}


Write-Host "End of file"
# Fin del archivo ps1

Procedimiento de Ejecución

Para ejecutar el Script puede utilizar PowerShell de Windows 3.0 o bien la consola de administración de SharePoint 2013.  Abajo una imagen que muestra como ejecutar el Script desde una ubicación predeterminada.

image

Bueno amigos espero les sirva el Scrip como lo hizo conmigo.

Hasta la próxima!… SharePoint4Fun!,

Juan Manuel Herrera Ocheita

miércoles, 31 de diciembre de 2014

Script para migrar Usuarios de cubos de dominio para una implementación de Inteligencia de Negocios en SharePoint

 

Introducción

En la edición Enterprise de SharePoint 2013 tenemos herramientas de inteligencia de negocios disponibles para exponer o desplegar la información de los cubos multidimensionales o tabulares en tableros de control mostrando indicadores de rendimiento o KPI´S, reportes, gráficos de todo tipo.  En la versión 2013 de SharePoint todas las herramientas de Excel como PowerPivot, PowerView, PowerQuery y otras más están disponibles para ser desplegada en un navegador o browser como lo es Internet Explorer, Chrome y Safari.   Típicamente cuando se implementa una solución así si implementa también Kerberos que es un protocolo de autenticación basado en reclamos o claims, donde hace posible que la identidad del usuario que se autentica en el portal de SharePoint no pierda su identidad sino que esta pueda ser pasada a otros servicios y servidores como lo es el Servidor de base de datos SQL Server y uno de sus servicios Analysis Services que nos sirve para procesar y construir los cubos multidimensionales y tabulares también.  Entonces cuando migramos los usuarios de dominio estos usuarios que están asignados a los roles de los cubos para mostrar solo aquellas dimensiones y medidas deseas es necesario adicionarlos a estos roles de los cubos que están disponibles y consumiéndose a través de Excel, SharePoint y Reporting Services, entre otros.   Por ello realizaremos un script en PowerShell para adicionar los usuarios del dominio anterior que se hayan migrado al dominio nuevo.

 

NOTA: En otro artículo veremos como migrar los permisos dentro de SharePoint de los usuarios del dominio anterior al actual, pero este no es el objetivo del artículo sino enfocarnos en los usuarios asignados a los roles de los cubos de Microsoft SQL Server Analysis Services o SSAS.

Objetivo

El siguiente script adiciona basado en un archivo CSV los usuarios a los roles de un cubo en específico. Para ejecutar el script ese necesario ejecutar PowerShell en modo administrador y pasar como parámetro la ruta del archivo CSV y el servidor y el nombre de la instancia de Analysis Services donde se encuentra el cubo.

 

FORMATO DEL ARCHIVO CSV

El formato CSV es un archivo de texto que tiene en su primera línea contiene el nombre de cada columna como parte del encabezado y se separa por una coma. Luego cada línea siguiente representa una fila y se separa igualmente por comas

Los nombres de las columnas del archivo CSV deben de tener por lo menos las siguientes:

o BASE DE DATOS

o ROL

o USUARIO

El usuario debe de estar en el siguiente formato: DOMINIO\USUARIO, se reemplazara el dominio ANTERIOR por el nuevo DOMINIO. 

Ejemplo:

BASE DE DATOS,ROL, USUARIO

ZZ SIB PRUEBAS DOMINIO,Rol Analista,DOMINIO_ANTERIOR\nombre_usuario1

ZZ SIB PRUEBAS DOMINIO,Rol Analista,DOMINIO_ANTERIOR\nombre_usuario2

NOTA: Si el archivo CSV contiene más columnas de las esperadas esto no importa, lo importante es que existan las columnas que esta esperando el script.

EL SCRIPT

#definimos los parametros que recibirá el archivio de extensión ps1 que contendrá el siguiente código

param (
    [string]$archivoEntrada , [string] $servidorBaseDatos
)
 
if ($archivoEntrada -eq $null)
{
    $archivoEntrada = "F:\work\migracion-dominio\PruebasCubos3.csv"
    Write-Host "No ha recibido parametro archivoEntrada"
    #break
}
if ($servidorBaseDatos -eq $null){
    $servidorBaseDatos = "DELLLATITUDE8\TESTING"
    Write-Host "No ha recibido parametro servidorBaseDatosEinstanciaSQL"
    #break

}

# El siguiente comando solo debe de ejecutarse una primera vez para habilitar en la computadora la ejecución de script de forma remota
#Set-ExecutionPolicy RemoteSigned
# Esto se debe ejecutar cada vez que ejecute el script en powershell
#Import-Module sqlps -DisableNameChecking

$archivo = Import-Csv $archivoEntrada

[System.reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices")
$svr = new-Object Microsoft.AnalysisServices.Server


#AQUI VA LA MAGIA HACE UNA CONEXION AL SERVIDOR Y A LA INSTACIA NO PREDETERMINADA SINO NOMBRADA DE SSAS
$svr.Connect($servidorBaseDatos)

#Vamos a recorrer cada línea del archivo para adicionar dichos usuarios en los cubos y roles indicados en el archivo

ForEach ($item in $archivo){

    $usuario= $item.USUARIO   
    $usuarioNuevo=$usuario

    # VAMOS A REEMPLAZAR EL VALOR DE LA COLUMNA USUARIO LA PARTE DEL DOMINIO ANTERIOR POR LA ACTUAL LA CUAL SERA ADICIONADA EN EL ROL
    $usuarioNuevo=$usuario -replace "DOMINIO_ANTERIOR" , "DOMINIO_ACTUAL"   
    $basedatos = $item."BASE DE DATOS"
    $role = $item.Rol

        # VALIDAMOS QUE CADA COLUMNA REQUERIDA NO VENGA NULA O VACIA
        if($usuarioNuevo -ne $null -and $basedatos -ne $null -and $role -ne $null)
        {      

        #RECORREMOS LAS BASES DE DATOS DISPONIBLES EN LA CONEXION HACIA EL SERVIDOR DE SSAS QUE HICIMOS ARRIBA
        foreach ($db in $svr.Databases)
        {                       

            # COMPARAMOS EL NOMBRE DE LA BASE DE DATOS  DEL SERVIDOR CON LA DEL ARCHIVO
            If ($db.Name.ToLower() -eq $basedatos.ToLower())
                {

                # RECORREMOS TODOS LOS ROLES PARA COMPARARLOS CON LOS DEL ARCHIVIO
                foreach ($roles in $db.Roles)
                  {                   

                 # COMPARAMOS EL NOMBRE DEL ROL DE LA BASE DE DATOS  DEL SERVIDOR CON LA DEL ARCHIVO

                    if( $roles.Name.ToLower() -eq $role.ToLower())
                    {
                        $usuarioExiste = $false

                        # RECORREMOS CADA MIEMBRO DENTRO DEL ROL

                        foreach ($member in $roles.Members)
                                {                           

                                   # COMPARAMOS EL NOMBRE DEL USUARIO DEL ROL CON EL DEL ARCHIVO
                                    if ($member.Name.ToLower() -eq $usuarioNuevo.ToLower())
                                    {

                                           #ACTUALIZAMOS LA VARIABLE $usuarioExiste que luego nos servirá para realizar la actualización o no del usuario dentro del rol
                                            $usuarioExiste=$true
                                    }                           
                                }
                        if( $usuarioExiste -eq $true ){

                            # SI EL USUARIO EXISTE DESPLEGAREMOS UN MENSAJE EN LA CONSOLA QUE YA EXISTE
                            "Usuario "+ $usuarioNuevo +" ya existe"
                        }
                        else{

                            # SINO EXISTE EL USUARIO ENTONCES ADICIONAMOS EL USUARIO AL ROL
                            $roles.Name
                            $roles.Members.Add($usuarioNuevo)
                            $roles.Update()

                            # SI le da un error el función Update() valide cada usuario de la lista  ya que en ocasiones da error un usuario y este de replica en el resto no importando si esta bien el resto de usuarios debe de validar que el usuario en le nuevo dominio exista esto puede hacerlo intentando dar permisos a una carpeta en el servidor con el usuario del nuevo dominio.


                            "Usuario "+$usuarioNuevo+" agregado al Rol "+$roles.Name
                        }
                    }
                }
            }
        }
        }
}

 

Procedimiento

1. Levantar una sesión remota al servidor NOMBRE_SERVIDOR (Puede ejecutar el mstsc y d ebe tener credenciales para ingresar de modo remoto)

2. Ejecutar PowerShell como administrador en el Servidor de SQL Server 2012

3. Posicionarse en la carpeta d:\scripts

4. Ejecutar el script addUsersToRole.ps1 pasándole como parámetro el archivo donde se encuentran los usuarios a agregar script y el servidor y la instancia de Analysis Services donde se encuentran los cubos:

5. .\AddUsrsToRole.ps1 –archivoEntrada “\.Pruebas con cubos solo cubo de prueba.csv” –servidorBaseDatos SERVIDOR\NOMBRE_INSTANCIA_NO_DEFAULT

 

Bueno amigos, eso es todo por hoy en este artículo vimos como adicionar usuarios a los roles de cubos que son expuestos en SharePoint 2013 en un servidor de Analysis Services que tiene una instancia nombrada y no la predeterminada basado en un archivo separado por comas o CSV que contiene la información de la base de datos, el cubo, el rol y el usuario del dominio anterior que se adicionará como el nuevo.

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

sábado, 11 de octubre de 2014

Total de sub-sitios en SharePoint 2013 en una sola línea de comando con PowerShell

A veces necesitamos un comando rápido que nos de algo tan sencillo como el total de sub-sitios en SharePoint data una dirección URL en una sola línea de comando.  Abajo les muestro la línea de comando:

((Get-SPWeb “http://hostname/site1/site2”).Site).AllWebs.count

Eso es todo amigos.   Si desea algo más elaborado y que no requiera el SharePoint Management Shell sino la consola standard de PowerShell puede ser algo como le muestro abajo:

Add-PSSnapin “Microsoft.SharePoint.PowerShell” –ErrorAction SilentlyContinue

$url = Read-Host “Ingrese la URL del sitio padre: ”

((Get-SPWeb $url).Site).AllWebs.count

Eso es todo amigos fácil y rápido.

SharePoint4Fun!,

Juan Manuel Herrera Ocheita