====== KB: Contar equipos por OU en Active Directory ======
===== Problema =====
Necesitamos saber cuántos equipos hay en cada sub-OU dentro de un contenedor, por ejemplo:
* OU=Equipos WSUS
* OU=Windows 10
* OU=Windows 11
===== Entorno =====
* Active Directory
* PowerShell con módulo **ActiveDirectory** instalado
* Usuario con permisos de lectura en AD
===== Solución =====
Ejecutar en PowerShell:
Import-Module ActiveDirectory
Get-ADComputer -SearchBase "OU=Equipos WSUS,DC=bio4,DC=local" -Filter * |
Group-Object { ($_).DistinguishedName -split ',' | Where-Object { $_ -like 'OU=*' } | Select-Object -First 1 } |
Select-Object @{Name='OU';Expression={ $_.Name -replace '^OU=' }}, Count
===== Ejemplo de salida =====
OU Count
-- -----
Windows 10 15
Windows 11 23
===== Explicación =====
* **Get-ADComputer** con ''-SearchBase'' limita la búsqueda a la OU deseada.
* **DistinguishedName** contiene toda la ruta en AD (CN, OU, DC).
* Al hacer ''-split ',' '' separamos en bloques; filtramos los que empiezan con ''OU=''.
* ''Select-Object -First 1'' toma la primera OU debajo de la raíz buscada.
* **Group-Object** agrupa por esa OU y cuenta objetos.
===== Variantes =====
**Contar solo equipos habilitados:**
Get-ADComputer -SearchBase "OU=Equipos WSUS,DC=bio4,DC=local" -Filter 'Enabled -eq $true' | ...
**Listar además los nombres de los equipos por OU:**
Get-ADComputer -SearchBase "OU=Equipos WSUS,DC=bio4,DC=local" -Filter * |
Group-Object { ($_).DistinguishedName -split ',' | Where-Object { $_ -like 'OU=*' } | Select-Object -First 1 } |
ForEach-Object {
Write-Output "OU: $($_.Name)"
$_.Group | Select-Object -ExpandProperty Name
Write-Output ""
}
===== Notas =====
* El módulo **ActiveDirectory** se instala con RSAT en Windows 10/11, o ya está en servidores AD.
* Ajustar el **SearchBase** al DN de la OU principal.
* Si hay más niveles de sub-OUs, puede ser necesario modificar la parte del `split` para agrupar correctamente.