Las herramientas que necesita para solucionar problemas de AD
style="letter-spacing: 0px; text-transform: unset; background-color: transparent;">¿Está a cargo de un servicio de directorio como AD o Azure AD? Entonces ya debes haber dedicado bastante tiempo a solucionar problemas. Afortunadamente, existe una manera de hacer la vida de cada administrador más fácil.
Los directorios proporcionan una fuente de verdad para la gestión de identidades de las organizaciones, ya sea que el servicio de directorio lo proporcione Active Directory (AD) o Azure AD (AAD), y la resolución de problemas o la identificación de problemas es una tarea clave que deben realizar quienes están a cargo del directorio. . Utilizar la herramienta (o herramientas) adecuada puede ayudar a que esta tarea sea manejable y las secuencias de comandos (PowerShell o de otro tipo) han demostrado ser una herramienta útil para este tipo de tarea.
En este artículo, exploraremos cómo podemos usar PowerShell para solucionar problemas comunes en Active Directory. Vale la pena señalar que no todo lo necesario para solucionar problemas de AD se puede hacer directamente con PowerShell; sin embargo, podemos usar PowerShell para colocar un 'envoltorio' alrededor de otros procesos y utilizar PowerShell para extraer datos para una solución de problemas exitosa.
Enlaces a sitios y servicios de AD
Un error común que se comete con los enlaces de replicación de sitio a sitio es corregir un problema de replicación con un enlace manual en lugar de confiar en los generados automáticamente que crea KCC (acrónimo). Los enlaces manuales no se actualizan automáticamente ni funcionan bien con los cambios de topología, por lo que identificar enlaces creados manualmente puede ser bueno para un entorno saludable.
Encuentra enlaces generados automáticamente
Con lo siguiente, podemos enumerar todos los enlaces de replicación de AD, con su GUID, servidores de origen y de destino y si el enlace es generado automáticamente:
Get-ADReplicationConnection -Filter * |
Select-Object -Property Name, AutoGenerated, ReplicateFromDirectoryServer, ReplicateToDirectoryServer |
ForEach-Object {
$From = $_.ReplicateFromDirectoryServer $To = $_.ReplicateToDirectoryServer
$_.ReplicateFromDirectoryServer = (($From -Split ',')[1] -Split '=')[1]
$_.ReplicateToDirectoryServer = (($To -Split ',')[0] -Split '=')[1]
Return $_
}
Salida de muestra
Si uno o más enlaces tenían un valor de 'Falso' para Generación automática, se debe realizar una investigación sobre por qué se creó. Puede haber una razón válida para ello, aunque Microsoft no lo respaldaría.
Replicación
Además de los vínculos a sitios, verificar la replicación que atraviesa esos vínculos puede ser un componente crítico en la solución de problemas de AD. En esta sección exploraremos algunas formas de utilizar PowerShell como contenedor de herramientas nativas de Windows para examinar la comunicación entre controladores de dominio (DC) en un entorno. Las herramientas utilizadas en esta sección son dsquery, repadmin y dcdiag. Con PowerShell podemos exportar los resultados de estas herramientas a un archivo de salida para que un administrador experto en AD los analice.
Dsquery
Nuestra primera herramienta es dsquery, que se utiliza para consultar información en AD y específicamente en este caso solo estamos consultando controladores de dominio en AD. Puede encontrar más información sobre esta frase en Microsoft Docs.
'dsquery server -o rdn'repadmin
La herramienta repadmin se puede utilizar para exponer algunos de los problemas de replicación más profundos que pueden ocurrir entre los controladores de dominio, tanto entrantes como salientes. Repadmin puede revelar problemas críticos con controladores de dominio que ya no pueden replicarse, identificar problemas de topología y más. A continuación se muestra un buen conjunto básico de cmdlets que se pueden ejecutar desde un script de PowerShell. Tenga en cuenta que cada línea exporta los resultados a un archivo para ser examinado:
$ADCmdletDestination = 'ADReplicationOutput.txt 'Compruebe la replicación de todos los servidores, cruce todos los sitios
C:\Windows\System32\repadmin.exe /syncall /e >> $ADCmdletDestination
Compruebe la replicación del contexto de nombres
C:\Windows\System32\repadmin.exe /syncall /A >> $ADCmdletDestination
Sincronización usando DN y no GUID DNS
C:\Windows\System32\repadmin.exe /syncall /d >> $ADCmdletDestination
Resumen conciso de replicación
C:\Windows\System32\repadmin.exe /replsummary * >> $ADCmdletDestination
Fuerza a KCC a recalcular la topología
C:\Windows\System32\repadmin.exe /kcc * >> $ADCmdletDestination
Muestra la última copia de seguridad de AD
C:\Windows\System32\repadmin.exe /showbackup * >> $ADCmdletDestination
Comprueba el estado de replicación de la última replicación entrante
C:\Windows\System32\repadmin.exe /showrepl * >> $ADCmdletDestination
Muestra cualquier solicitud entrante en cola
C:\Windows\System32\repadmin.exe /queue * >> $ADCmdletDestination
Comprueba los servidores AD Bridgehead en busca de problemas
C:\Windows\System32\repadmin.exe /bridgeheads * /verbose >> $ADCmdletDestination
Devuelve el servidor del Generador de topología entre sitios (ISTG)
C:\Windows\System32\repadmin.exe /istg * /verbose >> $ADCmdletDestination
"Una lista de las entradas en la caché de DS Bind."
C:\Windows\System32\repadmin.exe /showoutcalls * >> $ADCmdletDestination
Enumera errores de KCC
C:\Windows\System32\repadmin.exe /failcache * >> $ADCmdletDestination
Enumera las confianzas de AD conocidas
C:\Windows\System32\repadmin.exe /showtrust * >> $ADCmdletDestination
Muestra funciones de replicación para un controlador de dominio
C:\Windows\System32\repadmin.exe /bind * >> $ADCmdletDestination
En general, si hay problemas, estos comandos deberían mostrar algo que no es correcto. Por ejemplo, si el tiempo de un DC no está disponible, el resumen de replicación mostrará errores de sincronización. Incluso podemos ver un DC que ha sido Tombstone porque no se ha replicado dentro del límite de tiempo configurado de Tombstone. También se descubrirán mensajes de error del registro de eventos y ayudarán con el análisis de la causa raíz.
Ejemplo del modificador /replsummary
dcdiag
Con la herramienta dcdiag, podemos ejecutar una serie de pruebas de Controlador de Dominio que ayudarán a determinar la ayuda relativa de cada DC. La siguiente línea ejecutará todas las pruebas de dcdiag como se describe aquí [/c], ejecutará las pruebas para todos los DC, sin importar el sitio en el que se encuentre [/e] y utilizará una salida detallada [/v]. Tenga en cuenta que el resultado del comando también se exporta a un archivo para su análisis. Tenga en cuenta que en entornos más grandes, esto puede llevar tiempo ejecutarlo y también analizar los resultados exportados.
dcdiag /c /e /v >> $ADCmdletDestinationSalida de pantalla de muestra
Mientras tanto, existen algunos reemplazos directos para estas herramientas dentro de PowerShell; sin embargo, al momento de escribir este artículo, estos cmdlets brindan una vista más profunda de la replicación de AD para fines de solución de problemas.
Estado del DNS
DNS es importante para la salud de Active Directory y los administradores pueden probar su servidor DNS con algunas herramientas. Con PowerShell nativo, tenemos un cmdlet 'Test-DNSServer' que es bastante limitado pero que puede proporcionar una prueba rápida de un servidor DNS en particular.
Ejemplo de 'Test-DnsServer' cmdlet
Sin embargo, para profundizar un poco más, podemos usar PowerShell para ejecutar herramientas de Windows y profundizar desde DNSLint hasta dcdiag, ya que estas herramientas siguen siendo válidas incluso con PowerShell.
$DC = Get-ADDomainController $Env:ComputerName
$IPs = @()
$IPs = $DC.IPv4Address
$Server = $IPs[0]
$DNSLint = .\DNSLint.exe /ad $Server /s $Server /r dnslint /no_open /y
Para obtener aún más información, podemos usar dcdiag para probar la funcionalidad del servidor DNS.
Ejemplo de informe de errores de DNSLint
Function GetInfo {
DCDiag /s:$DC /Test:dns /v /q /i /x:$DNSXMLDestination
$Data = @($DC,$Domain,$Site)
$Xml = $DNSXMLDestination
[Xml]$DCDiag = Get-Content $xml
$Summary = $dcdiag.DCDIAGTestResults.DNSEnterpriseTestResults.Summary.Domain.DC.test
Foreach ($line2 in $summary) {
$Data += @($Line2.Status)
}
$Rowline = $Data -join ","
Add-Content $DNSDestination $Rowline
$Rowline = $Null
}
# Main Script Body
$DNSDestination = 'DNSTestResults.csv'
$DNSXMLDestination = 'DNSTestResults.xml'
$Rows = "DC," + "Domain," + "Site," + "Auth," + "Basc," + "Forw," + "Del," + "Dyn," + "Rreg," + "Ext"
Add-Content -Path $DNSDestination $Rows
$Domains = (Get-ADForest).Domains
Foreach ($Domain in $Domains) {
$DomainControllers = Get-ADDomainController -Server $Domain -Filter *
Foreach ($Line in $DomainControllers) {
$Dc = $Line.HostName
$Domain = $Line.Domain
$Site = $Line.Site
GetInfo
}
}
Usando ambos scripts, ahora podemos obtener una imagen del DNS y, al revisar los registros, se puede validar la infraestructura del DNS.
Archivo de resultados DCDiag de muestra
Configuración de la red
Un controlador de dominio con DHCP habilitado o con demasiadas puertas de enlace puede causar todo tipo de problemas con la replicación, la autenticación de usuarios y problemas de aplicaciones. Tener una buena comprensión de cómo está configurado cada servidor puede ayudar a un administrador a localizar un problema con sus controladores de dominio. El siguiente script examinará cada tarjeta de interfaz de red (NIC) en un servidor e informará las propiedades para su validación:
# Variables
$Rows = 'Computer,' + 'IPAddress,' + 'Subnet Mask,' + 'Default Gateway,' + 'DHCP,' + 'DNS Servers'
$NICDestination = 'DC-NetworkConfig.csv'
Add-Content -Path $NICDestination $Rows
$Domains = (Get-ADForest).Domains
Foreach ($Domain in $Domains) {
$Rows = "Domain - $Domain"
Add-Content -Path $NICDestination $Rows
$DomainControllers = Get-ADDomainController -Server $Domain -Filter *
# Foreach ($Computer in $ComputerNames) {
Foreach ($DomainController in $DomainControllers) {
$Computer = $DomainController.HostName
$Server = $DomainController.Name
$Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $Computer -EA Stop |
Where-Object { $_.IPEnabled }
Foreach ($Network in $Networks) {
$IPAddress = $Network.IpAddress[0]
$SubnetMask = $Network.IPSubnet[0]
$DefaultGateway = $Network.DefaultIPGateway
$DNSServers = $Network.DNSServerSearchOrder
$IsDHCPEnabled = $false
If ($Network.DHCPEnabled) {
$IsDHCPEnabled = $true
}
$MACAddress = $Network.MACAddress
$OutputObj = New-Object -Type PSObject
$OutputObj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $Server.ToUpper()
$OutputObj | Add-Member -MemberType NoteProperty -Name IPAddress -Value $IPAddress
$OutputObj | Add-Member -MemberType NoteProperty -Name SubnetMask -Value $SubnetMask
$OutputObj | Add-Member -MemberType NoteProperty -Name Gateway -Value ($DefaultGateway -join ',')
$OutputObj | Add-Member -MemberType NoteProperty -Name IsDHCPEnabled -Value $IsDHCPEnabled
$OutputObj | Add-Member -MemberType NoteProperty -Name DNSServers -Value ($DNSServers -join ',')
$OutputObj | Format-Table -AutoSize
$Row = "$Server," + "$IPAddress," + "$SubnetMask," + "$DefaultGateway," + "$ISDHCPEnabled," + "$DNSServers"
Add-Content -Path $NICDestination $Row
}
}
}
Salida de muestra (observe que todos los controladores de dominio apuntan a un controlador de dominio central y a ellos mismos para DNS)
Esta configuración puede ser la deseada, o podría ser una mala configuración dependiendo del entorno y/o los objetivos de TI.
Replicación estricta
Para evitar la corrupción en Active Directory, una característica introducida en Windows 2003, sigue siendo una configuración necesaria y que vale la pena mantener habilitada. Cuando hay problemas de replicación y posiblemente objetos antiguos persistentes en AD, es bueno verificar qué DC tienen esto configurado y cuáles no. Como práctica recomendada, esto debería estar habilitado. Consulte este artículo como referencia.
Usando el siguiente código, podemos verificar la configuración de 'consistencia de replicación estricta' para todos los controladores de dominio en un dominio:
$DCs = (Get-ADDomainController -Filter *).Name | Sort-Object
Foreach ($DC in $DCs) {
$Script = {
$Name = 'Strict Replication Consistency'
$RegistryPath = 'HKLM:\System\CurrentControlSet\Services\NTDS\Parameters\'
$Val = (Get-ItemProperty -Path $RegistryPath -Name $Name).$Name Return $Val
}
$StrictCheck = Invoke-Command -ComputerName $DC -ScriptBlock $Script
If ($StrictCheck -eq '1') {
Write-Host " * Strict Replication Consistency is enabled on the $DC Domain Controller." -ForegroundColor Cyan
}
Else {
Write-Host " * Strict Replication Consistency is disabled on the $DC Domain Controller." -ForegroundColor Yellow
}
}
Resultados reales de este bloque de código de PowerShell
Si necesita verificar varios bosques/dominios, será necesario realizar algunos ajustes en el código.
Analizadores de mejores prácticas
Por último, los servidores Windows incluyen un Analizador de mejores prácticas integrado para cada función instalada en un servidor. A continuación se muestran dos ejemplos:
GUI de Active Directory y DNS BPA
También se puede acceder a ellos con PowerShell con Invoke-BPAModule y Get-BPAResult. Los BPA funcionan con un sistema de "modelos" que corresponden a la función de Windows que está instalada en un servidor. Por ejemplo, la función DNS tiene un nombre de modelo DNSServer y el modelo de AD-Domain-Services es DirectoryServices. Podemos obtener estos nombres de modelos del cmdlet Get-BPAModel para ayudar a deletrearlos. En el siguiente código, consultamos dos roles (DNS y DC) y, si están instalados, el nombre del modelo para cada uno se agrega a una variable para ser procesada por los dos cmdlets mencionados anteriormente. Ahora, el resultado de este esfuerzo da como resultado un archivo CSV para cada modelo BPA que se ejecutó.
Sample Code:
# Variables
$FilePath = (Get-Item -Path ".\" -Verbose).FullName
$Server = $Env:ComputerName
$BPA = @()
If ((Get-WindowsFeature AD-Domain-Services).Installed) {$BPA += "Microsoft/Windows/DirectoryServices"}
If ((Get-WindowsFeature DNS).Installed) {$BPA += "Microsoft/Windows/DNSServer"}
Foreach ($Model in $bpa) {
$Name = $Model.Replace("Microsoft/Windows/","")
$CSV = "BPA-Results-$Name-$Server.csv"
Invoke-BPAModel $Model -ErrorAction SilentlyContinue
Get-BPAResult -BestPracticesModelId $Model -ErrorAction SilentlyContinue |
Where-Object {$_.Problem -ne $Null} |
Select-Object ResultNumber,Severity,Category,Title,Problem,Impact,Resolution |
Export-Csv $CSV -NoTypeInformation -Encoding UTF8
}
Conclusión
Si bien este artículo no proporciona PowerShell para cada escenario, sí cubre los conceptos básicos de cómo se puede usar PowerShell, incluso junto con herramientas que no son PowerShell, en escenarios de solución de problemas. Active Directory, por su propia naturaleza, puede ser muy complejo y, debido a esta complejidad, a menudo se utiliza una variedad de herramientas para solucionar problemas. A veces, las pistas las proporcionan problemas con las aplicaciones, la frustración del usuario o las notificaciones del software de seguimiento. Al final, depende del administrador elegir la mejor herramienta para el trabajo y, en ocasiones, descartar una dirección particular de solución de problemas, retroceder y comenzar de nuevo con nuevas herramientas, scripts, etc. para resolver un problema. PowerShell puede proporcionar mucha información y depender de herramientas heredadas para estos escenarios. ¡Feliz cacería!









