SharePoint Online PowerShell es la forma de administrar los sitios de SharePoint de Microsoft 365 con comandos, en lugar de hacerlo con clics en el centro de administración. Con una línea se saca el inventario de todos los sitios, se recupera un sitio borrado o se cierra el uso compartido externo de una sola vez. Esta guía explica qué es, cómo instalar el módulo, cómo conectarse a SharePoint Online y qué comandos de SharePoint Online usa a diario un administrador. Además, incluye escenarios completos, una lista de errores con su solución y lo que añade PnP PowerShell.
Está escrita para dos lectores. Si usted no es de sistemas, las primeras secciones le explican qué hace esta herramienta y por qué su equipo de TI la usa. En cambio, si administra Microsoft 365, encontrará los comandos listos para copiar, con sus límites y sus trampas.
No copiamos el manual sin más. Comprobamos cada comando y cada parámetro contra la referencia oficial de Microsoft y la de PnP. Además, revisamos los módulos en un equipo de trabajo real, y ahí apareció lo que la documentación no cuenta: la vía que Microsoft indica para PowerShell 7 cargaba la copia más antigua del equipo, y los dos módulos de SharePoint se estorbaban en la misma ventana.
Qué es SharePoint Online PowerShell y para qué sirve
SharePoint Online es el servicio de Microsoft 365 donde viven los sitios de la empresa, sus bibliotecas de documentos y, por debajo, los archivos de cada equipo de Teams. También guarda el OneDrive de cada persona, que técnicamente es un sitio personal.
SharePoint Online PowerShell es el conjunto de comandos, llamados cmdlets, que administran ese servicio desde la consola. Microsoft los distribuye en un módulo gratuito, Microsoft.Online.SharePoint.PowerShell, que también se conoce como SharePoint Online Management Shell. Todos sus comandos llevan el prefijo SPO, como Get-SPOSite o Set-SPOTenant.
Para entenderlo sin tecnicismos, piense en un archivo con muchas salas. El centro de administración es el mostrador de entrada: cómodo, pero atiende de a una sala. En cambio, SharePoint Online PowerShell es el inventario completo con la llave de cada puerta. Con él se revisa o se cambia lo que haga falta, en un sitio o en quinientos.
Sirve, sobre todo, para cinco trabajos:
- Hacer inventario: qué sitios existen, de quién son, cuánto ocupan y cuándo se usaron por última vez.
- Cambiar muchos sitios a la vez, con la misma orden y sin olvidar ninguno.
- Ajustar lo que el panel no muestra, como el bloqueo de un sitio o la dirección a la que se envía a quien intenta entrar.
- Recuperar lo borrado: sitios enteros y, con PnP PowerShell, archivos de la papelera.
- Automatizar tareas que se repiten, como un informe mensual de almacenamiento.
Por qué conviene frente al centro de administración de SharePoint
El centro de administración de SharePoint sigue siendo útil para el caso suelto. Sin embargo, trabaja de a un sitio, no deja registro reutilizable de lo que se hizo y algunas opciones solo existen en la consola. Por eso, los administradores combinan las dos herramientas.
| Tarea | Centro de administración | SharePoint Online PowerShell |
|---|---|---|
| Ver cuánto ocupa cada sitio | Una vista por páginas | Un informe en un archivo CSV, ordenado |
| Bloquear un sitio o dejarlo en solo lectura | No hay opción | Set-SPOSite -LockState |
| Restaurar un sitio borrado | Sí, de a uno | Sí, y se puede listar lo borrado con los días que quedan |
| Revisar el uso compartido externo de todos los sitios | Abriendo sitio por sitio | Un recorrido sobre todos los sitios |
| Recortar versiones antiguas de los archivos | Por biblioteca | Un trabajo por sitio, con informe previo |
| Repetir la misma tarea el mes siguiente | Volver a hacer cada clic | Ejecutar el mismo script |
En resumen, el panel sirve para lo puntual. SharePoint Online PowerShell sirve para lo que se repite, para lo masivo y para lo que hay que poder demostrar después.
Si todavía no conoce los paneles, empiece por nuestra guía del centro de administración de Microsoft 365. Allí se crean los usuarios y se asignan las licencias que luego usa SharePoint.
Dos módulos: SharePoint Online Management Shell y PnP PowerShell
Al buscar comandos de SharePoint aparecen dos módulos distintos, y conviene saber cuál es cuál. El primero es el de Microsoft, el que describe esta guía. El segundo es PnP PowerShell, un proyecto de código abierto de la comunidad de Microsoft 365.
| SharePoint Online Management Shell | PnP PowerShell | |
|---|---|---|
| Quién lo publica | Microsoft, con soporte | La comunidad, sin acuerdo de servicio de Microsoft |
| Nombre del módulo | Microsoft.Online.SharePoint.PowerShell | PnP.PowerShell |
| Prefijo de los comandos | SPO (Get-SPOSite) | PnP (Get-PnPListItem) |
| Comandos (medido) | 346 en la 16.0.26914 y 363 en la 16.0.27709 | 903 en la 3.4.1 |
| Qué administra | La organización y los sitios: almacenamiento, uso compartido, bloqueo, papelera de sitios | Además, el contenido: listas, archivos, carpetas, permisos y papelera de cada sitio |
| PowerShell que necesita | Windows PowerShell 5.1 | PowerShell 7.4 o posterior |
| Para conectarse | Su cuenta de administrador | Una aplicación registrada en Entra ID, obligatoria desde el 9 de septiembre de 2024 |
La regla práctica es sencilla. Para administrar la organización y los sitios, el módulo de Microsoft. Para trabajar con lo que hay dentro de los sitios, PnP PowerShell. Más abajo, PnP PowerShell tiene su propia sección con ejemplos.
Requisitos de SharePoint Online PowerShell
Para usar SharePoint Online PowerShell hacen falta tres cosas: una cuenta con permisos, una versión de PowerShell compatible y el propio módulo. Ninguna exige comprar nada adicional.
Permisos: qué rol pide SharePoint Online PowerShell
Connect-SPOService solo acepta a un administrador de SharePoint o a un administrador de SharePoint Embedded. El administrador global también puede, porque incluye todos los permisos del primero. Sin embargo, Microsoft recomienda reservar ese rol para emergencias y usar el de administrador de SharePoint para el día a día.
Hay un matiz que sorprende. Un administrador de SharePoint no ve automáticamente el contenido de todos los sitios ni de cada OneDrive. Puede darse acceso, pero eso queda registrado. Por tanto, administrar la configuración de un sitio no es lo mismo que leer sus archivos.
Además, según Microsoft, un cambio de rol tarda alrededor de una hora en aplicarse. Si acaba de recibir el rol y la conexión falla, espere antes de buscar otra causa.
Versión de PowerShell que pide cada módulo
El módulo de Microsoft está hecho para Windows PowerShell 5.1, la que trae Windows. PnP PowerShell, en cambio, solo funciona en PowerShell 7.4 o posterior. Si no sabe cuál tiene, nuestra guía de PowerShell explica cómo verlo y cómo instalar la versión 7.
| Módulo | Windows PowerShell 5.1 | PowerShell 7 |
|---|---|---|
| SharePoint Online Management Shell | Sí, es su entorno | Microsoft indica importarlo con -UseWindowsPowerShell |
| PnP PowerShell 3.x | No: exige 7.4.0 | Sí, desde la 7.4 |
La nota de PowerShell 7 tiene más miga de lo que parece, y lo explicamos con lo que medimos en la sección de conexión.
Instalar el módulo de SharePoint Online PowerShell
El módulo se instala desde la Galería de PowerShell. Primero, compruebe si ya lo tiene:
Get-Module -Name Microsoft.Online.SharePoint.PowerShell -ListAvailable | Select-Object Name, Version, ModuleBase
Si no aparece, instálelo solo para su usuario, sin permisos de administrador. Para instalarlo para todo el equipo, cambie CurrentUser por AllUsers y abra la consola como administrador:
Install-Module -Name Microsoft.Online.SharePoint.PowerShell -Scope CurrentUser
Microsoft publica versiones con frecuencia, y cada una trae parámetros nuevos. Por eso, actualícelo cada cierto tiempo:
Update-Module -Name Microsoft.Online.SharePoint.PowerShell
Con versiones anteriores, al importarlo, PowerShell muestra un aviso: algunos comandos usan verbos no aprobados. No es un error. En las dos copias del equipo de prueba, la 16.0.26615 y la 16.0.26914, los responsables eran Apply-SPOFontPackage y Verify-SPOCrossTenantRelationship. En la 16.0.27709, la vigente, esos dos nombres ya no existen y el aviso desapareció. Si lo ve y le estorba en un script, importe el módulo con -DisableNameChecking.
Lo que encontramos en un equipo real
Revisamos el portátil de trabajo de un administrador de Microsoft 365, sin conectarnos a ninguna organización. El equipo tenía instalado el módulo de SharePoint dos veces, una para cada consola. Además, tenía PnP PowerShell solo en la 7:
| Copia | Carpeta | La carga | Versión de la Galería ese día |
|---|---|---|---|
| SharePoint Online 16.0.26615 | Documentos\WindowsPowerShell\Modules | Windows PowerShell 5.1 | 16.0.27709 |
| SharePoint Online 16.0.26914 | Documentos\PowerShell\Modules | PowerShell 7 | 16.0.27709 |
| PnP PowerShell 3.1.0 | Documentos\PowerShell\Modules | PowerShell 7 | 3.4.1 |
Las dos copias del módulo de Microsoft estaban por detrás de la vigente, y no eran iguales entre sí. Por ejemplo, Set-SPOTenant tenía 227 parámetros en una, 234 en la otra y 245 en la de la Galería. Además, solo la 16.0.27709 permite conectarse con una identidad administrada de Azure.
Hay otro detalle. Las dos carpetas de Documentos estaban dentro de OneDrive, porque OneDrive protege esa carpeta por defecto. Si usted lo tiene así, sus módulos se sincronizan con la nube y viajan a cada equipo donde inicie sesión.
Revise qué versión de SharePoint PowerShell carga cada consola
Este bloque muestra, en la consola donde lo ejecute, qué copias ve PowerShell y cuál carga de verdad. Ejecútelo en Windows PowerShell y en PowerShell 7, y compare:
Get-Module -ListAvailable Microsoft.Online.SharePoint.PowerShell, PnP.PowerShell | Format-Table -AutoSize Name, Version, ModuleBase
Import-Module Microsoft.Online.SharePoint.PowerShell -DisableNameChecking
(Get-Module Microsoft.Online.SharePoint.PowerShell).Version
Si ve varias versiones, actualice la que usa con Update-Module y desinstale las viejas con Uninstall-Module -Name Microsoft.Online.SharePoint.PowerShell -RequiredVersion seguido del número. Así, todas sus consolas usarán los mismos comandos.
Cómo conectarse a SharePoint Online con PowerShell
Para conectarse a SharePoint Online, el módulo de Microsoft no usa la dirección de su sitio, sino la del centro de administración. Tiene esta forma: https://contoso-admin.sharepoint.com, donde contoso es el nombre de su organización. Lo ve en la barra de direcciones cuando abre el centro de administración de SharePoint.
La forma normal de conectarse a SharePoint Online, con autenticación multifactor, es esta:
Connect-SPOService -Url https://contoso-admin.sharepoint.com
Se abre la ventana de inicio de sesión de Microsoft. Escriba su cuenta, su contraseña y el segundo factor. A partir de ahí, la consola queda conectada y los demás comandos funcionan.
Tenga en cuenta tres reglas de la referencia oficial de Connect-SPOService:
- Solo hay una conexión por ventana. Si vuelve a ejecutar
Connect-SPOService, la anterior se cierra y la sesión pasa a la nueva cuenta. - Si la ventana de inicio de sesión falla, pruebe con
-UseSystemBrowser $true, que inicia sesión en su navegador. - Las nubes especiales, como la del Gobierno de Estados Unidos o la de China, se indican con
-Region. Para una empresa normal no hace falta.
Al terminar, cierre la conexión:
Disconnect-SPOService
Conectarse con PowerShell 7: lo que medimos
La guía de inicio de Microsoft dice que, en PowerShell 7, el módulo se importa con -UseWindowsPowerShell. Esa opción no carga el módulo en PowerShell 7. Abre por debajo una sesión de Windows PowerShell 5.1 y trae los comandos desde allí.
En el equipo de prueba, eso tuvo dos efectos que nadie avisa:
- Cargó la copia de Windows PowerShell, la 16.0.26615, la más antigua del equipo, aunque PowerShell 7 tenía instalada la 16.0.26914.
- Tardó 4,1 segundos en importarse, frente a 0,3 de la carga directa. Además, los comandos dejan de ser cmdlets y pasan a ser funciones que envían cada orden a la otra sesión.
Por otro lado, la carga directa en PowerShell 7, sin esa opción, funcionó hasta el punto de pedir la conexión. No nos conectamos a ninguna organización, así que no podemos afirmar que todo funcione por esa vía.
Nuestra recomendación es práctica. Para el módulo de Microsoft, use Windows PowerShell 5.1, que es su entorno. Si trabaja en PowerShell 7 con -UseWindowsPowerShell, actualice también la copia de Windows PowerShell, porque es la que se ejecuta.
Errores al conectarse y su solución
Estos son los mensajes que vimos en el equipo de prueba o que documenta Microsoft, con su causa:
| Mensaje | Causa | Solución |
|---|---|---|
No connection available. Use Connect-SPOService before running this CmdLet. | No se ha conectado, o la conexión se cerró | Ejecute Connect-SPOService con la dirección de administración |
Could not connect to SharePoint Online | La cuenta exige autenticación moderna | Microsoft propone -ModernAuth $true -AuthenticationUrl https://login.microsoftonline.com/organizations |
| Aviso de verbos no aprobados al importar | En versiones anteriores a la 16.0.27709, dos comandos usan verbos fuera de la lista de PowerShell | Es inofensivo; actualice el módulo o use -DisableNameChecking |
Could not load file or assembly 'Microsoft.Online.SharePoint.Client.Tenant…' | Se cargó el módulo de Microsoft y después PnP PowerShell en la misma ventana | Use una ventana para cada módulo |
| El módulo no carga y está instalado el SDK de componentes de cliente de SharePoint | Problema conocido entre los dos, según Microsoft | Desinstale el SDK de componentes de cliente |
| El comando existe en la documentación pero no en su consola | Su versión del módulo es anterior | Actualice con Update-Module |
Comandos de SharePoint Online PowerShell más usados
El módulo de Microsoft tiene más de 340 comandos, pero el trabajo diario se hace con unos treinta. Los agrupamos por tarea. Todos exigen haberse conectado antes.
Conexión y organización
| Comando | Para qué sirve |
|---|---|
Connect-SPOService | Conectarse al centro de administración |
Disconnect-SPOService | Cerrar la conexión |
Get-SPOTenant | Ver la configuración de toda la organización |
Set-SPOTenant | Cambiar la configuración de toda la organización, como el uso compartido |
Get-SPOTenantSyncClientRestriction | Ver si la sincronización de OneDrive está limitada a equipos de la empresa |
Sitios
| Comando | Para qué sirve |
|---|---|
Get-SPOSite | Listar sitios o ver uno con sus propiedades |
New-SPOSite | Crear un sitio clásico de colección |
Set-SPOSite | Cambiar un sitio: cuota, propietario, uso compartido o bloqueo |
Remove-SPOSite | Enviar un sitio a la papelera de sitios eliminados |
Get-SPODeletedSite | Ver los sitios eliminados que aún se pueden restaurar |
Restore-SPODeletedSite | Restaurar un sitio eliminado |
Remove-SPODeletedSite | Borrar un sitio eliminado de forma permanente |
Start-SPOSiteRename | Cambiar la dirección de un sitio |
Get-SPOSiteRenameState | Ver cómo va un cambio de dirección |
Usuarios y grupos de un sitio
| Comando | Para qué sirve |
|---|---|
Get-SPOUser | Listar los usuarios de un sitio |
Add-SPOUser | Añadir un usuario a un grupo del sitio |
Set-SPOUser | Hacer o dejar de hacer a alguien administrador del sitio |
Remove-SPOUser | Quitar a un usuario de un sitio |
Get-SPOSiteGroup | Listar los grupos de SharePoint de un sitio |
New-SPOSiteGroup | Crear un grupo en un sitio con su nivel de permiso |
Invitados, OneDrive y versiones
| Comando | Para qué sirve |
|---|---|
Get-SPOExternalUser | Listar los invitados externos, de 50 en 50 |
Remove-SPOExternalUser | Quitar el acceso a un invitado externo |
Request-SPOPersonalSite | Crear por adelantado el OneDrive de hasta 200 personas |
New-SPOSiteFileVersionExpirationReportJob | Pedir un informe de las versiones guardadas en un sitio |
New-SPOSiteFileVersionBatchDeleteJob | Programar el recorte de versiones antiguas de un sitio |
Get-SPOSiteVersionPolicyJobProgress | Ver cómo va ese recorte |
El límite de 200 sitios de SharePoint Online PowerShell
Esta es la trampa que más informes arruina. Get-SPOSite sin parámetros no devuelve todos los sitios, sino los primeros 200. No muestra ningún aviso. Si su organización tiene 350 sitios, el informe saldrá con 200 y parecerá completo.
Con los usuarios pasa lo mismo: Get-SPOUser devuelve 500 por defecto. Y Get-SPOExternalUser devuelve como máximo 50 por consulta, así que hay que recorrerlo por páginas. La solución es pedir todo de forma explícita:
Get-SPOSite -Limit All
Get-SPOUser -Site https://contoso.sharepoint.com/sites/ventas -Limit All
Pero -Limit tiene su propia trampa, que la referencia de Get-SPOSite explica en una nota. Cuando se usa -Limit o -Filter, Get-SPOSite deja sin rellenar varias propiedades. Entre ellas está SharingCapability, el nivel de uso compartido externo del sitio.
Por tanto, un informe de uso compartido hecho con Get-SPOSite -Limit All sale con valores por defecto, no con los reales, y tampoco avisa. Para leer el uso compartido de cada sitio hay que pedir los sitios de uno en uno con -Identity, como hacemos en el escenario de uso compartido.
El filtro del servidor, -Filter, es más rápido que traer todo y filtrar después. Sin embargo, solo admite algunas propiedades: Owner, Template, LockState y Url. Por ejemplo, para los sitios que están bloqueados:
Get-SPOSite -Limit All -Filter { LockState -eq "NoAccess" }
Escenarios de SharePoint Online PowerShell paso a paso
Estos escenarios cubren lo que más se pide en una mesa de servicio. En los ejemplos, contoso es el nombre de la organización: cámbielo por el suyo. Cada bloque supone que ya ejecutó Connect-SPOService.
Inventario de sitios con su almacenamiento
El primer informe que conviene tener es la lista de sitios con su propietario, lo que ocupan y su última modificación. Este bloque lo guarda en un CSV que se abre con Excel:
Get-SPOSite -Limit All -IncludePersonalSite $false |
Select-Object Url, Title, Template, Owner, StorageUsageCurrent, StorageQuota, LastContentModifiedDate, LockState |
Sort-Object StorageUsageCurrent -Descending |
Export-Csv -Path "$env:USERPROFILE\Desktop\sitios-sharepoint.csv" -NoTypeInformation -Encoding UTF8
Dos cosas para leerlo bien. Primero, StorageUsageCurrent y StorageQuota están en megabytes. Segundo, SharePoint calcula en unidades binarias: un gigabyte son 1.024 megabytes. Además, según Microsoft, el uso no refleja los cambios de las últimas 24 a 48 horas.
Con -IncludePersonalSite $false quedan fuera los OneDrive de las personas. Si quiere verlos también, cambie $false por $true.
Cuánto espacio tiene la organización
El espacio de SharePoint es una bolsa común. Según los límites de SharePoint que publica Microsoft, cada organización recibe 1 TB más 10 GB por cada licencia que la incluye. Además, cada sitio puede llegar a 25 TB.
Un ejemplo con cifras. Una empresa de 120 personas, todas con licencia, tiene 1.024 GB más 1.200 GB: 2.224 GB, unos 2,2 TB. Eso es para todos los sitios y los equipos de Teams juntos, porque el OneDrive de cada persona va aparte. Para ver cuánto le queda:
Get-SPOTenant | Select-Object StorageQuota, StorageQuotaAllocated
Get-SPOSite -Limit All -IncludePersonalSite $false | Measure-Object StorageUsageCurrent -Sum
La primera línea da el total disponible, en megabytes. La segunda suma lo que ocupan los sitios. Si la diferencia se estrecha, revise primero la papelera y las versiones antiguas, porque las dos cuentan dentro de esa bolsa.
Poner una cuota a un sitio
Por defecto, los sitios toman espacio de la bolsa común sin límite propio. Si su organización tiene el almacenamiento en modo manual, puede fijar una cuota a cada sitio. Este ejemplo deja un sitio en 100 GB, con aviso al 90 %:
Set-SPOSite -Identity https://contoso.sharepoint.com/sites/proyectos -StorageQuota 102400 -StorageQuotaWarningLevel 92160
Las cifras van en megabytes: 100 × 1.024 = 102.400. El aviso se envía al propietario del sitio cuando llega a 92.160, el 90 %. Recuerde que las cuotas por sitio son para el modo manual. En el automático, que es el de fábrica, cada sitio toma de la bolsa lo que necesita. El modo se elige en la configuración del centro de administración de SharePoint.
Dar o quitar un administrador de sitio
El administrador de una colección de sitios tiene control total sobre ese sitio. Es la forma de entrar a un sitio cuyo propietario se fue de la empresa:
Set-SPOUser -Site https://contoso.sharepoint.com/sites/proyectos -LoginName ana.gomez@contoso.com -IsSiteCollectionAdmin $true
Get-SPOUser -Site https://contoso.sharepoint.com/sites/proyectos -Limit All | Where-Object IsSiteAdmin | Select-Object DisplayName, LoginName
La segunda línea lista quién es administrador del sitio. Para quitar el permiso, repita la primera con $false. Deje constancia de cada cambio, porque dar acceso a un sitio ajeno es justo lo que un control interno pregunta.
Revisar y cerrar el uso compartido externo
El uso compartido externo se decide en dos niveles. El de la organización marca el máximo, y cada sitio puede ser igual o más restrictivo, nunca más abierto. Los cuatro valores, del más cerrado al más abierto, son estos:
| Valor | Qué permite |
|---|---|
Disabled | Nada fuera de la organización |
ExistingExternalUserSharingOnly | Solo invitados que ya están en el directorio |
ExternalUserSharingOnly | Invitados nuevos que inician sesión, sin vínculos anónimos |
ExternalUserAndGuestSharing | Todo lo anterior y vínculos «Cualquiera», sin inicio de sesión |
Como vimos, Get-SPOSite -Limit All no rellena SharingCapability. Por eso, este informe pide cada sitio por separado. Es más lento, pero da el valor real:
$sitios = Get-SPOSite -Limit All -IncludePersonalSite $false
$informe = foreach ($s in $sitios) {
Get-SPOSite -Identity $s.Url | Select-Object Url, Title, SharingCapability
}
$informe | Sort-Object SharingCapability | Format-Table -AutoSize
Para cerrar un sitio a los externos, o para bajar el máximo de toda la organización:
Set-SPOSite -Identity https://contoso.sharepoint.com/sites/finanzas -SharingCapability Disabled
Set-SPOTenant -SharingCapability ExternalUserSharingOnly
Si quiere entender qué tipo de vínculo se crea al compartir un archivo, y por qué el de fábrica puede ser el más abierto, lo explicamos en la guía para compartir archivos en OneDrive.
Listar los invitados externos
Get-SPOExternalUser devuelve como máximo 50 invitados por consulta. Este bloque recorre todas las páginas hasta el final:
$invitados = [System.Collections.Generic.List[object]]::new()
$posicion = 0
do {
$pagina = @(Get-SPOExternalUser -Position $posicion -PageSize 50)
foreach ($i in $pagina) { $invitados.Add($i) }
$posicion += 50
} while ($pagina.Count -eq 50)
$invitados | Select-Object DisplayName, Email, InvitedBy, WhenCreated | Export-Csv -Path "$env:USERPROFILE\Desktop\invitados.csv" -NoTypeInformation -Encoding UTF8
Con la lista en la mano, el responsable de cada área decide quién sigue. Para retirar a un invitado de toda la organización se usa Remove-SPOExternalUser -UniqueIDs con su identificador. Ese borrado es permanente, así que hágalo con la lista aprobada.
Bloquear un sitio o dejarlo en solo lectura
El bloqueo solo se cambia con PowerShell; el centro de administración no tiene esa opción. Sirve, por ejemplo, para congelar un sitio durante una migración o cerrar el de un proyecto terminado:
Set-SPOSite -Identity https://contoso.sharepoint.com/sites/proyecto-cerrado -LockState ReadOnly
Set-SPOSite -Identity https://contoso.sharepoint.com/sites/proyecto-cerrado -LockState NoAccess
Set-SPOSite -Identity https://contoso.sharepoint.com/sites/proyecto-cerrado -LockState Unlock
Con ReadOnly, nadie puede añadir, cambiar ni borrar, y el sitio muestra un aviso de mantenimiento. Con NoAccess, nadie entra y se ve un error 403. Para enviar a esas personas a una página propia en lugar del error, fije una vez la dirección de la organización:
Set-SPOTenant -NoAccessRedirectUrl "https://contoso.sharepoint.com/sites/intranet/SitePages/sitio-cerrado.aspx"
Dos límites de Microsoft. El sitio raíz de la organización no se puede bloquear. Y si un sitio quedó en solo lectura por una directiva de cierre de sitios, Unlock no lo desbloquea.
Recuperar un sitio eliminado
Un sitio borrado se conserva 93 días en la lista de sitios eliminados, según la guía de Microsoft para restaurar sitios. Pasado ese plazo, se borra para siempre con todo su contenido. Este bloque lista lo que queda, con los días que le faltan a cada uno:
Get-SPODeletedSite -Limit All | Select-Object Url, DeletionTime, DaysRemaining | Sort-Object DaysRemaining
Restore-SPODeletedSite -Identity https://contoso.sharepoint.com/sites/proyectos
Hay una trampa con los sitios de un grupo de Microsoft 365, que son los de cada equipo de Teams. Al borrar el sitio se borra también el grupo, con su buzón y su calendario. El sitio se guarda 93 días, pero el grupo solo 30. Por tanto, después del día 30, restaurar el sitio ya no devuelve el resto del equipo.
Los sitios en la lista de eliminados no cuentan para el almacenamiento de la organización. Para reutilizar la dirección de un sitio borrado, hay que eliminarlo de forma permanente con Remove-SPODeletedSite. Según Microsoft, la dirección puede tardar hasta 24 horas en quedar libre.
Restaurar un sitio no es lo mismo que tener copia de seguridad. Si le interesa la diferencia, la explicamos en nuestra guía de backup de Microsoft 365.
Cambiar la dirección de un sitio
Cuando un área cambia de nombre, el sitio puede cambiar de dirección. Primero, valide el cambio sin aplicarlo. Después, ejecútelo y siga su estado:
Start-SPOSiteRename -Identity https://contoso.sharepoint.com/sites/mercadeo -NewSiteUrl https://contoso.sharepoint.com/sites/comunicaciones -ValidationOnly
Start-SPOSiteRename -Identity https://contoso.sharepoint.com/sites/mercadeo -NewSiteUrl https://contoso.sharepoint.com/sites/comunicaciones -NewSiteTitle "Comunicaciones"
Get-SPOSiteRenameState -Identity https://contoso.sharepoint.com/sites/mercadeo
Según Microsoft, el cambio tarda unos 10 minutos según el tamaño del sitio, y mientras tanto el sitio queda en solo lectura. Hágalo fuera del horario de trabajo. Además, la dirección anterior queda redirigida a la nueva, y los vínculos compartidos siguen funcionando.
No se puede cambiar la dirección de un sitio central, de un sitio bloqueado o en retención, ni pasar un sitio de /sites a /teams.
Recortar el historial de versiones
Cada vez que alguien guarda un archivo, SharePoint conserva la versión anterior. Ese historial ocupa espacio de la bolsa común. Antes de borrar nada, pida un informe que muestre cuántas versiones hay y cuánto ocupan:
New-SPOSiteFileVersionExpirationReportJob -Identity https://contoso.sharepoint.com/sites/proyectos -ReportUrl "https://contoso.sharepoint.com/sites/proyectos/Documentos compartidos/informe-versiones.csv"
Con el informe revisado, programe el recorte de versiones. La opción -Automatic aplica el mismo criterio que el límite automático de Microsoft, que conserva más versiones recientes y menos antiguas. Después, consulte el avance:
New-SPOSiteFileVersionBatchDeleteJob -Identity https://contoso.sharepoint.com/sites/proyectos -Automatic
Get-SPOSiteVersionPolicyJobProgress -Identity https://contoso.sharepoint.com/sites/proyectos
Las versiones recortadas no se pueden recuperar. Si quiere entender qué es el historial y cómo lo usa cada persona, lo explicamos en nuestra guía del historial de versiones.
Crear el OneDrive de los empleados nuevos
El OneDrive de una persona se crea la primera vez que entra. Si quiere tenerlo listo antes, por ejemplo para copiarle sus archivos el primer día, pídalo por adelantado. Admite hasta 200 cuentas por llamada:
Request-SPOPersonalSite -UserEmails "ana.gomez@contoso.com", "luis.perez@contoso.com"
La creación queda en cola y puede tardar. Las personas deben tener una licencia que incluya SharePoint, y la cuenta que ejecuta la orden también.
PnP PowerShell: lo que el módulo de Microsoft no hace
El módulo de Microsoft administra los sitios, pero apenas entra en su contenido. Para listar los archivos de una biblioteca, subir documentos o restaurar algo de la papelera de un sitio se usa PnP PowerShell. Recuerde que es un proyecto de la comunidad: Microsoft no ofrece soporte ni acuerdo de servicio sobre él.
Instalar PnP PowerShell y registrar su aplicación
PnP PowerShell necesita PowerShell 7.4 o posterior. En Windows PowerShell 5.1 ni siquiera carga. Se instala igual que el otro:
Install-Module -Name PnP.PowerShell -Scope CurrentUser
Desde el 9 de septiembre de 2024, para conectarse hace falta una aplicación propia registrada en Entra ID. Antes, PnP usaba una aplicación común para todas las organizaciones, y esa aplicación se retiró. Por eso, muchos scripts antiguos dejaron de funcionar de un día para otro.
En nuestra prueba, conectarse sin indicar la aplicación devolvió un aviso que pide un identificador válido de una aplicación registrada en Entra ID, y no conectó. La aplicación se crea una sola vez, con una cuenta que tenga permiso para registrar aplicaciones:
Register-PnPEntraIDAppForInteractiveLogin -ApplicationName "PnP.PowerShell" -Tenant contoso.onmicrosoft.com
Al terminar, la aplicación queda registrada en Entra ID con su identificador de aplicación. Anótelo, porque cada conexión lo pide:
Connect-PnPOnline -Url https://contoso.sharepoint.com/sites/proyectos -Interactive -ClientId 00000000-0000-0000-0000-000000000000
A diferencia del módulo de Microsoft, PnP se conecta a cada sitio, no al centro de administración. Para las tareas de organización, use la dirección de administración.
Comandos de PnP PowerShell para el día a día
| Comando | Para qué sirve |
|---|---|
Get-PnPList | Listar las listas y bibliotecas del sitio |
Get-PnPListItem | Leer los elementos de una lista o los archivos de una biblioteca |
Get-PnPFolderItem | Listar el contenido de una carpeta |
Add-PnPFile | Subir un archivo |
Get-PnPFile | Descargar un archivo |
Get-PnPRecycleBinItem | Ver la papelera del sitio, en sus dos etapas |
Restore-PnPRecycleBinItem | Restaurar desde la papelera |
Get-PnPSiteCollectionAdmin | Ver los administradores del sitio |
Get-PnPTenantSite | Listar los sitios de la organización |
Disconnect-PnPOnline | Cerrar la conexión |
Ejemplo: listar los archivos de una biblioteca grande
Las bibliotecas grandes se leen por páginas. Get-PnPListItem con -PageSize trae los elementos en tandas, en lugar de pedirlos todos de golpe:
Get-PnPListItem -List "Documentos" -PageSize 2000 |
Select-Object @{n = 'Archivo'; e = { $_['FileLeafRef'] } }, @{n = 'Ruta'; e = { $_['FileRef'] } }, @{n = 'Modificado'; e = { $_['Modified'] } } |
Export-Csv -Path "$env:USERPROFILE\Desktop\archivos.csv" -NoTypeInformation -Encoding UTF8
Para recorrer las carpetas de una biblioteca de más de 5.000 elementos, la documentación de PnP pide indicar la biblioteca con Get-PnPFolderItem -List. Sin ese parámetro, la consulta no trae los archivos.
Ejemplo: restaurar lo que alguien borró por error
Un archivo borrado pasa a la papelera del sitio. Si alguien la vacía, pasa a la papelera de segunda etapa, la de la colección de sitios. Este bloque busca los documentos de Word borrados y los restaura:
Get-PnPRecycleBinItem | Where-Object LeafName -like "*.docx" | Select-Object LeafName, DirName, DeletedByEmail, DeletedDate
Get-PnPRecycleBinItem | Where-Object LeafName -like "*.docx" | Restore-PnPRecycleBinItem -Force
Revise primero la lista con la primera línea. La segunda restaura sin preguntar, así que asegúrese de que el filtro solo atrapa lo que quiere recuperar.
Los dos módulos en la misma ventana
Aquí está el segundo hallazgo del equipo de prueba. En PowerShell 7, si se carga primero el módulo de Microsoft y después PnP PowerShell, PnP no carga. Muestra un error de ensamblado, Could not load file or assembly 'Microsoft.Online.SharePoint.Client.Tenant', porque los dos traen piezas internas del mismo nombre en versiones distintas.
Al revés, cargando PnP primero, los dos módulos se cargaron. Sin embargo, sin conexión real no podemos asegurar que todo funcione así. La forma segura es abrir una ventana para cada módulo.
Automatizar SharePoint Online PowerShell sin una persona delante
Un script programado no puede responder a una ventana de inicio de sesión. Para eso, los dos módulos admiten conectarse con una aplicación registrada en Entra ID y un certificado, sin usuario:
Connect-SPOService -Url https://contoso-admin.sharepoint.com -ClientId 00000000-0000-0000-0000-000000000000 -TenantId 11111111-1111-1111-1111-111111111111 -CertificateThumbprint "3FAAAA1111AAAAAAAAAAA2222AAAAAAAAAAAAAAA"
Connect-PnPOnline -Url https://contoso.sharepoint.com/sites/proyectos -ClientId 00000000-0000-0000-0000-000000000000 -Tenant contoso.onmicrosoft.com -Thumbprint "3FAAAA1111AAAAAAAAAAA2222AAAAAAAAAAAAAAA"
El certificado debe estar en el almacén de certificados del equipo que ejecuta el script. Además, la aplicación necesita permisos concedidos por un administrador. Trate esa aplicación como una cuenta de administrador más: quien tenga el certificado tiene esos permisos.
En la versión 16.0.27709, Connect-SPOService también admite -ManagedIdentity, para scripts que corren en Azure. Esa opción no existía en las dos versiones anteriores que medimos.
Recomendaciones para administrar SharePoint con PowerShell
Estas recomendaciones resumen lo que vimos en las fuentes de Microsoft y en el equipo de prueba:
- Use el rol de administrador de SharePoint, no el de administrador global, para el trabajo diario.
- Mantenga una sola versión del módulo por consola, y actualícela. La documentación describe la versión vigente, y con una copia vieja faltan comandos y parámetros.
- Escriba siempre
-Limit Allcuando quiera todos los sitios o todos los usuarios. Sin él, el informe sale con 200 sitios o 500 usuarios, sin aviso. - Para leer el uso compartido de cada sitio, pídalo con
-Identity. Con-Limito-Filter, ese dato llega vacío. - Antes de borrar o recortar, saque un informe: el inventario de sitios, la lista de invitados o el informe de versiones.
- Recuerde los plazos: 93 días para un sitio borrado y 30 para su grupo de Microsoft 365.
- Separe los módulos: una ventana para el de Microsoft y otra para PnP PowerShell.
- Guarde sus scripts y los CSV que generan. Son la prueba de qué se cambió, cuándo y por qué.
Lo que no probamos
Una guía honesta dice dónde termina su laboratorio:
- No nos conectamos a ninguna organización real. Revisamos los módulos instalados y validamos cada comando y cada parámetro contra el módulo o contra la referencia oficial de Microsoft y de PnP.
- Por tanto, las salidas de los comandos con conexión no las vimos en pantalla. Los límites que citamos, como los 200 sitios o los 93 días, son los publicados por Microsoft.
- No probamos la autenticación con certificado ni las identidades administradas.
- No comprobamos que el módulo de Microsoft funcione conectado en PowerShell 7 sin
-UseWindowsPowerShell.
Lo que sí medimos lo hicimos en Windows 11, con Windows PowerShell 5.1 y PowerShell 7.6.7, sin permisos de administrador. PnP PowerShell 3.4.1 y el módulo de Microsoft 16.0.27709 se probaron desde una carpeta temporal, sin instalarlos.
Cuándo conviene delegar la administración de SharePoint
SharePoint Online PowerShell resuelve en minutos lo que en el panel lleva días. Sin embargo, los sitios de una empresa no se ordenan solos. Alguien tiene que revisar el uso compartido cada mes, cerrar los sitios de los proyectos terminados y vigilar el espacio antes de que se acabe.
En KHARONTE, ese trabajo forma parte de la administración de Microsoft 365 de nuestra línea de gestión de plataformas: usuarios, licencias, sitios y accesos. Cada solicitud entra por nuestra mesa de ayuda TI, queda registrada y se resuelve con su trazabilidad.
Si además quiere delegar el correo, los servidores y el soporte de los puestos de trabajo, todo eso entra en nuestros servicios administrados de TI. Para el correo, tenemos también la guía de Exchange Online PowerShell. Puede ver el alcance completo en la página de servicios de TI para empresas.
Preguntas frecuentes sobre SharePoint Online PowerShell
¿Qué es SharePoint Online PowerShell?
Es el conjunto de comandos de PowerShell que administra SharePoint en Microsoft 365. Se instala con el módulo gratuito Microsoft.Online.SharePoint.PowerShell, también llamado SharePoint Online Management Shell, y se conecta con Connect-SPOService.
¿Cómo me conecto a SharePoint Online con PowerShell?
Instale el módulo y ejecute Connect-SPOService -Url https://contoso-admin.sharepoint.com, con el nombre de su organización en lugar de contoso. Se abrirá la ventana de inicio de sesión de Microsoft.
¿Qué diferencia hay entre SharePoint Online Management Shell y PnP PowerShell?
El primero es de Microsoft y administra la organización y los sitios. PnP PowerShell es de la comunidad, necesita PowerShell 7.4 y una aplicación registrada en Entra ID, y trabaja además con el contenido: listas, archivos y papelera.
¿Por qué Get-SPOSite no muestra todos los sitios?
Porque, sin -Limit, devuelve los primeros 200. Use Get-SPOSite -Limit All.
¿Funciona en PowerShell 7?
Microsoft indica importarlo con -UseWindowsPowerShell, que ejecuta por debajo la copia de Windows PowerShell 5.1. PnP PowerShell, en cambio, solo funciona en PowerShell 7.4 o posterior.
¿Cuánto tiempo se puede restaurar un sitio borrado?
93 días. Si el sitio es de un grupo de Microsoft 365, el grupo solo se conserva 30 días.
¿Necesito una licencia especial?
No. Los dos módulos son gratuitos. Lo que necesita es una cuenta con el rol de administrador de SharePoint.




