Solved

VB Script lists members of OU. Need it to query Group as well. List common members of both the group and OU.

Posted on 2008-10-30
6
650 Views
Last Modified: 2013-12-24
I originally posted a this question with workable code to query the group. For those of you just joining the conversation, you can view this code at the top of this link:
http://www.experts-exchange.com/Software/Server_Software/File_Servers/Active_Directory/Q_23855076.html

As the thread progressed, the OU portion of the problem proved to be a lot more difficult than I thought. For that reason we all agreed that we should continue with a related question. So where we are now is: The OU query is enclosed in an HTA file. A drop down exists to select the OU. After the OU is selected it displays the LDAP path. OU members are listed in the box below.

I want another drop down for the group selection. The Group LDAP path to be displayed the same as the OU, the common members of both the OU and the Group to be displayed in the box.  Current code to be used is attached.

Thanks,

JB
<Html>

<Head>

<Title>List OU Members</Title>

 

<HTA:Application

Caption = Yes

Border = Thick

ShowInTaskBar = Yes

SingleInstance = Yes

MaximizeButton = Yes

MinimizeButton = Yes>

 

<script Language = VBScript>

 

	Sub Window_OnLoad

		intWidth = 800

		intHeight = 600

		Me.ResizeTo intWidth, intHeight

		Me.MoveTo ((Screen.Width / 2) - (intWidth / 2)),((Screen.Height / 2) - (intHeight / 2))

		lst_members.Style.Width = 500

    	Set objRootDSE = GetObject("LDAP://RootDSE")

    	strBaseConnString = objRootDSE.Get("defaultNamingContext")

		Set objOULevel = GetObject("LDAP://" & strBaseConnString)

		RecurseOUs objOULevel, 0, strBaseConnString

		Show_Selection

	End Sub

 

	Sub Clear_Members

		For intListProgress = 1 To lst_members.Length

	   		lst_members.Remove 0

	   	Next

	End Sub

 

	Sub RecurseOUs(objOU, intLevel, strBaseConn)

		Dim objOUObject, strConnString, objActiveOption

		For Each objOUObject In objOU

			If UCase(Left(objOUObject.Name, 3)) = "OU=" Then

				strConnString = objOUObject.DistinguishedName

				Set objActiveOption = Document.CreateElement("OPTION")

		    	If intLevel = 0 Then

		    		objActiveOption.Text = Replace(objOUObject.Name, "OU=", "")

		    	Else

		    		objActiveOption.Text = String(intLevel * 4, " ") & "->   " & Replace(objOUObject.Name, "OU=", "")

		    	End If

		    	objActiveOption.Value = strConnString

		    	lst_SiteFilter.Add objActiveOption

				On Error Resume Next

				RecurseOUs GetObject("LDAP://" & strConnString), intLevel + 1, strBaseConn

				If Err.Number <> 0 Then

					MsgBox "Error enumerating " & strConnString

				End If

				Err.Clear

				On Error GoTo 0

			End If

		Next

	End Sub

 

	Sub Show_Selection

		span_SiteFilter.InnerHTML = lst_SiteFilter.Value

	End Sub

 

	Sub Default_Buttons

		If Window.Event.KeyCode = 13 Then

			btn_run.Click

		End If

	End Sub

 

	Sub Exit_HTA

		Window.Close

	End Sub

 

	Sub Get_Members

		Clear_Members

		strOU = lst_sitefilter.Value

		strLDAPPath = "LDAP://" & strOU

		

		Set objConnection2 = CreateObject("ADODB.Connection")

		Set objCommand2 = CreateObject("ADODB.Command")

		objConnection2.Provider = "ADsDSOObject"

		objConnection2.Open "Active Directory Provider"

		Set objCommand2.ActiveConnection = objConnection2

		

		Set objOU = GetObject(strLDAPPath)

		For Each objObject In objOU

			Set objMember = Document.CreateElement("OPTION")

			objMember.Text = objObject.cn

	        objMember.Value = objObject.cn

			lst_members.Add objMember, 0

		Next

	End Sub

</script>

<body style="background-color:#B0C4DE;" onkeypress='vbs:Default_Buttons'>

	<table height="90%" width= "90%" border="0" align="center">

		<tr>

			<td align="center" colspan="2">

				<h2>List OU Members</h2>

			</td>

		</tr>

		<tr>

			<td>

				<b>Site Filter:</b>

			</td>

			<td>

			    <select size='1' name='lst_SiteFilter'  onChange='vbs:Show_Selection'>

				</select>

			</td>

		</tr>

		<tr>

			<td colspan=2>

				<b>Site Selected:</b>&nbsp&nbsp&nbsp<span id='span_SiteFilter'></span>

			</td>

		</tr>

		<tr>

			<td>

				<b>Members:</b>

			</td>

			<td>

			    <select size='8' name='lst_members'>

				</select>

			</td>

		</tr>

	</table>

	<table width= "90%" border="0" align="center">

		<tr align="center">

			<td>

				<button name="btn_run" id="btn_run" accessKey="G" onclick="vbs:Get_Members"><u>G</u>et Members</button>

			</td>

			<td>

				<button name="btn_exit" id="btn_exit" accessKey="x" onclick="vbs:Exit_HTA">E<u>x</u>it</button>

			</td>

		</tr>

	</table>

</body>

</head>

</html>

Open in new window

0
Comment
Question by:JB4375
  • 3
  • 3
6 Comments
 
LVL 65

Accepted Solution

by:
RobSampson earned 500 total points
ID: 22846998
Hi, is this what you're after?

Regards,

Rob.
<Html>

<Head>

<Title>List OU Members</Title>

 

<HTA:Application

Caption = Yes

Border = Thick

ShowInTaskBar = Yes

SingleInstance = Yes

MaximizeButton = Yes

MinimizeButton = Yes>

 

<script Language = VBScript>
 

	Sub Window_OnLoad

		intWidth = 800

		intHeight = 600

		Me.ResizeTo intWidth, intHeight

		Me.MoveTo ((Screen.Width / 2) - (intWidth / 2)),((Screen.Height / 2) - (intHeight / 2))

		lst_members.Style.Width = 500

    	Set objRootDSE = GetObject("LDAP://RootDSE")

    	strBaseConnString = objRootDSE.Get("defaultNamingContext")

		Set objOULevel = GetObject("LDAP://" & strBaseConnString)

		RecurseOUs objOULevel, 0, strBaseConnString

		Show_Selection

		EnumerateGroups strBaseConnString

		Show_Group_Selection

	End Sub
 

	Sub Clear_Members

		For intListProgress = 1 To lst_members.Length

	   		lst_members.Remove 0

	   	Next

	End Sub
 

	Sub RecurseOUs(objOU, intLevel, strBaseConn)

		Dim objOUObject, strConnString, objActiveOption

		For Each objOUObject In objOU

			If UCase(Left(objOUObject.Name, 3)) = "OU=" Then

				strConnString = objOUObject.DistinguishedName

				Set objActiveOption = Document.CreateElement("OPTION")

		    	If intLevel = 0 Then

		    		objActiveOption.Text = Replace(objOUObject.Name, "OU=", "")

		    	Else

		    		objActiveOption.Text = String(intLevel * 4, " ") & "->   " & Replace(objOUObject.Name, "OU=", "")

		    	End If

		    	objActiveOption.Value = strConnString

		    	lst_SiteFilter.Add objActiveOption

				On Error Resume Next

				RecurseOUs GetObject("LDAP://" & strConnString), intLevel + 1, strBaseConn

				If Err.Number <> 0 Then

					MsgBox "Error enumerating " & strConnString

				End If

				Err.Clear

				On Error GoTo 0

			End If

		Next

	End Sub
 

	Sub Show_Selection

		span_SiteFilter.InnerHTML = lst_SiteFilter.Value

	End Sub
 

	Sub EnumerateGroups(strDNSDomain)

		Const ADS_SCOPE_SUBTREE = 2

		Const adVarChar = 200

		Const MaxCharacters = 255

		

		Set objConnection = CreateObject("ADODB.Connection")

		Set objCommand =   CreateObject("ADODB.Command")

		objConnection.Provider = "ADsDSOObject"

		objConnection.Open "Active Directory Provider"

		Set objCommand.ActiveConnection = objConnection

		

		objCommand.Properties("Page Size") = 1000

		objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 

		

		objCommand.CommandText = "SELECT Name, distinguishedName FROM 'LDAP://" & strDNSDomain & "' WHERE objectClass='group'"

		Set objRecordSet = objCommand.Execute

		

		Set objDataList = CreateObject("ADOR.Recordset")

		objDataList.Fields.Append "name", adVarChar, MaxCharacters

		objDataList.Fields.Append "distinguishedName", adVarChar, MaxCharacters

		objDataList.Open

		

		While Not objRecordSet.EOF

		    objDataList.AddNew

		    objDataList("name") = objRecordSet.Fields("name").Value

		    objDataList("distinguishedName") = objRecordSet.Fields("distinguishedName").Value

		    objDataList.Update

			objRecordSet.MoveNext

		Wend

		objRecordSet.Close

		objDataList.Sort = "name"

		objDataList.MoveFirst

		While Not objDataList.EOF

			Set objActiveOption = Document.CreateElement("OPTION")

    		objActiveOption.Text = objDataList.Fields("name").Value

	    	objActiveOption.Value = objDataList.Fields("distinguishedName").Value

	    	lst_GroupFilter.Add objActiveOption

	    	objDataList.MoveNext

		Wend

		objDataList.Close

	End Sub
 

	Sub Show_Group_Selection

		span_GroupFilter.InnerHTML = lst_GroupFilter.Value

	End Sub
 

	Sub Default_Buttons

		If Window.Event.KeyCode = 13 Then

			btn_run.Click

		End If

	End Sub
 

	Sub Exit_HTA

		Window.Close

	End Sub
 

	Sub Get_Members

		Clear_Members

		strOU = lst_sitefilter.Value

		strLDAPPath = "LDAP://" & strOU

		

		Set objConnection2 = CreateObject("ADODB.Connection")

		Set objCommand2 = CreateObject("ADODB.Command")

		objConnection2.Provider = "ADsDSOObject"

		objConnection2.Open "Active Directory Provider"

		Set objCommand2.ActiveConnection = objConnection2

		

		Set objOU = GetObject(strLDAPPath)

		Set objOUDict = CreateObject("Scripting.Dictionary")

		For Each objObject In objOU

			objOUDict.Add objObject.distinguishedName, objObject.Name

		Next

		

		Set objGroup = GetObject("LDAP://" & lst_groupfilter.Value)

		For Each objObject In objGroup.Members

			If objOUDict.Exists(objObject.distinguishedName) = True Then

				Set objMember = Document.CreateElement("OPTION")

				objMember.Text = objObject.cn

		        objMember.Value = objObject.distinguishedName

				lst_members.Add objMember, 0

			Else

				'MsgBox objObject.distinguishedName & " does not exist."

			End If

		Next

	End Sub

</script>

<body style="background-color:#B0C4DE;" onkeypress='vbs:Default_Buttons'>

	<table height="90%" width= "90%" border="0" align="center">

		<tr>

			<td align="center" colspan="2">

				<h2>List OU Members</h2>

			</td>

		</tr>

		<tr>

			<td>

				<b>Site Filter:</b>

			</td>

			<td>

			    <select size='1' name='lst_SiteFilter'  onChange='vbs:Show_Selection'>

				</select>

			</td>

		</tr>

		<tr>

			<td colspan=2>

				<b>Site Selected:</b>&nbsp&nbsp&nbsp<span id='span_SiteFilter'></span>

			</td>

		</tr>

		<tr>

			<td>

				<b>Group Filter:</b>

			</td>

			<td>

			    <select size='1' name='lst_GroupFilter'  onChange='vbs:Show_Group_Selection'>

				</select>

			</td>

		</tr>

		<tr>

			<td colspan=2>

				<b>Group Selected:</b>&nbsp&nbsp&nbsp<span id='span_GroupFilter'></span>

			</td>

		</tr>		<tr>

			<td>

				<b>Members:</b>

			</td>

			<td>

			    <select size='8' name='lst_members'>

				</select>

			</td>

		</tr>

	</table>

	<table width= "90%" border="0" align="center">

		<tr align="center">

			<td>

				<button name="btn_run" id="btn_run" accessKey="G" onclick="vbs:Get_Members"><u>G</u>et Members</button>

			</td>

			<td>

				<button name="btn_exit" id="btn_exit" accessKey="x" onclick="vbs:Exit_HTA">E<u>x</u>it</button>

			</td>

		</tr>

	</table>

</body>

</head>

</html>

Open in new window

0
 
LVL 1

Author Comment

by:JB4375
ID: 22847153
Rob,
At first glance it looks great. It's 10:20 pm where I am. Currently remoting to do more server patches. Will test in the AM.
Thanks,
JB
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 22847418
OK, no problem.  Basically, what happens, is when you start it, it lists your OU structure in one list box, and an alphabetical list of all of the Groups in your AD.  Then, you select an OU, a group name, then click Get Members. It will then list each of the members that are in BOTH the OU *and* the Group that you have selected.

Regards,

Rob.
0
 
LVL 1

Author Closing Comment

by:JB4375
ID: 31511915
Rob Sampson does it again. Thanks!!
0
 
LVL 1

Author Comment

by:JB4375
ID: 22851082
Rob,
It's PERFECT. What's more it a turn key solution anyone could use.
Thanks,
JB
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 22854487
Good to hear.  Thanks for the grade.

I was hoping I had the idea right when I was creating it... :-)

Regards,

Rob.
0

Join & Write a Comment

Using SQL Scripts we can save all the SQL queries as files that we use very frequently on our database later point of time. This is one of the feature present under SQL Workshop in Oracle Application Express.
Restoring deleted objects in Active Directory has been a standard feature in Active Directory for many years, yet some admins may not know what is available.
This tutorial will walk an individual through the steps necessary to join and promote the first Windows Server 2012 domain controller into an Active Directory environment running on Windows Server 2008. Determine the location of the FSMO roles by lo…
This tutorial will walk an individual through the process of transferring the five major, necessary Active Directory Roles, commonly referred to as the FSMO roles from a Windows Server 2008 domain controller to a Windows Server 2012 domain controlle…

746 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now