Parent-Child Hierarchy
Mapping Your AD: VBScript to List OUs in Parent-Child Order | Lazy Admin Blog

When you’re managing a complex Active Directory environment, getting a clear “birds-eye view” of your structure is essential. While the Active Directory Users & Computers (dsa.msc) snap-in is great for manual navigation, sometimes you need a flat text output that preserves the visual hierarchy of your Organizational Units (OUs).
The following VBScript crawls your LDAP directory and mirrors the parent-child nesting you see in your GUI tools.
📜 The Script: ListAllOUs_ParentChild.vbs
Copy the code below and save it as ListAllOUs_ParentChild.vbs.
Option ExplicitConst ADS_SCOPE_SUBTREE = 2Dim ObjConn, ObjRS, ObjRootDSEDim StrSQL, StrDomName, ObjOU' Get the local domain nameSet ObjRootDSE = GetObject("LDAP://RootDSE")StrDomName = Trim(ObjRootDSE.Get("DefaultNamingContext"))Set ObjRootDSE = Nothing' SQL Query to find OUs (Excluding Domain Controllers)StrSQL = "Select Name, ADsPath From 'LDAP://" & StrDomName & "' Where ObjectCategory = 'OrganizationalUnit' And Name <> 'Domain Controllers'"Set ObjConn = CreateObject("ADODB.Connection")ObjConn.Provider = "ADsDSOObject"ObjConn.Open "Active Directory Provider"Set ObjRS = CreateObject("ADODB.Recordset")ObjRS.Open StrSQL, ObjConnIf Not ObjRS.EOF Then ObjRS.MoveLast: ObjRS.MoveFirst WScript.Echo vbNullString WScript.Echo "Total OU: " & Trim(ObjRS.RecordCount) WScript.Echo "===================" WScript.Echo vbNullString While Not ObjRS.EOF Set ObjOU = GetObject(Trim(ObjRS.Fields("ADsPath").Value)) ' Check if it's a top-level Parent OU If StrComp(Right(Trim(ObjOU.Parent), Len(Trim(ObjOU.Parent)) - 7), StrDomName, VbTextCompare) = 0 Then WScript.Echo "Parent OU: " & Trim(ObjRS.Fields("Name").Value) GetChild(ObjOU) End If ObjRS.MoveNext Set ObjOU = Nothing WendEnd IfObjRS.Close: Set ObjRS = NothingObjConn.Close: Set ObjConn = Nothing' Subroutine to find first-level childrenPrivate Sub GetChild(ThisObject) Dim ObjChild For Each ObjChild In ThisObject If StrComp(Trim(ObjChild.Class), "OrganizationalUnit", VbTextCompare) = 0 Then WScript.Echo vbTab & ">> Child OU: " & Right(Trim(ObjChild.Name), Len(Trim(ObjChild.Name)) - 3) GetGrandChild (ObjChild.ADsPath) End If NextEnd Sub' Recursive subroutine to find all nested childrenPrivate Sub GetGrandChild (ThisADsPath) Dim ObjGrand, ObjItem Set ObjGrand = GetObject(ThisADsPath) For Each ObjItem In ObjGrand If StrComp(Trim(ObjItem.Class), "OrganizationalUnit", VbTextCompare) = 0 Then WScript.Echo vbTab & vbTab & ">> Child OU: " & Right(Trim(ObjItem.Name), Len(Trim(ObjItem.Name)) - 3) GetGrandChild Trim(ObjItem.ADsPath) End If Next Set ObjGrand = NothingEnd Sub
🚀 How to Execute
To run this script correctly and avoid “Windows Script Host” popup boxes for every line, you must use the command-line engine (CScript).
Example Command: CScript /NoLogo ListAllOUs_ParentChild.vbs
Output Preview:
Parent OU: Sales
Child OU: North_Region
Child OU: South_Region
>> Child OU: Retail_Stores
#ActiveDirectory #SysAdmin #WindowsServer #Automation #VBScript #ITAdmin #LazyAdmin #LDAP #DirectoryServices #InfrastructureAsCode #Scripting #ADUC
This entry was posted in Active Directory, Scripts and tagged Active Directory, AD Scripts, Automation, IT Infrastructure, LDAP, Organizational Units, Parent-Child Hierarchy, SysAdmin, VBScript, Windows Server.