Dimarts, febrer 10, 2026
SCRIPTING

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 ""
             } 

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *