Script per verificar l’estat del Directori Actiu
Aquí tenim un script que mostra informació bàsica del Directori Actiu i de l’estat dels seus serveis; és el fruit de la recopilació i adaptació de diferents scripts que recopilen la informació i comproven l’estat de salut del nostre Directori Actiu. El resultat és similar a això:

###########################Informació del domini#######################
###########################Definir les variables#######################
$Maquines = (Get-ADComputer -Filter *).count
$PCs = (Get-ADComputer -LDAPFilter "(&(objectClass=Computer)(!operatingSystem=*server*))" -Searchbase (Get-ADDomain).distinguishedName).count
$Servidors = (Get-ADComputer -LDAPFilter "(&(objectClass=Computer)(operatingSystem=*server*))" -Searchbase (Get-ADDomain).distinguishedName).count
$Usuaris = (get-aduser -filter *).count
$domain = Get-ADDomain |FT Forest
$FSMO = netdom query FSMO
$ADForest = (Get-ADForest).ForestMode
$ADDomain = (Get-ADDomain).DomainMode
$ADVer = Get-ADObject (Get-ADRootDSE).schemaNamingContext -property objectVersion | Select objectVersion
$ADNUM = $ADVer -replace "@{objectVersion=","" -replace "}",""
switch ($ADNum)
{
88 {$srv = 'Windows Server 2019'}
87 {$srv = 'Windows Server 2016'}
69 {$srv = 'Windows Server 2012 R2'}
56 {$srv = 'Windows Server 2012'}
47 {$srv = 'Windows Server 2008 R2'}
44 {$srv = 'Windows Server 2008'}
31 {$srv = 'Windows Server 2003 R2'}
30 {$srv = 'Windows Server 2003'}
}
$srv
###########################Mostrar la informació#######################
Write-host ""
Write-Host "En aquest domini hi ha:" -ForegroundColor Yellow
Write-host ""
Write-Host "$Usuaris comptes d'usuaris " -ForegroundColor Cyan
Write-Host "$Maquines comptes de màquina, de les quals" -ForegroundColor Cyan
Write-Host "$PCs són PCs" -ForegroundColor Cyan
Write-Host "$Servidors són servidors" -ForegroundColor Cyan
Write-host ""
Write-host "Informació del Directori Actiu" -ForegroundColor Yellow
Write-host ""
Write-Host "Mode del bosc del Directori Actiu: "$ADForest -ForegroundColor Cyan
Write-Host "Mode del domini del Directori Actiu: "$ADDomain -ForegroundColor Cyan
Write-Host "La versió de l'esquema del Directori Actiu és $ADNum , que correspon a $Srv" -ForegroundColor Cyan
Write-Host ""
Write-Host "Servidors amb els rols FSMO" -ForegroundColor Cyan
Write-Host ""
$FSMO
Write-Host "Estat del Directori Actiu" -ForegroundColor Yellow
Write-Host ""
#####################################Llistar els control·ladors de domini#################################
Write-Host "Control·ladors de domini" -ForegroundColor Cyan
Write-Host ""
$getForest = [system.directoryservices.activedirectory.Forest]::GetCurrentForest()
$DCServers = $getForest.domains | ForEach-Object {$_.DomainControllers} | ForEach-Object {$_.Name}
$timeout = "50"
foreach ($DC in $DCServers){
$Identity = $DC
if ( Test-Connection -ComputerName $DC -Count 1 -ErrorAction SilentlyContinue ) {
Write-Host $DC `t està disponible -ForegroundColor Green
Write-Host ""
Write-Host "Serveis de " $DC -ForegroundColor Cyan
Write-Host ""
#################Estat de Netlogon Service################
$serviceStatus = start-job -scriptblock {get-service -ComputerName $($args[0]) -Name "Netlogon" -ErrorAction SilentlyContinue} -ArgumentList $DC
wait-job $serviceStatus -timeout $timeout
if($serviceStatus.state -like "Running")
{
Write-Host $DC `t Servei de Netlogon TimeOut -ForegroundColor Yellow
stop-job $serviceStatus
}
else
{
$serviceStatus1 = Receive-job $serviceStatus
if ($serviceStatus1.status -eq "Running") {
Write-Host $DC `t $serviceStatus1.name `t $serviceStatus1.status -ForegroundColor Green
$svcName = $serviceStatus1.name
$svcState = $serviceStatus1.status
}
else
{
Write-Host $DC `t $serviceStatus1.name `t $serviceStatus1.status -ForegroundColor Red
$svcName = $serviceStatus1.name
$svcState = $serviceStatus1.status
}
}
}
##############Estat de NTDS Service################
$serviceStatus = start-job -scriptblock {get-service -ComputerName $($args[0]) -Name "NTDS" -ErrorAction SilentlyContinue} -ArgumentList $DC
wait-job $serviceStatus -timeout $timeout
if($serviceStatus.state -like "Running")
{
Write-Host $DC `t Servei de NTDS TimeOut -ForegroundColor Yellow
stop-job $serviceStatus
}
else
{
$serviceStatus1 = Receive-job $serviceStatus
if ($serviceStatus1.status -eq "Running") {
Write-Host $DC `t $serviceStatus1.name `t $serviceStatus1.status -ForegroundColor Green
$svcName = $serviceStatus1.name
$svcState = $serviceStatus1.status
}
else
{
Write-Host $DC `t $serviceStatus1.name `t $serviceStatus1.status -ForegroundColor Red
$svcName = $serviceStatus1.name
$svcState = $serviceStatus1.status
}
}
##############Estat de DNS Service################
$serviceStatus = start-job -scriptblock {get-service -ComputerName $($args[0]) -Name "DNS" -ErrorAction SilentlyContinue} -ArgumentList $DC
wait-job $serviceStatus -timeout $timeout
if($serviceStatus.state -like "Running")
{
Write-Host $DC `t Servei de DNS Server TimeOut -ForegroundColor Yellow
stop-job $serviceStatus
}
else
{
$serviceStatus1 = Receive-job $serviceStatus
if ($serviceStatus1.status -eq "Running") {
Write-Host $DC `t $serviceStatus1.name `t $serviceStatus1.status -ForegroundColor Green
$svcName = $serviceStatus1.name
$svcState = $serviceStatus1.status
}
else
{
Write-Host $DC `t $serviceStatus1.name `t $serviceStatus1.status -ForegroundColor Red
$svcName = $serviceStatus1.name
$svcState = $serviceStatus1.status
}
}
####################Prova de Netlogons##################
add-type -AssemblyName microsoft.visualbasic
$cmp = "microsoft.visualbasic.strings" -as [type]
$sysvol = start-job -scriptblock {dcdiag /test:netlogons /s:$($args[0])} -ArgumentList $DC
wait-job $sysvol -timeout $timeout
if($sysvol.state -like "Running")
{
Write-Host $DC `t Netlogons Test TimeOut -ForegroundColor Yellow
stop-job $sysvol
}
else
{
$sysvol1 = Receive-job $sysvol
if($cmp::instr($sysvol1, "passed test NetLogons"))
{
Write-Host $DC `t Prova de Netlogons correcta -ForegroundColor Green
}
else
{
Write-Host $DC `t Prova de Netlogons fallida -ForegroundColor Red
}
}
####################Estat de la replicació#################
add-type -AssemblyName microsoft.visualbasic
$cmp = "microsoft.visualbasic.strings" -as [type]
$sysvol = start-job -scriptblock {dcdiag /test:Replications /s:$($args[0])} -ArgumentList $DC
wait-job $sysvol -timeout $timeout
if($sysvol.state -like "Running")
{
Write-Host $DC `t Prova de replicació TimeOut -ForegroundColor Yellow
stop-job $sysvol
}
else
{
$sysvol1 = Receive-job $sysvol
if($cmp::instr($sysvol1, "passed test Replications"))
{
Write-Host $DC `t Prova de replicació correcta -ForegroundColor Green
}
else
{
Write-Host $DC `t Prova de replicació fallida -ForegroundColor Red
}
}
####################Prova de Services#####################
add-type -AssemblyName microsoft.visualbasic
$cmp = "microsoft.visualbasic.strings" -as [type]
$sysvol = start-job -scriptblock {dcdiag /test:Services /s:$($args[0])} -ArgumentList $DC
wait-job $sysvol -timeout $timeout
if($sysvol.state -like "Running")
{
Write-Host $DC `t Services Test TimeOut -ForegroundColor Yellow
stop-job $sysvol
}
else
{
$sysvol1 = Receive-job $sysvol
if($cmp::instr($sysvol1, "passed test Services"))
{
Write-Host $DC `t Prova de Services correcta -ForegroundColor Green
}
else
{
Write-Host $DC `t Prova de Services fallida -ForegroundColor Red
}
}
####################Prova d Advertising##################
add-type -AssemblyName microsoft.visualbasic
$cmp = "microsoft.visualbasic.strings" -as [type]
$sysvol = start-job -scriptblock {dcdiag /test:Advertising /s:$($args[0])} -ArgumentList $DC
wait-job $sysvol -timeout $timeout
if($sysvol.state -like "Running")
{
Write-Host $DC `t Advertising Test TimeOut -ForegroundColor Yellow
stop-job $sysvol
}
else
{
$sysvol1 = Receive-job $sysvol
if($cmp::instr($sysvol1, "passed test Advertising"))
{
Write-Host $DC `t Prova d Advertising correcta -ForegroundColor Green
}
else
{
Write-Host $DC `t Prova d Advertising fallida -ForegroundColor Red
}
}
####################Prova de FSMOCheck##################
add-type -AssemblyName microsoft.visualbasic
$cmp = "microsoft.visualbasic.strings" -as [type]
$sysvol = start-job -scriptblock {dcdiag /test:FSMOCheck /s:$($args[0])} -ArgumentList $DC
wait-job $sysvol -timeout $timeout
if($sysvol.state -like "Running")
{
Write-Host $DC `t FSMOCheck Test TimeOut -ForegroundColor Yellow
stop-job $sysvol
}
else
{
$sysvol1 = Receive-job $sysvol
if($cmp::instr($sysvol1, "passed test FsmoCheck"))
{
Write-Host $DC `t Prova de FSMOCheck correcta -ForegroundColor Green
}
else
{
Write-Host $DC `t Prova de FSMOCheck fallida -ForegroundColor Red
}
}
Write-Host ""
}

