Uso de Windows PowerShell para administrar SharePoint Online

 

Última modificación del tema: 2015-03-09

Resumen: Use Windows PowerShell para administrar Office 365 mediante cmdlets, scripts y procesos por lotes de Windows PowerShell.

SharePoint Online se puede administrar mediante los cmdlets de SharePoint Online. (¿Lo ve? No todos los nombres de software son crípticos y oscuros). En su estado actual, la implementación de SharePoint Online de Windows PowerShell está limitada de algún modo: solo hay 30 cmdlets disponibles para los administradores de Office 365 y, en este momento, no puede usar Windows PowerShell para administrar cosas como SkyDrive Pro, búsquedas de SharePoint Online, el almacén de términos de SharePoint Online, perfiles de usuario, etc. ¿Significa eso que no hay razón para usar Windows PowerShell para administrar SharePoint Online? No nos apresuremos demasiado. Hay varias partes importantes de SharePoint Online que no solo se pueden administrar mediante Windows PowerShell, sino que se pueden administrar sumamente bien mediante Windows PowerShell.

Uso de Windows PowerShell para administrar SharePoint Online

En este tema se describen los siguientes temas:

  • Trabajar con sitios de SharePoint Online

  • Trabajar con usuarios de SharePoint Online

  • Trabajar con grupos de sitio de SharePoint Online

  • Una nota rápida sobre el cmdlet ForEach-Object

Para obtener más información sobre el uso de Windows PowerShell para administrar SharePoint Online, tal vez quiera echar un vistazo a la referencia del cmdlet de SharePoint Online, una serie de temas de ayuda disponibles aquí.

Y no olvide estos dos artículos, comprobación completa de los comandos útiles de Windows PowerShell para SharePoint Online:

Trabajar con sitios de SharePoint Online

¿Podríamos dar un ejemplo de un área relacionada con SharePoint Online que se pueda administrar mediante Windows PowerShell? Claro que sí. Un aspecto en el que Windows PowerShell realmente sobresale es en la ayuda a identificar un subconjunto de sus sitios de SharePoint Online. En organizaciones grandes, no es raro tener decenas de sitios, quizás incluso cientos o miles de sitios. ¿Hay algo malo en ello? Claro que no. Pero supongamos que tiene varios cientos de sitios y desea saber cuántos son wikis; en otras palabras, quiere saber cuántos de sus sitios se crean con la plantilla wiki empresarial (una plantilla que, oficialmente, recibe el nombre de ENTERWIKI #0). ¿Puede encontrar esta información usando el Centro de administración de SharePoint Online? No le vamos a decir que no se puede encontrar esta información de ese modo, pero no será fácil. Y definitivamente no será tan fácil como ejecutar este comando de Windows PowerShell:

Get-SPOSite | Where-Object {$_.Template -eq "ENTERWIKI#0"}

En otras palabras, usamos el cmdlet Get-SPOSite para devolver información sobre todos nuestros sitios y, después, usamos el cmdlet Where-Object para elegir solo aquellos sitios donde la propiedad de plantilla es igual a ENTERWIKI#0.

Nota

¿Cómo supimos que el nombre oficial de la plantilla wiki empresarial es ENTERWIKI#0? Es fácil: simplemente ejecutamos este comando:
Get-SPOWebTemplate

O tal vez desee una lista de todos los sitios que tienen una cuota de almacenamiento superior a 1000 megabytes o inferior a 250 megabytes. ¿Es posible hacerlo rápida y fácilmente con Windows PowerShell? Claro que sí:

Get-SPOSite | Where-Object {$_.StorageQuota -gt 1000 -or $_.StorageQuota -lt 250}

Esa es una consulta un poco más complicada que algunas de las que hemos visto hasta ahora, pero una vez que conoce la jerga no debería tener problemas para entender cómo funciona. En este ejemplo, estamos buscando sitios que cumplan 1 de 2 criterios. Que bien el sitio: 1) tenga una cuota de almacenamiento superior a (-gt) 1000 megabytes; o bien (-or), 2) tenga una cuota de almacenamiento inferior a (-lt) 250 megabytes. Supongamos que tenemos 4 sitios:

Sitio Cuota de almacenamiento

Sitio A

180

Sitio B

700

Sitio C

300

Sitio D

1500

Con estos datos de ejemplo, se devolverá el sitio A porque tiene una cuota de almacenamiento inferior a 250. También se devolverá el sitio D, porque tiene una cuota de almacenamiento superior a 1000. Los sitios B y C no cumplen ninguno de los criterios, por lo que no se devolverán.

Imaginemos otro escenario, solo para divertirnos. Supongamos que quiere tener una lista de todos los sitios que no pertenecen al administrador; es decir, todos los sitios donde el propietario es igual a una persona distinta de, en nuestro ejemplo, admin@litwareinc.onmicrosoft.com. El comando es tan fácil que casi da vergüenza:

Get-SPOSite | Where-Object {$_.Owner -ne "admin@litwareinc.onmicrosoft.com"}

Pero el hecho de que sea fácil no significa que no sea útil, ¿verdad?

Trabajar con usuarios de SharePoint Online

Windows PowerShell es una herramienta extremadamente útil para trabajar con usuarios de sitios de SharePoint Online. Para empezar, puede usar Windows PowerShell y el cmdlet Get-SPOUser para devolver una lista de todos los usuarios a los que se les ha concedido acceso a un sitio. Es fácil:

Get-SPOUser -Site "https://litwareinc.sharepoint.com/sites/finance"

Lo único que tiene que hacer es llamar a Get-SPOUser seguido de la dirección URL del sitio que le interesa.

O bien, si quiere que solo los usuarios (y no los grupos) tengan acceso a un sitio web, puede usar este comando:

Get-SPOUser -Site "https://litwareinc.sharepoint.com/sites/finance" | Where-Object {$_.IsGroup -eq $False}

También es fácil: simplemente pedimos los usuarios del sitio donde la propiedad IsGroup se establece en False. (En Windows PowerShell, se usa $True y $False al escribir comandos en lugar de True y False como siempre).

Es tan fácil como devolver solamente los usuarios que son administradores de sitio; es decir, los usuarios donde la propiedad IsSiteAdmin es True:

Get-SPOUser -Site "https://litwareinc.sharepoint.com/sites/finance" | Where-Object {$_.IsSiteAdmin -eq $True}

Pero eso es para un solo sitio. El poder de Windows PowerShell (por así decirlo) suele observarse cuando se trabaja con varios objetos: por ejemplo, con varios sitios. Por ejemplo, es bueno tener una lista de todos los usuarios que tienen acceso a un sitio determinado. ¿Pero qué pasa si es al revés? ¿Qué pasa con una lista de todos los sitios a los que un solo usuario tiene acceso? ¿Es posible hacerlo con Windows PowerShell? Claro que sí. Este es un pequeño script sencillo (cierto, sencillo para aquellos que tienen algo de experiencia en Windows PowerShell) que devuelve los nombres de todos los sitios a los que un usuario determinado (en este ejemplo, Ken Myer) tiene acceso:

$x = (Get-SPOSite).Url

foreach ($y in $x)
    {
        $z = $Null
        $z = Get-SpoUser -Site $y | Where-Object {$_.DisplayName -eq "Ken Myer"}
        if ($z -ne $Null) {$y}
    }

Nota

¿Cómo se usa un script en Windows PowerShell? Así: copie el código anterior, péguelo en el Bloc de notas (u otro editor de texto) y después guarde el archivo con una extensión de archivo .ps1 (por ejemplo, C:\Scripts\SitiosALosQueUnUsuarioPuedeAcceder.ps1). Para ejecutar el script, use Windows PowerShell para conectarse a SharePoint Online. Luego, en el símbolo del sistema de Windows PowerShell, escriba la ruta de acceso al archivo .ps1 y presione ENTRAR:
C:\Scripts\SitiosALosQueUnUsuarioPuedeAcceder.ps1

¿Y se puede obtener una lista de todos los sitios y los administradores de cada uno de esos sitios? Esa información se puede devolver usando un solo comando:

Get-SPOSite | ForEach-Object {Write-Host $_.Url; Get-SPOUser -Site $_.Url | Where-Object {$_.IsSiteAdmin -eq $True}}

Debería obtener algo similar a esto:

https://litwareinc.sharepoint.com/sites/communities
MOD Administrator  admin@litwareinc.com {Communities Members, Comm...}
Sara Davis  sarad@litwareinc.com {Communities Members, Communities...}

https://litwareinc.sharepoint.com/sites/finance
MOD Administrator admin@litwareinc.com {Excel Services Viewers, Hi...}

https://litwareinc.sharepoint.com/sites/hr
MOD Administrator  admin@litwareinc.com   {Contoso Beta Members, C...}

Es cierto que no son los resultados más bonitos del mundo, pero está de más decir que el aspecto no es lo importante. Y a medida que obtenga más experiencia y se vuelva más hábil con Windows PowerShell, aprenderá a personalizar los resultados de maneras muy diversas.

Lo mejor de todo es que Windows PowerShell no es solo un método para recuperar cosas: también es un método para configurar cosas. ¿Dice que tiene varios cientos de sitios y necesita hacer que Ken Myer sea administrador de cada uno de ellos? Tan solo tenía que preguntar cómo hacerlo:

Get-SPOSite | ForEach-Object {Set-SPOUser -Site $_.Url -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True}

Interesante, ¿verdad?

Trabajar con grupos de sitio de SharePoint Online

No se preocupe: no nos hemos olvidado de los grupos de sitio. Windows PowerShell es, de hecho, una buena forma de administrar los grupos de sitio de SharePoint. El Centro de administración de SharePoint Online cuenta con algunos métodos muy sencillos para administrar los grupos de sitio, pero obtener acceso a ellos puede ser algo complicado. Imaginemos, por ejemplo, que quiere buscar el sitio https://litwareinc.com/sites/finance en los grupos y en los miembros del grupo. Esto es lo que debe hacer:

  1. En la pestaña colecciones de sitios del Centro de administración de SharePoint Online, haga clic en el nombre del sitio.

  2. En el cuadro de diálogo propiedades de colección de sitios, haga clic en el vínculo que abre https://litwareinc.com/sites/finance.

  3. En la página del sitio, haga clic en el icono Configuración (situado en la esquina superior derecha de la página) y, después, haga clic en Configuración del sitio:

    Opción Configuración de sitio de SharePoint Online.

  4. En la página Configuración del sitio, haga clic en Sitios y permisos.

Y, así, repita el proceso con el siguiente sitio que quiera ver.

¿Hay otra manera de obtener una lista de todos los grupos, con sus usuarios correspondientes, de un sitio determinado? Sí, hay al menos otra manera:

$x = Get-SPOSiteGroup -Site "https://litwareinc.com/sites/finance"

foreach ($y in $x)
    {
        Write-Host $y.Title -ForegroundColor "Yellow"
        Get-SPOSiteGroup -Site "https://litwareinc.com/sites/finance" -Group $y.Title | Select-Object -ExpandProperty Users
        Write-Host
    }

Admitámoslo: este script es algo más complejo que la mayoría que los comandos que hemos explicado aquí hasta el momento. Y también es un poco lioso: hay que copiar el código, pegarlo en el Bloc de notas (o cualquier otro editor de texto), guardar el archivo con la extensión .ps1 (C:\Scripts\SitiosGruposYUsuarios.ps1, por ejemplo) y, finalmente, ejecutar el script en Windows PowerShell. Con todo, el proceso es algo más laborioso, como hemos dicho. Al fin y al cabo, ejecutar el script conlleva básicamente escribir la ruta de acceso completa al archivo. ps1:

C:\Scripts\SiteGroupsAndUsers.ps1

De modo que sí, esto conlleva un poco más de trabajo. Pero a cambio de esa mínima cantidad de trabajo, esto es lo que obtenemos:

Grupos de sitio y miembros de grupos de sitio.

Esos son todos los grupos que se han creado para el sitio https://litwareinc.com/sites/finance, así como todos los usuarios asignados a esos grupos (y, solo por mostrar un poco, hemos destacado los nombres de grupo en amarillo para ayudarle a mantener los grupos y sus listas de pertenencia por separado).

Si cree que esto ya es estupendo, espere a ver este script:

$x = Get-SPOSite

foreach ($y in $x)
    {
        Write-Host $y.Url -ForegroundColor "Yellow"
        $z = Get-SPOSiteGroup -Site $y.Url
        foreach ($a in $z)
            {
                 $b = Get-SPOSiteGroup -Site $y.Url -Group $a.Title 
                 Write-Host $b.Title -ForegroundColor "Cyan"
                 $b | Select-Object -ExpandProperty Users
                 Write-Host
            }
    }

Con este script se obtiene una lista de todos los grupos y de todos los miembros de esos grupos, correspondientes a todos los sitios de SharePoint Online. Todos y cada uno de ellos. Inténtelo y compruébelo por sí mismo.

Creemos que esto deja bastante claro por qué es preferible usar Windows PowerShell para administrar SharePoint Online.

Una nota rápida sobre el cmdlet ForEach-Object

En la sección Trabajar con usuarios de SharePoint Online, tal vez se haya dado cuenta de que canalizamos información de sitio al cmdlet ForEach-Object:

Get-SPOSite | ForEach-Object {Set-SPOUser -Site $_.Url -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True}

Esto plantea una pregunta interesante: ¿por qué lo hicimos? Después de todo, cuando trabajamos con los cmdlets de Azure Active Directory canalizamos información directamente desde el cmdlet Get-MsolUser al cmdlet Set-MsolUser:

Get-MsolUser | Set-MsolUser -UsageLocation "FR"

Entonces, ¿por qué no hicimos algo así con nuestro comando de SharePoint Online:

Get-SPOSite | Set-SPOUser -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

La razón principal por la que no lo hicimos es porque no va a funcionar. Con el cmdlet Set-SPOUser debe incluir de forma explícita el parámetro Site seguido del nombre del sitio. Por ejemplo:

Set-SPOUser -Site "https://litwareinc.sharepoint.com/sites/communities" -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

Esto significa que, si intentamos canalizar información directamente a Set-SPOUser, el cmdlet no usará todos nuestros sitios y no hará que Ken Myer sea el administrador de cada uno. En su lugar, nos pedirá que escribamos la dirección URL del sitio:

Get-SPOSite | Set-SPOUser -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True
cmdlet Set-SPOUser at command pipeline position 2
Supply values for the following parameters:
Site: 

Eso significa que en su lugar tenemos que canalizar la información del sitio al cmdlet ForEach-Object. ForEach-Object usa cada elemento que pasa por él (cada sitio) y hace lo que le indicamos con ese elemento. En este caso, le indicamos que use el cmdlet Set-SPOUser para hacer que Ken Myer sea un administrador de ese sitio:

Set-SPOUser -Site $_.Url -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

La sintaxis $_.Url representa la dirección URL del sitio. $_. Indica que estamos usando información que se canalizó al cmdlet ForEach-Object mediante otro cmdlet.

¿No lo acaba de entender? Pongamos un ejemplo rápido. Supongamos que tenemos tres sitios con las siguientes direcciones URL:

Cuando canalizamos esa información a ForEach-Object, el cmdlet usa el primer elemento de la colección (site1) y ejecuta el cmdlet Set-SPOUser con la dirección URL de dicho sitio. En otras palabras, ejecuta este comando:

Set-SPOUser -Site "https://litwareinc.sharepoint.com/sites/site1" -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

Una vez hecho, usa el segundo sitio (site2) y ejecuta el Set-SPOUser en ese sitio:

Set-SPOUser –Site "https://litwareinc.sharepoint.com/sites/site1" –LoginName "kenmyer@litwareinc.com" –IsSiteCollectionAdmin $True

Como puede ver, ahora está usando la dirección URL del segundo sitio de la colección. Finalmente, ForEach-Object se habrá ejecutado a través de todos los sitios de la colección y habrá hecho que Ken Myer sea administrador en cada uno.

Para obtener más información, examine este artículo. Está de más decir que ForEach-Object es un pequeño cmdlet realmente útil que debe conocer. Por ejemplo, a veces, cuando intenta canalizar información de un cmdlet a otro, obtiene un mensaje de error como este:

The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.

Esto ocurre porque no todos los cmdlets aceptan entradas canalizadas. ¿Cómo se resuelve ese problema? Exacto: use ForEach-Object.

Vea también

Las mejores formas de administrar Office 365 con Windows PowerShell