{"id":52323,"date":"2009-10-05T03:01:00","date_gmt":"2009-10-05T03:01:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2009\/10\/05\/hey-scripting-guy-how-can-i-get-a-list-of-domain-controllers-in-my-domain-part-1\/"},"modified":"2009-10-05T03:01:00","modified_gmt":"2009-10-05T03:01:00","slug":"hey-scripting-guy-how-can-i-get-a-list-of-domain-controllers-in-my-domain-part-1","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/scripting\/hey-scripting-guy-how-can-i-get-a-list-of-domain-controllers-in-my-domain-part-1\/","title":{"rendered":"Hey, Scripting Guy! How Can I Get a List of Domain Controllers in My Domain? (Part 1)"},"content":{"rendered":"<p><!-- AddThis Button BEGIN --><a class=\"addthis_button\" href=\"http:\/\/www.addthis.com\/bookmark.php?v=250&amp;pub=scriptingguys\"><img decoding=\"async\" alt=\"Bookmark and Share\" src=\"http:\/\/s7.addthis.com\/static\/btn\/v2\/lg-share-en.gif\" width=\"125\" height=\"16\"><\/a>  <\/p>\n<p><img decoding=\"async\" title=\"Hey, Scripting Guy! Question\" border=\"0\" alt=\"Hey, Scripting Guy! Question\" align=\"left\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/q-for-powertip.jpg\" width=\"34\" height=\"34\"><\/p>\n<p class=\"MsoNormal\">Hey, Scripting Guy! I hope you do not think I am clueless, but I need to obtain a list of all the domain controllers in my domain. Can you help me out by writing a Windows PowerShell script to list all of the domain controllers in my domain?<\/p>\n<p>&lt;<\/p>\n<p>p style=&#8221;MARGIN: 0in 0in 8pt&#8221; class=&#8221;MsoNormal&#8221;&gt;&#8211; KH<\/p>\n<p><img decoding=\"async\" title=\"Hey, Scripting Guy! Answer\" border=\"0\" alt=\"Hey, Scripting Guy! Answer\" align=\"left\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/a-for-powertip.jpg\" width=\"34\" height=\"34\"><\/p>\n<p class=\"MsoNormal\">Hello KH, <\/p>\n<p class=\"MsoNormal\">Microsoft Scripting Guy Ed Wilson here. Fall has come to Charlotte, North Carolina, in the United States. This morning it was 60 degrees Fahrenheit (15.5 degrees Celsius) (I determined this by using my <a href=\"http:\/\/blogs.technet.com\/heyscriptingguy\/archive\/2008\/10\/27\/how-can-i-create-an-hta-to-do-temperature-conversions.aspx\"><font face=\"Segoe\">temperature conversion HTA<\/font><\/a>). The skies are blue, and the leaves are rustling around on the ground. It is my favorite time of the year. Couple this with the fact I was on vacation last week (I attended a wood working class in the <a href=\"http:\/\/en.wikipedia.org\/wiki\/Great_Smoky_Mountains\"><font face=\"Segoe\">Great Smoky Mountains<\/font><\/a>), and I am feeling relaxed and susceptible to suggestion. I most certainly do not think you are clueless. In fact, I have heard this question before. <\/p>\n<p class=\"MsoNormal\">Sometime ago, the Scripting Guys wrote a script in VBScript that listed domain controllers by querying the schema configuration container. The <a href=\"http:\/\/bit.ly\/2EafQ9\"><font face=\"Segoe\">How Can I Get a List of All the Domain Controllers in My Domain?<\/font><\/a> article was a huge success, with calls from all the major news services for permission for reprints (if you count our moms as major news services). The FindDomainControllersFromNamingContext.vbs script from the Hey Scripting Guy! article is seen here. <\/p>\n<p class=\"CodeBlockScreenedHead\"><strong>FindDomainControllersFromNamingContext.vbs<\/strong><\/p>\n<p class=\"CodeBlockScreened\"><span lang=\"EN\"><font><font face=\"Lucida Sans Typewriter\">On Error Resume Next<\/p>\n<p>Const ADS_SCOPE_SUBTREE = 2<\/p>\n<p>Set objRootDSE = GetObject(&#8220;LDAP:\/\/RootDSE&#8221;)<br>strConfigurationNC = objRootDSE.Get(&#8220;configurationNamingContext&#8221;)<\/p>\n<p>Set objConnection = CreateObject(&#8220;ADODB.Connection&#8221;)<br>Set objCommand =<span>&nbsp;&nbsp; <\/span>CreateObject(&#8220;ADODB.Command&#8221;)<br>objConnection.Provider = &#8220;ADsDSOObject&#8221;<br>objConnection.Open &#8220;Active Directory Provider&#8221;<br>Set objCommand.ActiveConnection = objConnection<\/p>\n<p>objCommand.Properties(&#8220;Page Size&#8221;) = 1000<br>objCommand.Properties(&#8220;Searchscope&#8221;) = ADS_SCOPE_SUBTREE <\/p>\n<p>objCommand.CommandText = _<br><span>&nbsp;&nbsp;&nbsp; <\/span>&#8220;SELECT ADsPath FROM &#8216;LDAP:\/\/&#8221; &amp; strConfigurationNC &amp; &#8220;&#8216; WHERE objectClass=&#8217;nTDSDSA'&#8221;<span>&nbsp; <\/span><br>Set objRecordSet = objCommand.Execute<\/p>\n<p>objRecordSet.MoveFirst<br>Do Until objRecordSet.EOF<br><span>&nbsp;&nbsp;&nbsp; <\/span>Set objParent = GetObject(GetObject(objRecordset.Fields(&#8220;ADsPath&#8221;)).Parent)<br><span>&nbsp;&nbsp;&nbsp; <\/span>WScript.Echo objParent.CN<br><span>&nbsp;&nbsp;&nbsp; <\/span>objRecordSet.MoveNext<br>Loop<\/p>\n<p><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\">The FindDomainControllersFromSchema.vbs script uses ADO to query the <b>configurationNamingContext<\/b> from Active Directory. The same technique can be done using Windows PowerShell. The technique of using the <b>configurationNamingContext<\/b> is illustrated in the FindDomainControllerFromNamingContext.ps1 script seen here. <\/p>\n<p class=\"CodeBlockScreenedHead\"><strong>FindDomainControllerFromNamingContext.ps1<\/strong><\/p>\n<p class=\"CodeBlockScreened\"><span lang=\"EN\"><font><font face=\"Lucida Sans Typewriter\">$Config = ([adsi]&#8221;LDAP:\/\/rootdse&#8221;).ConfigurationNamingContext<br>$dse = [adsi]&#8221;LDAP:\/\/$config&#8221;<br>$searcher = New-Object DirectoryServices.DirectorySearcher ($dse, &#8220;ObjectClass=nTDSDSA&#8221;)<br>$searcher.findall() | <br>ForEach-Object{ ([adsi]$_.path).parent }<\/p>\n<p><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\">The first thing that is done in the FindDomainControllerFromNamingContext.ps1 script is retrieve the <b>ConfigurationNamingContext<\/b>. To do this, the ADSI type accelerator is used to retrieve the rootdse from the LDAP provider. When the ADSI type accelerator is used to retrieve the rootdse from the LDAP provider, an instance of the <b>DirectoryServices.DirectoryEntry<\/b> class is returned. As seen here, the <b>DirectoryEntry<\/b> object for the rootdse has the <b>ConfigurationNamingContext<\/b> property: <\/p>\n<p class=\"CodeBlock\"><span lang=\"EN\"><font face=\"Lucida Sans Typewriter\">PS C:&gt; [adsi]&#8221;LDAP:\/\/rootdse&#8221;<\/p>\n<p><br>distinguishedName : {}<br>Path<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>: LDAP:\/\/rootdse<\/p>\n<p>PS C:&gt; [adsi]&#8221;LDAP:\/\/rootdse&#8221; | Get-Member<\/p>\n<p><br><span>&nbsp;&nbsp; <\/span>TypeName: System.DirectoryServices.DirectoryEntry<\/p>\n<p>Name<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>MemberType Definition<br>&#8212;-<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-<br>ConvertDNWithBinaryToString<span>&nbsp;&nbsp; <\/span>CodeMethod static string ConvertDNWithBinaryToStrin&#8230;<br>ConvertLargeIntegerToInt64<span>&nbsp;&nbsp;&nbsp; <\/span>CodeMethod static long ConvertLargeIntegerToInt64(p&#8230;<br>configurationNamingContext<span>&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>currentTime<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>defaultNamingContext<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>dnsHostName<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>domainControllerFunctionality Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>domainFunctionality<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>dsServiceName<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>forestFunctionality<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>highestCommittedUSN<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>isGlobalCatalogReady<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>isSynchronized<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>ldapServiceName<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>namingContexts<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>rootDomainNamingContext<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>schemaNamingContext<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>serverName<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>subschemaSubentry<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>supportedCapabilities<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>supportedControl<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>supportedLDAPPolicies<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>supportedLDAPVersion<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<br>supportedSASLMechanisms<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp; <\/span>System.DirectoryServices.PropertyValueCo&#8230;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">When the <b>ConfigurationNamingContext<\/b> property is queried, a string is returned. This is shown here:<\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">PS C:&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">&nbsp;<\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">PS C:&gt; ([adsi]&#8221;LDAP:\/\/rootdse&#8221;).ConfigurationNamingContext<br>CN=Configuration,DC=NWTraders,DC=Com<br>PS C:&gt; ([adsi]&#8221;LDAP:\/\/rootdse&#8221;).ConfigurationNamingContext | Get-Member<\/p>\n<p><br><span>&nbsp;&nbsp; <\/span>TypeName: System.String<\/p>\n<p>Name<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>MemberType<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Definition<br>&#8212;-<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&#8212;&#8212;&#8212;-<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&#8212;&#8212;&#8212;-<br>Clone<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>System.Object Clone()<br>CompareTo<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>int CompareTo(System.Object value), int Co&#8230;<br>Contains<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>bool Contains(string value)<br>CopyTo<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>System.Void CopyTo(int sourceIndex, char[]&#8230;<br>EndsWith<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>bool EndsWith(string value), bool EndsWith&#8230;<br>Equals<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>bool Equals(System.Object obj), bool Equal&#8230;<br>GetEnumerator<span>&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>System.CharEnumerator GetEnumerator()<br>GetHashCode<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>int GetHashCode()<br>GetType<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;<\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>type GetType()<br>GetTypeCode<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>System.TypeCode GetTypeCode()<br>IndexOf<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>int IndexOf(char value), int IndexOf(char &#8230;<br>IndexOfAny<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>int IndexOfAny(char[] anyOf), int IndexOfA&#8230;<br>Insert<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string Insert(int startIndex, string value)<br>IsNormalized<span>&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>bool IsNormalized(), bool IsNormalized(Sys&#8230;<br>LastIndexOf<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>int LastIndexOf(char value), int LastIndex&#8230;<br>LastIndexOfAny<span>&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>int LastIndexOfAny(char[] anyOf), int Last&#8230;<br>Normalize<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string Normalize(), string Normalize(Syste&#8230;<br>PadLeft<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string PadLeft(int totalWidth), string Pad&#8230;<br>PadRight<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string PadRight(int totalWidth), string Pa&#8230;<br>Remove<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string Remove(int startIndex, int count), &#8230;<br>Replace<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string Replace(char oldChar, char newChar)&#8230;<br>Split<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string[] Split(Params char[] separator), s&#8230;<br>StartsWith<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>bool StartsWith(string value), bool Starts&#8230;<br>Substring<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string Substring(int startIndex), string S&#8230;<br>ToCharArray<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>char[] ToCharArray(), char[] ToCharArray(i&#8230;<br>ToLower<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string ToLower(), string ToLower(System.Gl&#8230;<br>ToLowerInvariant Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string ToLowerInvariant()<br>ToString<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string ToString(), string ToString(System&#8230;.<br>ToUpper<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string ToUpper(), string ToUpper(System.Gl&#8230;<br>ToUpperInvariant Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string ToUpperInvariant()<br>Trim<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span>string Trim(Params char[] trimChars), stri&#8230;<br>TrimEnd<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string TrimEnd(Params char[] trimChars)<br>TrimStart<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Method<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>string TrimStart(Params char[] trimChars)<br>Chars<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>ParameterizedProperty char Chars(int index) {get;}<br>Length<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Property<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>System.Int32 Length {get;}<\/p>\n<p><br>PS C:&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">The line of code that retrieves the <b>ConfigurationNamingContext<\/b> from rootdse is seen here:<\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$Config = ([adsi]&#8221;LDAP:\/\/rootdse&#8221;).ConfigurationNamingContext<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">To be able to use the <b>ConfigurationNamingContext<\/b>, the string needs to be translated to a <b>DirectoryEntry<\/b> object. To do this, the ADSI type accelerator is once again used: <\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$dse = [adsi]&#8221;LDAP:\/\/$config&#8221;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">After the DirectoryEntry object has been created for the <b>ConfigurationNamingContext<\/b>, it is used with the <b>DirectoryServices.DirectorySearcher<\/b> .NET Framework class to retrieve instances of the <b>nTDSDSA<\/b> object class. The <b>nTDSDSA<\/b> object represents the replication agent on a domain controller. Because this object is invariant for the lifetime of the domain controller, the object GUID value can be used as an alternative identifier for the domain controller. More information about this object can be found on <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd303593(PROT.13).aspx\"><font face=\"Segoe\">MSDN<\/font><\/a>. Because the <b>nTDSDSA<\/b> object is found in the <b>ConfigurationNamingContext<\/b>, you will need to tell the <b>DirectorySearcher<\/b> to begin looking in that context. To do this, you use an overloaded constructor that accepts a <b>DirectoryEntry<\/b> class in the first position and a string for the filter in the second position. The constructors for the <b>DirectorySearcher<\/b> class are documented on <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/system.directoryservices.directorysearcher.directorysearcher.aspx\"><font face=\"Segoe\">MSDN<\/font><\/a>. <\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$searcher = New-Object DirectoryServices.DirectorySearcher ($dse, &#8220;ObjectClass=nTDSDSA&#8221;)<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">After you have created the <b>searcher<\/b> object, the <b>findall<\/b> method is used to retrieve all instances of objects in Active Directory that meet the filter criteria. Other methods from the <b>DirectorySearcher<\/b> object are documented on <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/system.directoryservices.directorysearcher_methods.aspx\"><font face=\"Segoe\">MSDN<\/font><\/a>. The results from the <b>findall<\/b> method are pipelined to the <b>Foreach-Object<\/b> cmdlet. This is seen here: <\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$searcher.findall() |<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">The <b>Foreach-Object<\/b> cmdlet is used to examine each object as it comes down the Windows PowerShell pipeline. When an object enters the pipeline, the ADSI type accelerator is used to retrieve the parent property of each <b>nTDSDSA<\/b> object that is retrieved. This is seen here:<\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">ForEach-Object { ([adsi]$_.path).parent }<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">As seen in the following image, two domain controllers are returned for the NWTraders.com domain. The first domain controller is named HYPERV and the second domain controller is named SERVER1: <\/p>\n<p class=\"Fig-Graphic\"><img decoding=\"async\" title=\"Image of the two domain controllers thare are returned\" alt=\"Image of the two domain controllers thare are returned\" src=\"http:\/\/img.microsoft.com\/library\/media\/1033\/technet\/images\/scriptcenter\/qanda\/hsg\/2009\/october\/hey1005\/hsg-10-05-09-01.jpg\" width=\"775\" height=\"689\"><\/p>\n<p class=\"MsoNormal\"><br>KH, that is all there is to querying the configuration context in Active Directory to retrieve a list of the domain controllers. Join us tomorrow for Part 2, as we continue working with Active Directory. <\/p>\n<p class=\"MsoNormal\">If you want to know exactly what we will be scripting tomorrow, follow us on <a href=\"http:\/\/www.twitter.com\/scriptingguys\" target=\"_blank\">Twitter<\/a> or <a href=\"http:\/\/www.facebook.com\/group.php?gid=5901799452\" target=\"_blank\">Facebook<\/a>. If you have any questions, send e-mail to us at <a href=\"http:\/\/blogs.technet.commailto:scripter@microsoft.com\" target=\"_blank\"><font face=\"Segoe\">scripter@microsoft.com<\/font><\/a> or post your questions on the <a href=\"http:\/\/social.technet.microsoft.com\/Forums\/en\/ITCG\/threads\/\" target=\"_blank\">Official Scripting Guys Forum<\/a>. See you tomorrow. Until then, peace.<\/p>\n<p class=\"MsoNormal\">&nbsp;<\/p>\n<p><b><span>Ed Wilson and Craig Liebendorfer, Scripting Guys<\/p>\n<p><\/span><\/b><\/p>\n<p>&nbsp;<!-- AddThis Button END --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hey, Scripting Guy! I hope you do not think I am clueless, but I need to obtain a list of all the domain controllers in my domain. Can you help me out by writing a Windows PowerShell script to list all of the domain controllers in my domain? &lt; p style=&#8221;MARGIN: 0in 0in 8pt&#8221; class=&#8221;MsoNormal&#8221;&gt;&#8211; [&hellip;]<\/p>\n","protected":false},"author":595,"featured_media":87096,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[7,3,8,45],"class_list":["post-52323","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scripting","tag-active-directory","tag-scripting-guy","tag-searching-active-directory","tag-windows-powershell"],"acf":[],"blog_post_summary":"<p>Hey, Scripting Guy! I hope you do not think I am clueless, but I need to obtain a list of all the domain controllers in my domain. Can you help me out by writing a Windows PowerShell script to list all of the domain controllers in my domain? &lt; p style=&#8221;MARGIN: 0in 0in 8pt&#8221; class=&#8221;MsoNormal&#8221;&gt;&#8211; [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/52323","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/users\/595"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/comments?post=52323"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/52323\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media\/87096"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media?parent=52323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/categories?post=52323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/tags?post=52323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}