Finding a Domain Controller Within the Same AD Site via PowerShell
In Exchange Management Shell and Lync Server Management Shell, you can target many cmdlets at specific domain controllers. This is crucial, especially in larger environments, if you need to make sure AD replication delays aren’t going to cause issues. An example is enabling a user for Lync using Enable-CsUser, then trying to use Set-CsUser or Grant-CsExternalAccessPolicy. The second will fail if it sends it to a different domain controller than the first, and replication hasn’t completed. So, the -DomainController switch can be used. Just send each command to the same DC, and even in rapid succession, you’ll succeed.
However, if you’re reusing your scripts or functions, especially in different environments, you have to find a valid DC in same AD site, put that into the script/function, and go. What a waste of time!
We can streamline the process with just a couple lines of code. First, we use Get-WMIObject to retrieve info on the local computer.
[object]$ComputerInfo = (Get-WMIobject -class "Win32_NTDomain" -namespace "root\CIMV2")
Next, we assign a variable, $ADSite, to the site name returned from the first line
[string]$ADSite = $ComputerInfo[1].ClientSiteName
Then we get a list of DCs in that same site
$DCsInSite = (Get-ADDomainController -Filter {Site -eq "$ADSite"})
And lastly, we randomly pick a DC from that list
[string]$QueryDC = ($DCsInSite | Get-Random).name
$QueryDC can now be used in your code, such as
Enable-CsUser [user] -RegistrarFQDN [fqdn] -SipAddressType [SIP address type] -DomainController $QueryDC
And that’s it. The only real requirement here is that the ActiveDirectory module be loaded, so that the Get-ADDomainController cmdlet works. This is easy:
Import-Module ActiveDirectory
In its entirety, here is the code:
Import-Module ActiveDirectory [object]$ComputerInfo = (Get-WMIobject -class "Win32_NTDomain" -namespace "root\CIMV2") [string]$ADSite = $ComputerInfo[1].ClientSiteName $DCsInSite = (Get-ADDomainController -Filter {Site -eq "$ADSite"}) [string]$QueryDC = ($DCsInSite | Get-Random).name
Something I threw togetherthat doesn’t request RSAT Tools. Resolve the closes DC from the DNS table from DHCP:
$NetItems = @(Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter “IPEnabled = ‘True'” -ComputerName $env:COMPUTERNAME)
foreach ($objItem in $NetItems)
{
if ($objItem.{DNSServerSearchOrder}.Count -ge 1)
{
$PrimaryDNS = $objItem.DNSServerSearchOrder[0]
$domain = $objItem.DNSDomain
break
}
}
[System.Net.Dns]::GetHostbyAddress($PrimaryDNS).hostname -replace “.$($domain)”,””