359 lines
16 KiB
PowerShell

<#PSScriptInfo
.VERSION 1.2
.GUID
.AUTHOR Hubert Cornet
.COMPANYNAME
.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[]]$MailReport = $(Read-Host "Entrer l'adresse mail du ou des destinataire(s) (séparés par une virgule) pour recevoir le rapport"),
$timeout = "120"
)
###########################Define Variables##################################
$MailReport = $MailReport -split ','
$Report = ".\AD-Report.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 "<html>"
Add-Content $Report " <head>"
Add-Content $Report " <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>"
Add-Content $Report ' <title> Rapport Status Active Directory </title>'
Add-Content $Report ' <STYLE TYPE="text/css">'
Add-Content $Report " <!--"
Add-Content $Report " td {"
Add-Content $Report " font-family: Tahoma;"
Add-Content $Report " font-size: 11px;"
Add-Content $Report " border-top: 1px solid #999999;"
Add-Content $Report " border-right: 1px solid #999999;"
Add-Content $Report " border-bottom: 1px solid #999999;"
Add-Content $Report " border-left: 1px solid #999999;"
Add-Content $Report " padding-top: 0px;"
Add-Content $Report " padding-right: 0px;"
Add-Content $Report " padding-bottom: 0px;"
Add-Content $Report " padding-left: 0px;"
Add-Content $Report " }"
Add-Content $Report " body {"
Add-Content $Report " margin-left: 5px;"
Add-Content $Report " margin-top: 5px;"
Add-Content $Report " margin-right: 0px;"
Add-Content $Report " margin-bottom: 10px;"
Add-Content $Report " }"
Add-Content $Report " table {"
Add-Content $Report " border: thin solid #000000;"
Add-Content $Report " }"
Add-Content $Report " -->"
Add-Content $Report " </style>"
Add-Content $Report " </head>"
Add-Content $Report " <body>"
Add-Content $Report " <table width='100%'>"
Add-Content $Report " <tr bgcolor='Lavender'>"
Add-Content $Report " <td colspan='7' height='25' align='center'>"
Add-Content $Report " <font face='tahoma' color='#003399' size='4'><strong> Active Directory Check Health </strong></font>"
Add-Content $Report " </td>"
Add-Content $Report " </tr>"
Add-Content $Report " </table>"
Add-Content $Report " <table width='100%'>"
Add-Content $Report " <tr bgcolor='IndianRed'>"
Add-Content $Report " <td width='5%' align='center'><B> Identite </B></td>"
Add-Content $Report " <td width='10%' align='center'><B> Status du ping </B></td>"
Add-Content $Report " <td width='10%' align='center'><B> Service Netlogon </B></td>"
Add-Content $Report " <td width='10%' align='center'><B> Service NTDS </B></td>"
Add-Content $Report " <td width='10%' align='center'><B> Status Service DNS </B></td>"
Add-Content $Report " <td width='10%' align='center'><B> Test Netlogons </B></td>"
Add-Content $Report " <td width='10%' align='center'><B> Test Replication </B></td>"
Add-Content $Report " <td width='10%' align='center'><B> Test Services </B></td>"
Add-Content $Report " <td width='10%' align='center'><B> Test Advertising </B></td>"
Add-Content $Report " <td width='10%' align='center'><B> Test Check FSMO </B></td>"
Add-Content $Report " </tr>"
################Ping Test################################################################
Foreach ($DC in $DCServers) {
$Identity = $DC
Add-Content $Report " <tr>"
If ( Test-Connection -ComputerName $DC -Count 1 -ErrorAction SilentlyContinue ) {
Write-Host $DC `t $DC `t Ping Success -ForegroundColor Green
Add-Content $Report " <td bgcolor= 'GainsBoro' align=center><B> $Identity </B></td>"
Add-Content $Report " <td bgcolor= 'Aquamarine' align=center><B> OkK </B></td>"
##############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 " <td bgcolor= 'Yellow' align=center><B> Timeout Netlogon </B></td>"
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 " <td bgcolor= 'Aquamarine' align=center><B> $svcState </B></td>"
}
Else {
Write-Host $DC `t $serviceStatus1.name `t $serviceStatus1.status -ForegroundColor Red
$svcName = $serviceStatus1.name
$svcState = $serviceStatus1.status
Add-Content $Report " <td bgcolor= 'Red' align=center><B> $svcState </B></td>"
}
}
##############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 " <td bgcolor= 'Yellow' align=center><B> Timeout NTDS </B></td>"
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 " <td bgcolor= 'Aquamarine' align=center><B> $svcState </B></td>"
}
Else {
Write-Host $DC `t $serviceStatus1.name `t $serviceStatus1.status -ForegroundColor Red
$svcName = $serviceStatus1.name
$svcState = $serviceStatus1.status
Add-Content $Report " <td bgcolor= 'Red' align=center><B> $svcState </B></td>"
}
}
##############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 " <td bgcolor= 'Yellow' align=center><B> Timeout DNS </B></td>"
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 " <td bgcolor= 'Aquamarine' align=center><B> $svcState </B></td>"
}
Else {
Write-Host $DC `t $serviceStatus1.name `t $serviceStatus1.status -ForegroundColor Red
$svcName = $serviceStatus1.name
$svcState = $serviceStatus1.status
Add-Content $Report " <td bgcolor= 'Red' align=center><B> $svcState </B></td>"
}
}
####################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 " <td bgcolor= 'Yellow' align=center><B> Timeout Netlogons </B></td>"
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 " <td bgcolor= 'Aquamarine' align=center><B> Netlogons OK </B></td>"
}
Else {
Write-Host $DC `t Netlogons Test Failed -ForegroundColor Red
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Netlogons Echec </B></td>"
}
}
####################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 " <td bgcolor= 'Yellow' align=center><B> Timeout Replications </B></td>"
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 " <td bgcolor= 'Aquamarine' align=center><B> Replications OK </B></td>"
}
Else {
Write-Host $DC `t Replications Test Failed -ForegroundColor Red
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Replications Echec </B></td>"
}
}
####################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 " <td bgcolor= 'Yellow' align=center><B> Timeout Services </B></td>"
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 " <td bgcolor= 'Aquamarine' align=center><B> Services OK</B></td>"
}
Else {
Write-Host $DC `t Services Test Failed -ForegroundColor Red
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Services Echec </B></td>"
}
}
####################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 " <td bgcolor= 'Yellow' align=center><B> Advertising Timeout </B></td>"
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 " <td bgcolor= 'Aquamarine' align=center><B> Advertising OK </B></td>"
}
Else {
Write-Host $DC `t Advertising Test Failed -ForegroundColor Red
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Advertising Echec </B></td>"
}
}
####################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 " <td bgcolor= 'Yellow' align=center><B> Timeout Check FSMO </B></td>"
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 " <td bgcolor= 'Aquamarine' align=center><B>Check FSMO OK </B></td>"
}
Else {
Write-Host $DC `t FSMOCheck Test Failed -ForegroundColor Red
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Check FSMO Echec </B></td>"
}
}
}
Else {
Write-Host $DC `t $DC `t Ping Fail -ForegroundColor Red
Add-Content $Report " <td bgcolor= 'GainsBoro' align=center> <B> $Identity </B></td>"
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Ping Echec </B></td>"
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Ping Echec </B></td>"
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Ping Echec </B></td>"
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Ping Echec </B></td>"
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Ping Echec </B></td>"
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Ping Echec </B></td>"
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Ping Echec </B></td>"
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Ping Echec </B></td>"
Add-Content $Report " <td bgcolor= 'Red' align=center><B> Ping Echec </B></td>"
}
}
Add-Content $Report " </tr>"
############################################Close HTMl Tables###########################
Add-Content $Report " </table>"
Add-Content $Report " </body>"
Add-Content $Report "</html>"
#############################################Send Email#################################
If (($Smtphost) -and ($MailReport) -and ($From)) {
[string]$body = Get-Content $Report
Send-MailMessage -SmtpServer $Smtphost -From $From -To $MailReport -Subject "Active Directory Health Monitor" -Body $body -BodyAsHtml
}