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

No hay comentarios.: