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