3 Set WshShell = WScript.CreateObject ("WScript.Shell")
\r
4 Set fso = CreateObject ("Scripting.FileSystemObject")
\r
7 Set ARGV = Wscript.Arguments
\r
9 ' Simple routine to shorten WScript.Echo!
\r
14 Sub Display_Members (sendTo, groupname, members)
\r
15 echo "Members of the " & UCase (groupname) & " Group"
\r
17 previous_member = ""
\r
18 For Each member in members
\r
19 If member <> previous_member Then
\r
21 previous_member = member
\r
26 ' Routine to push things onto an array
\r
27 Sub pushArray (a, e)
\r
28 On Error Resume Next
\r
31 If Err.Number <> 0 Then
\r
37 ReDim preserve a (size)
\r
42 ' The famous QuickSort!
\r
43 Sub QuickSort (vec, loBound, hiBound)
\r
49 ' This procedure is adapted from the algorithm given in:
\r
50 ' Data Abstractions & Structures using C++ by
\r
51 ' Mark Headington and David Riley, pg. 586
\r
52 ' Quicksort is the fastest array sorting routine for
\r
53 ' unordered arrays. Its big O is n log n
\r
56 If hiBound - loBound = 1 Then
\r
57 If vec(loBound) > vec(hiBound) Then
\r
58 temp = vec (loBound)
\r
59 vec (loBound) = vec (hiBound)
\r
60 vec (hiBound) = temp
\r
64 ' Three or more items to sort
\r
65 pivot = vec (Int ((loBound + hiBound) / 2))
\r
66 vec (Int ((loBound + hiBound) / 2)) = vec (loBound)
\r
67 vec (loBound) = pivot
\r
68 loSwap = loBound + 1
\r
72 ' Find the right loSwap
\r
73 While loSwap < hiSwap and vec (loSwap) <= pivot
\r
77 ' Find the right hiSwap
\r
78 While vec (hiSwap) > pivot
\r
82 ' Swap values if loSwap is less then hiSwap
\r
83 If loSwap < hiSwap Then
\r
85 vec (loSwap) = vec (hiSwap)
\r
88 Loop While loSwap < hiSwap
\r
90 vec (loBound) = vec(hiSwap)
\r
91 vec (hiSwap) = pivot
\r
93 ' Recursively call function .. the beauty of Quicksort
\r
94 ' 2 or more items in first section
\r
95 If loBound < (hiSwap - 1) Then
\r
96 QuickSort vec, loBound, hiSwap - 1
\r
99 ' 2 or more items in second section
\r
100 If hiSwap + 1 < hibound Then
\r
101 QuickSort vec, hiSwap+1, hiBound
\r
103 End Sub ' QuickSort
\r
105 ' Get the group members out of Active Directory and push them
\r
106 ' onto the grp_mbrs array
\r
107 Sub DumpGroup (groupname)
\r
108 ' Create an LDAP object and set up the search for groupname
\r
109 On Error Resume Next
\r
111 Set LDAPGroups = GetObject ( _
\r
114 ",ou=apps,ou=Groups,ou=Corp,dc=ameriquest,dc=net" _
\r
117 If Err.Number <> 0 Then
\r
119 echo "Warning: " & UCase (groupname) & " is empty!"
\r
125 ' Get an array of members
\r
126 members = LDAPGroups.GetEx ("member")
\r
128 ' For each member get their displayName and push it onto the array
\r
129 For Each member in members
\r
130 Set user = GetObject ("LDAP://"& member)
\r
131 LDAPGroups.filter = array ("user")
\r
134 ' Kludgy way to check to see if this is a group: We attempt
\r
135 ' to get groupType which should only be in a group type
\r
136 ' record. If this fails then process the member as an
\r
137 ' individual member, otherwise recurse to process the
\r
138 ' group within the group...
\r
140 user.Get ("groupType")
\r
142 if Err.Number = 0 Then
\r
144 groupname = LCase (user.Get ("cn"))
\r
145 DumpGroup (groupname)
\r
147 name = user.Get ("displayName")
\r
148 pushArray grp_mbrs, name
\r
153 For Each ARG in ARGV
\r
156 ' Get members of this group
\r
159 If UBound (grp_mbrs) > 0 Then
\r
161 QuickSort grp_mbrs, LBound (grp_mbrs), UBound (grp_mbrs)
\r
164 Display_Members owner, ARG, grp_mbrs
\r