To answer the question I could have made remote connections to a device in each office and pinged each other office, but with seventeen offices to test, that seemed laborious. Instead I turned to PowerShell, and created a script to do the work for me.
I decided that the easiest way to get the information I needed was to use every domain controller in my domain to ping every other DC - as we have a DC in every office this would give me a fairly good representation of ping times between sites.
The script uses the Test-Connection cmdlet to do the pinging, and utilises Start-Job to run all the ping tasks in parallel, saving a lot of time. The output is then stored in a CSV file which can easily be analysed.
# Get a list of DCs $Domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() $Nodes = $Domain.DomainControllers | Select-Object -ExpandProperty Name # Start the jobs $Jobs = @() ForEach ($Node in $Nodes) { $Jobs = $Jobs + (Start-Job -ArgumentList @($Node, $Nodes) -ScriptBlock {Test-Connection -Source $Args[0] -ComputerName $Args[1] -Count 10}) } # Output the jobs $Jobs # Wait for the jobs to finish $Jobs | Wait-Job # Get the output from the jobs $JobResults = Receive-Job $Jobs # Write the results to a CSV file $JobResults | Select-Object @{Name='Source';Expression={$_.__SERVER}}, @{Name='Destination';Expression={$_.Address.ToString().ToUpper().Split('.')[0]}}, ResponseTime | Export-Csv -Path "JobResults.csv" -NoType # Clean up Remove-Job $JobsDownload Script
There are a few points to note about this script:
- The Test-Connection cmdlet supports an "-AsJob" parameter, but using this parameter appears to make the cmdlet ignore the "-Count" parameter, and perform just one ping to each destination. I wanted to have 10 pings from each source to each destination, so worked around the issue by using Start-Job to spawn each job individually.
- You need to have admin access to your DCs in order to use this script. If you don't want to use DCs you can replace the first three lines with a static array containing the computer names you want to test with.
- Each computer you use for the test must be enabled for PowerShell Remoting
- Ben
No comments:
Post a Comment
Note: only a member of this blog may post a comment.