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
656 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
Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

 
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

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Read about achieving the basic levels of HRIS security in the workplace.
These days, all we hear about hacktivists took down so and so websites and retrieved thousands of user’s data. One of the techniques to get unauthorized access to database is by performing SQL injection. This article is quite lengthy which gives bas…
Video by: Steve
Using examples as well as descriptions, step through each of the common simple join types, explaining differences in syntax, differences in expected outputs and showing how the queries run along with the actual outputs based upon a simple set of dem…
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…

895 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

13 Experts available now in Live!

Get 1:1 Help Now