PowerShell Code

Get-ADUserReport.ps1

View-only PowerShell code for review.

<#
.SYNOPSIS
    Checks the health of specified Domain Controllers.

.DESCRIPTION
    Tests connectivity, verifies the NTDS service status, checks replication health,
    and reports the last reboot time for each specified Domain Controller.

.EXAMPLE
    .\DCPreboot-HealthCheck.ps1

.INPUTS
    None.

.OUTPUTS
    Screen output showing DC health results.

.NOTES
    Requires the ActiveDirectory module and appropriate permissions.
    Update the $servers array with the Domain Controllers you want to check.
#>

Import-Module ActiveDirectory -ErrorAction Stop

$servers = @(
    "DC_Name_1.DCnameonyourdomain.net",
    "DC_Name_2.DCnameonyourdomain.net",
    "DC_Name_3.DCnameonyourdomain.net"
)

foreach ($server in $servers) {
    Write-Host "Checking health of $server..."

    # Test connectivity
    if (-not (Test-Connection -ComputerName $server -Count 1 -Quiet)) {
        Write-Host "$server is not responding to ping."
        Write-Host "-------------------------------------------"
        continue
    }

    Write-Host "$server is responding to ping."

    # Check NTDS service
    try {
        $service = Get-CimInstance -ClassName Win32_Service -ComputerName $server -Filter "Name='NTDS'" -ErrorAction Stop

        if ($null -eq $service) {
            Write-Host "NTDS service not found on $server."
            Write-Host "-------------------------------------------"
            continue
        }

        if ($service.State -ne "Running") {
            Write-Host "NTDS service is not running on $server (Status: $($service.State))."
            Write-Host "-------------------------------------------"
            continue
        }

        Write-Host "NTDS service is running on $server."
    }
    catch {
        Write-Host "Unable to check NTDS service on $server. Error: $($_.Exception.Message)"
        Write-Host "-------------------------------------------"
        continue
    }

    # Check replication health
    try {
        $replicationHealthy = $true
        $partners = Get-ADReplicationPartnerMetadata -Target $server -ErrorAction Stop

        if (-not $partners) {
            Write-Host "No replication partner metadata returned for $server."
            $replicationHealthy = $false
        }
        else {
            foreach ($partner in $partners) {
                if ($partner.LastReplicationResult -ne 0) {
                    $replicationHealthy = $false
                    Write-Host "Replication issue detected with partner $($partner.Partner) on $server. LastReplicationResult: $($partner.LastReplicationResult)"
                }
            }
        }

        if ($replicationHealthy) {
            Write-Host "Replication is healthy on $server."
        }
        else {
            Write-Host "Replication is NOT healthy on $server."
        }
    }
    catch {
        Write-Host "Unable to check replication health on $server. Error: $($_.Exception.Message)"
    }

    # Get last reboot time
    try {
        $os = Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $server -ErrorAction Stop
        $lastBoot = $os.LastBootUpTime
        $uptimeDays = (New-TimeSpan -Start $lastBoot -End (Get-Date)).Days

        Write-Host "Last reboot time for ${server}: $lastBoot ($uptimeDays days ago)"
    }
    catch {
        Write-Host "Unable to retrieve last reboot time for ${server}. Error: $($_.Exception.Message)"
    }

    Write-Host "Health check completed for $server."
    Write-Host "-------------------------------------------"
}

Write-Host "All specified DCs have been checked."