5f836f6d9026c295877c1fea3a4f7a81a7a3518b
[clearscm.git] / clients / Ameriquest / bin / whosin.vbs
1 On Error Resume Next\r
2 \r
3 Set WshShell = WScript.CreateObject ("WScript.Shell")\r
4 Set fso      = CreateObject ("Scripting.FileSystemObject")\r
5 \r
6 ' Argument vector\r
7 Set ARGV = Wscript.Arguments\r
8 \r
9 ' Simple routine to shorten WScript.Echo!\r
10 Sub echo (msg)\r
11   WScript.Echo msg\r
12 End Sub ' echo\r
13 \r
14 Sub Display_Members (sendTo, groupname, members)\r
15   echo "Members of the " & UCase (groupname) & " Group"\r
16 \r
17   previous_member = ""\r
18   For Each member in members\r
19     If member <> previous_member Then\r
20       echo vbTAB & member\r
21       previous_member = member\r
22     End If\r
23   Next\r
24 End Sub  \r
25 \r
26 ' Routine to push things onto an array\r
27 Sub pushArray (a, e)\r
28   On Error Resume Next\r
29   size = UBound (a)\r
30 \r
31   If Err.Number <> 0 Then\r
32     size = 0\r
33   Else\r
34     size = size + 1\r
35   End If\r
36   \r
37   ReDim preserve a (size)\r
38 \r
39   a (UBound (a)) = e\r
40 End Sub 'pushArray\r
41 \r
42 ' The famous QuickSort!\r
43 Sub QuickSort (vec, loBound, hiBound)\r
44   Dim pivot\r
45   Dim loSwap\r
46   Dim hiSwap\r
47   Dim temp\r
48 \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
54 \r
55   ' Two items to sort\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
61     End If\r
62   End If\r
63 \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
69   hiSwap                              = hiBound\r
70   \r
71   Do\r
72     ' Find the right loSwap\r
73     While loSwap < hiSwap and vec (loSwap) <= pivot\r
74       loSwap = loSwap + 1\r
75     Wend\r
76     \r
77     ' Find the right hiSwap\r
78     While vec (hiSwap) > pivot\r
79       hiSwap = hiSwap - 1\r
80     Wend\r
81     \r
82     ' Swap values if loSwap is less then hiSwap\r
83     If loSwap < hiSwap Then\r
84       temp         = vec (loSwap)\r
85       vec (loSwap) = vec (hiSwap)\r
86       vec (hiSwap) = temp\r
87     End If\r
88   Loop While loSwap < hiSwap\r
89   \r
90   vec (loBound) = vec(hiSwap)\r
91   vec (hiSwap)  = pivot\r
92   \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
97   End If\r
98   \r
99   ' 2 or more items in second section\r
100   If hiSwap + 1 < hibound Then\r
101     QuickSort vec, hiSwap+1, hiBound\r
102   End If\r
103 End Sub ' QuickSort\r
104 \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
110   Err.Clear\r
111   Set LDAPGroups = GetObject (                            _\r
112     "LDAP://cn="                                        & _\r
113     groupname                                           & _ \r
114     ",ou=apps,ou=Groups,ou=Corp,dc=ameriquest,dc=net"     _\r
115   )\r
116   \r
117   If Err.Number <> 0 Then\r
118     Err.Clear\r
119     echo "Warning: " & UCase (groupname) & " is empty!"\r
120     Exit Sub\r
121   End If\r
122 \r
123   LDAPGroups.GetInfo\r
124 \r
125   ' Get an array of members\r
126   members = LDAPGroups.GetEx ("member")\r
127 \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
132     user.GetInfo\r
133 \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
139     Err.Clear\r
140     user.Get ("groupType")\r
141 \r
142     if Err.Number = 0 Then\r
143       Err.Clear\r
144       groupname = LCase (user.Get ("cn"))\r
145       DumpGroup (groupname)\r
146     Else\r
147       name = user.Get ("displayName")\r
148       pushArray grp_mbrs, name\r
149     End If\r
150   Next\r
151 End Sub\r
152 \r
153 For Each ARG in ARGV\r
154   Dim grp_mbrs ()\r
155 \r
156   ' Get members of this group\r
157   DumpGroup (ARG)\r
158   \r
159   If UBound (grp_mbrs) > 0 Then\r
160     ' Sort them\r
161     QuickSort grp_mbrs, LBound (grp_mbrs), UBound (grp_mbrs)\r
162     \r
163     ' Output them\r
164     Display_Members owner, ARG, grp_mbrs\r
165 \r
166     Erase grp_mbrs\r
167     echo\r
168   End If\r
169 Next