diff --git a/Active Directory/Active Directory Health Check/ADHealthCheck.ps1 b/Active Directory/Active Directory Health Check/ADHealthCheck.ps1 new file mode 100644 index 0000000..3a09747 --- /dev/null +++ b/Active Directory/Active Directory Health Check/ADHealthCheck.ps1 @@ -0,0 +1,360 @@ +<#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################################################# +######################################################################################## + + + \ No newline at end of file