Find DCs and GCs in a site (Perl)

This code can be found in Chapter 3 of Active Directory Cookbook, 2nd edition

Purchase XP Cookbook or Networking Recipes for only $25 plus shipping! While supplies last.

Find out how to download all of the Perl code from this site.

# This Perl code prints the domain controllers in a site and then
# prints the global catalog servers in the site

# ---------------------------------------------------------------
# Adapted from VBScript code contained in the book:
#      "Active Directory Cookbook" by Robbie Allen
# Publisher: O'Reilly and Associates
# ISBN: 0-596-00466-4
# Book web site: http://rallenhome.com/books/adcookbook/code.html
# ---------------------------------------------------------------

# ------ SCRIPT CONFIGURATION ------
my $strSite   = "<SiteName>";       # e.g. Default-First-Site-Name
my $strForest = "<ForestDNSName>";  # e.g. rallencorp.com                 
# ------ END CONFIGURATION ---------
use Win32::OLE;
$Win32::OLE::Warn = 3;
my $objRootDSE = Win32::OLE->GetObject("LDAP://" . $strForest . "/RootDSE");
my $strADsPath =  "<LDAP://cn=servers,cn=" . $strSite . ",cn=sites," . $objRootDSE->Get("configurationNamingContext") . ">;";
my $strFilter  = "(objectcategory=ntdsdsa);";
my $strAttrs   = "distinguishedName;";
my $strScope   = "subtree";

print "Domain controllers in $strSite:\n";
my $objConn = Win32::OLE->CreateObject("ADODB.Connection");
$objConn->{Provider} = "ADsDSOObject";
$objConn->Open;
my $objRS = $objConn->Execute($strADsPath . $strFilter . $strAttrs . $strScope);
$objRS->MoveFirst;
while (not $objRS->eof) {
    my $objNTDS = Win32::OLE->GetObject("LDAP://" . $objRS->Fields(0)->Value);
    my $objServer = Win32::OLE->GetObject( $objNTDS->Parent );
    print " ", $objServer->Get("dNSHostName"),"\n";
    $objRS->MoveNext;
}

# Global Catalog filter
$strFilter  = "(&(objectcategory=ntdsdsa)(options=1));";
print "\n";
print "Global Catalogs in " . $strSite . ":\n";
my $objRS = $objConn->Execute($strADsPath . $strFilter . $strAttrs . $strScope);
$objRS->MoveFirst;
while (not $objRS->eof) {
    my $objNTDS = Win32::OLE->GetObject("LDAP://" . $objRS->Fields(0)->Value);
    my $objServer = Win32::OLE->GetObject( $objNTDS->Parent );
    print " ", $objServer->Get("dNSHostName"),"\n";
    $objRS->MoveNext;
}

This code has been viewed 1431 times.

New from the creators of TechTasks.com: StatSheet.com