<#PSScriptInfo .VERSION 1.0 .GUID 30c7c087-1268-4d21-8bf7-ee25c37459b0 .AUTHOR Vikas Sukhija .COMPANYNAME TechWizard.cloud .COPYRIGHT .TAGS .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES h .PRIVATEDATA #> <# .DESCRIPTION Date: 18/10/2023 Active Directory Health Status Check Satus: Ping,Netlogon,NTDS,DNS,DCdiag Test(Replication,sysvol,Services) #> ###############################Paramters#################################### param ( [string]$Smtphost = $(Read-Host "Entrer l'addresse du serveur SMTP : "), [string]$from = $(Read-Host "Entrer l'adresse mail de l'expéditeur : "), [String[]]$EmailReport = $(Read-Host "Entrer l'adresse mail du ou des destinataire(s) (séparés par une virgule) pour recevoir le rapport"), $timeout = "60" ) ###########################Define Variables################################## $EmailReport = $EmailReport -split ',' $report = ".\ADReport.htm" if((test-path $report) -like $false) { new-item $report -type file } #####################################Get ALL DC Servers####################### $getForest = [system.directoryservices.activedirectory.Forest]::GetCurrentForest() $DCServers = $getForest.domains | ForEach-Object {$_.DomainControllers} | ForEach-Object {$_.Name} ###############################HTml Report Content############################ Clear-Content $report Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report 'AD Status Report' add-content $report '" Add-Content $report "" Add-Content $report "" add-content $report "" add-content $report "" add-content $report "" add-content $report "" add-content $report "
" add-content $report "Active Directory Health Check" add-content $report "
" add-content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" ################Ping Test################################################################ Foreach ($DC in $DCServers){ $Identity = $DC Add-Content $report "" If ( Test-Connection -ComputerName $DC -Count 1 -ErrorAction SilentlyContinue ) { Write-Host $DC `t $DC `t Ping Success -ForegroundColor Green Add-Content $report "" Add-Content $report "" ##############Netlogon Service Status################ $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 Netlogon Service TimeOut -ForegroundColor Yellow Add-Content $report "" 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 Add-Content $report "" } else { Write-Host $DC `t $serviceStatus1.name `t $serviceStatus1.status -ForegroundColor Red $svcName = $serviceStatus1.name $svcState = $serviceStatus1.status Add-Content $report "" } } ###################################################### ##############NTDS Service Status################ $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 NTDS Service TimeOut -ForegroundColor Yellow Add-Content $report "" 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 Add-Content $report "" } else { Write-Host $DC `t $serviceStatus1.name `t $serviceStatus1.status -ForegroundColor Red $svcName = $serviceStatus1.name $svcState = $serviceStatus1.status Add-Content $report "" } } ###################################################### ##############DNS Service Status################ $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 DNS Server Service TimeOut -ForegroundColor Yellow Add-Content $report "" 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 Add-Content $report "" } else { Write-Host $DC `t $serviceStatus1.name `t $serviceStatus1.status -ForegroundColor Red $svcName = $serviceStatus1.name $svcState = $serviceStatus1.status Add-Content $report "" } } ###################################################### ####################Netlogons status################## 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 Add-Content $report "" stop-job $sysvol } else { $sysvol1 = Receive-job $sysvol if($cmp::instr($sysvol1, "passed test NetLogons")) { Write-Host $DC `t Netlogons Test passed -ForegroundColor Green Add-Content $report "" } else { Write-Host $DC `t Netlogons Test Failed -ForegroundColor Red Add-Content $report "" } } ######################################################## ####################Replications status################## 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 Replications Test TimeOut -ForegroundColor Yellow Add-Content $report "" stop-job $sysvol } else { $sysvol1 = Receive-job $sysvol if($cmp::instr($sysvol1, "passed test Replications")) { Write-Host $DC `t Replications Test passed -ForegroundColor Green Add-Content $report "" } else { Write-Host $DC `t Replications Test Failed -ForegroundColor Red Add-Content $report "" } } ######################################################## ####################Services status################## 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 Add-Content $report "" stop-job $sysvol } else { $sysvol1 = Receive-job $sysvol if($cmp::instr($sysvol1, "passed test Services")) { Write-Host $DC `t Services Test passed -ForegroundColor Green Add-Content $report "" } else { Write-Host $DC `t Services Test Failed -ForegroundColor Red Add-Content $report "" } } ######################################################## ####################Advertising status################## 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 Add-Content $report "" stop-job $sysvol } else { $sysvol1 = Receive-job $sysvol if($cmp::instr($sysvol1, "passed test Advertising")) { Write-Host $DC `t Advertising Test passed -ForegroundColor Green Add-Content $report "" } else { Write-Host $DC `t Advertising Test Failed -ForegroundColor Red Add-Content $report "" } } ######################################################## ####################FSMOCheck status################## 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 Add-Content $report "" stop-job $sysvol } else { $sysvol1 = Receive-job $sysvol if($cmp::instr($sysvol1, "passed test FsmoCheck")) { Write-Host $DC `t FSMOCheck Test passed -ForegroundColor Green Add-Content $report "" } else { Write-Host $DC `t FSMOCheck Test Failed -ForegroundColor Red Add-Content $report "" } } ######################################################## } else { Write-Host $DC `t $DC `t Ping Fail -ForegroundColor Red Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" Add-Content $report "" } } Add-Content $report "" ############################################Close HTMl Tables########################### Add-content $report "
IdentityPingSTatusNetlogonServiceNTDSServiceDNSServiceStatusNetlogonsTestReplicationTestServicesTestAdvertisingTestFSMOCheckTest
$Identity SuccessNetlogonTimeout$svcState$svcStateNTDSTimeout$svcState$svcStateDNSTimeout$svcState$svcStateNetlogonsTimeoutNetlogonsPassedNetlogonsFailReplicationsTimeoutReplicationsPassedReplicationsFailServicesTimeoutServicesPassedServicesFailAdvertisingTimeoutAdvertisingPassedAdvertisingFailFSMOCheckTimeoutFSMOCheckPassedFSMOCheckFail $Identity Ping Fail Ping Fail Ping Fail Ping Fail Ping Fail Ping Fail Ping Fail Ping Fail Ping Fail
" Add-Content $report "" Add-Content $report "" ######################################################################################## #############################################Send Email################################# if(($Smtphost) -and ($EmailReport) -and ($from)){ [string]$body = Get-Content $report Send-MailMessage -SmtpServer $Smtphost -From $from -To $EmailReport -Subject "Active Directory Health Monitor" -Body $body -BodyAsHtml } ####################################EnD################################################# ########################################################################################