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
viernes, 29 de enero de 2016
Como migrar el contenido de un sitio de WordPress a las bibliotecas de SharePoint Online
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#Instanciamos el Web Site que vamos acceder
$Context = New-Object Microsoft.SharePoint.Client.ClientContext($Url)
$Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName,$SecurePassword)
$Context.Credentials = $Credentials
$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
}
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.
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



