The system requirements for Exchange Server 2013 include the following for Active Directory:
Using PowerShell we can retrieve all of this information quickly.
Here is a script that breaks a whole lot of PowerShell “rules” but gets the job done.
The script requires the ActiveDirectory PowerShell module, and in a multi-domain forest should be run in the forest root domain with an admin account that can access each domain.
<# .SYNOPSIS Get-ADInfo.ps1 - PowerShell script to collect Active Directory information .DESCRIPTION This PowerShell Script collects some basic information about an Active Directory environment that is useful for verifying the pre-requisites for an Exchange Server deployment or upgrade. .OUTPUTS Results are output to the console and to a HTML file. .EXAMPLE .\Get-ADInfo.ps1 Runs the script and generates the output. .NOTES Written by: Paul Cunningham Find me on: * My Blog: http://paulcunningham.me * Twitter: https://twitter.com/paulcunningham * LinkedIn: http://au.linkedin.com/in/cunninghamp/ * Github: https://github.com/cunninghamp For more Exchange Server tips, tricks and news check out Exchange Server Pro. * Website: http://exchangeserverpro.com * Twitter: http://twitter.com/exchservpro Change Log V1.00, 26/06/2015 - Initial version #> #requires -version 2 $htmlreport = $null $htmlbody = $null $htmlfile = "ADInfo.html" $spacer = "<br />" Import-Module ActiveDirectory #--------------------------------------------------------------------- # Collect AD Forest information and convert to HTML fragment #--------------------------------------------------------------------- $forest = Get-ADForest $htmlbody += "<h3>Forest Details</h3>" $forestinfo = New-Object PSObject Write-Host -ForeGroundColor Yellow "*** Forest: $($forest.RootDomain) ***" Write-Host "" $forestinfo | Add-Member NoteProperty -Name "Forest" -Value $($forest.RootDomain) Write-Host "Forest Mode: $($forest.ForestMode)" $forestinfo | Add-Member NoteProperty -Name "Forest Mode" -Value $($forest.ForestMode) Write-Host "Schema Master: $($forest.SchemaMaster)" $forestinfo | Add-Member NoteProperty -Name "Schema Master" -Value $($forest.SchemaMaster) Write-Host "Domain Naming Master: $($forest.DomainNamingMaster)" $forestinfo | Add-Member NoteProperty -Name "Domain Naming Master" -Value $($forest.DomainNamingMaster) Write-Host "Additional UPN Suffixes: $($forest.UPNSuffixes)" $forestinfo | Add-Member NoteProperty -Name "Additional UPN Suffixes" -Value $($forest.UPNSuffixes) $htmlbody += $forestinfo | ConvertTo-Html -Fragment $htmlbody += $spacer #--------------------------------------------------------------------- # Collect AD Domain information and convert to HTML fragment #--------------------------------------------------------------------- $htmlbody += "<h3>Domain Details</h3>" $domains = @($forest | Select -ExpandProperty:Domains) Foreach ($domain in $domains) { Write-Host "" Write-Host -ForeGroundColor Yellow "*** Domain: $domain ***" Write-Host "" $domaindetails = Get-ADDomain $domain $domaininfo = New-Object PSObject $domaininfo | Add-Member NoteProperty -Name "Name" -Value $domaindetails.Name Write-Host "NetBIOS Name: $($domaindetails.NetBIOSName)" $domaininfo | Add-Member NoteProperty -Name "NetBIOS Name" -Value $domaindetails.NetBIOSName Write-Host "Domain Mode: $($domaindetails.DomainMode)" $domaininfo | Add-Member NoteProperty -Name "Mode" -Value $($domaindetails.DomainMode) Write-Host "PDC Emulator: $($domaindetails.PDCEmulator)" $domaininfo | Add-Member NoteProperty -Name "PDC Emulator" -Value $($domaindetails.PDCEmulator) Write-Host "Infrastructure Master: $($domaindetails.InfrastructureMaster)" $domaininfo | Add-Member NoteProperty -Name "Infrastructure Master" -Value $($domaindetails.InfrastructureMaster) Write-Host "RID Master: $($domaindetails.RIDMaster)" $domaininfo | Add-Member NoteProperty -Name "RID Master" -Value $($domaindetails.RIDMaster) $htmlbody += $domaininfo | ConvertTo-Html -Fragment $htmlbody += $spacer } $htmlbody += "<h3>Global Catalog Servers by Site/OS</h3>" $domaincontrollers = @(Get-ADDomainController -Filter {IsGlobalCatalog -eq $true}) $gcs = @($domaincontrollers | Group-Object -Property:Site,OperatingSystem | Select @{Expression="Name";Label="Site, OS"},Count) Write-Host "" Write-Host -ForeGroundColor Yellow "*** Global Catalogs by Site/OS ***" $gcs = $gcs | Sort "Site, OS" $gcs | ft -auto $htmlbody += $gcs | ConvertTo-Html -Fragment Write-Verbose "Producing HTML report" $reportime = Get-Date #Common HTML head and styles $htmlhead="<html> <style> BODY{font-family: Arial; font-size: 8pt;} H1{font-size: 20px;} H2{font-size: 18px;} H3{font-size: 16px;} TABLE{border: 1px solid black; border-collapse: collapse; font-size: 8pt;} TH{border: 1px solid black; background: #dddddd; padding: 5px; color: #000000;} TD{border: 1px solid black; padding: 5px; } td.pass{background: #7FFF00;} td.warn{background: #FFE600;} td.fail{background: #FF0000; color: #ffffff;} td.info{background: #85D4FF;} </style> <body> <h1 align=""center"">Active Directory Information</h1> <h3 align=""center"">Generated: $reportime</h3>" $htmltail = "</body> </html>" $htmlreport = $htmlhead + $htmlbody + $htmltail $htmlreport | Out-File $htmlfile -Encoding Utf8