====== 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.