Home > PowerShell > Finding a Domain Controller Within the Same AD Site via PowerShell

Finding a Domain Controller Within the Same AD Site via PowerShell

Powershell_logo-137x137In 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

 

  1. Fred Beck
    October 12th, 2017 at 11:55 | #1

    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)”,””

  1. No trackbacks yet.