Added client work scripts
[clearscm.git] / clients / Ameriquest / bin / getccgroups.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 groups_file = "\\rtnlprod02\viewstore\PMO\CM_TOOLS\etc\groups.dat"\r
7 \r
8 ' Simple routine to shorten WScript.Echo!\r
9 Sub echo (msg)\r
10   WScript.Echo msg\r
11 End Sub ' echo\r
12 \r
13 Sub Email_Owner (sendTo, groupname, members)\r
14   sch = "http://schemas.microsoft.com/cdo/configuration/"\r
15 \r
16   Set cdoConfig = CreateObject ("CDO.Configuration")\r
17 \r
18   With cdoConfig.Fields\r
19     .Item (sch & "sendusing")   = 2 ' cdoSendUsingPort\r
20     .Item (sch & "smtpserver")  = "appsmtp.ameriquest.net"\r
21     .Update\r
22   End With\r
23 \r
24   Set email_msg = CreateObject ("CDO.Message")\r
25 \r
26   email_msg.Configuration       = cdoConfig\r
27   email_msg.From                = "PMO-CM@Ameriquest.net"\r
28   email_msg.To                  = sendTo\r
29   email_msg.Subject             = "Members of the " & UCase (groupname) & " Group"\r
30   email_msg.HTMLBody            = "<h3>Members of the " & UCase (groupname) & " Group</h3><p>&nbsp;</p><ol>"\r
31 \r
32   previous_member = ""\r
33   For Each member in members\r
34     If member <> previous_member Then\r
35       email_msg.HTMLBody = email_msg.HTMLBody & "<li>" & member & "</li>"\r
36       previous_member = member\r
37     End If\r
38   Next\r
39 \r
40   email_msg.HTMLBody = email_msg.HTMLBody & "</ol>"\r
41   email_msg.Send\r
42 End Sub  \r
43 \r
44 ' Routine to push things onto an array\r
45 Sub pushArray (a, e)\r
46   On Error Resume Next\r
47   size = UBound (a)\r
48 \r
49   If Err.Number <> 0 Then\r
50     size = 0\r
51   Else\r
52     size = size + 1\r
53   End If\r
54   \r
55   ReDim preserve a (size)\r
56 \r
57   a (UBound (a)) = e\r
58 End Sub 'pushArray\r
59 \r
60 ' The famous QuickSort!\r
61 Sub QuickSort (vec, loBound, hiBound)\r
62   Dim pivot\r
63   Dim loSwap\r
64   Dim hiSwap\r
65   Dim temp\r
66 \r
67   ' This procedure is adapted from the algorithm given in:\r
68   '    Data Abstractions & Structures using C++ by\r
69   '    Mark Headington and David Riley, pg. 586\r
70   ' Quicksort is the fastest array sorting routine for\r
71   ' unordered arrays.  Its big O is  n log n\r
72 \r
73   ' Two items to sort\r
74   If hiBound - loBound = 1 Then\r
75     If vec(loBound) > vec(hiBound) Then\r
76       temp          = vec (loBound)\r
77       vec (loBound) = vec (hiBound)\r
78       vec (hiBound) = temp\r
79     End If\r
80   End If\r
81 \r
82   ' Three or more items to sort\r
83   pivot                               = vec (Int ((loBound + hiBound) / 2))\r
84   vec (Int ((loBound + hiBound) / 2)) = vec (loBound)\r
85   vec (loBound)                       = pivot\r
86   loSwap                              = loBound + 1\r
87   hiSwap                              = hiBound\r
88   \r
89   Do\r
90     ' Find the right loSwap\r
91     While loSwap < hiSwap and vec (loSwap) <= pivot\r
92       loSwap = loSwap + 1\r
93     Wend\r
94     \r
95     ' Find the right hiSwap\r
96     While vec (hiSwap) > pivot\r
97       hiSwap = hiSwap - 1\r
98     Wend\r
99     \r
100     ' Swap values if loSwap is less then hiSwap\r
101     If loSwap < hiSwap Then\r
102       temp         = vec (loSwap)\r
103       vec (loSwap) = vec (hiSwap)\r
104       vec (hiSwap) = temp\r
105     End If\r
106   Loop While loSwap < hiSwap\r
107   \r
108   vec (loBound) = vec(hiSwap)\r
109   vec (hiSwap)  = pivot\r
110   \r
111   ' Recursively call function .. the beauty of Quicksort\r
112     ' 2 or more items in first section\r
113   If loBound < (hiSwap - 1) Then\r
114     QuickSort vec, loBound, hiSwap - 1\r
115   End If\r
116   \r
117   ' 2 or more items in second section\r
118   If hiSwap + 1 < hibound Then\r
119     QuickSort vec, hiSwap+1, hiBound\r
120   End If\r
121 End Sub ' QuickSort\r
122 \r
123 ' Get the group members out of Active Directory and push them\r
124 ' onto the grp_mbrs array\r
125 Sub DumpGroup (groupname)\r
126   ' Create an LDAP object and set up the search for groupname\r
127   On Error Resume Next\r
128   Err.Clear\r
129   Set LDAPGroups = GetObject (                            _\r
130     "LDAP://cn="                                        & _\r
131     groupname                                           & _ \r
132     ",ou=apps,ou=Groups,ou=Corp,dc=ameriquest,dc=net"     _\r
133   )\r
134   \r
135   If Err.Number <> 0 Then\r
136     Err.Clear\r
137     echo "Warning: " & UCase (groupname) & " is empty!"\r
138     Exit Sub\r
139   End If\r
140 \r
141   LDAPGroups.GetInfo\r
142 \r
143   ' Get an array of members\r
144   members = LDAPGroups.GetEx ("member")\r
145 \r
146   ' For each member get their displayName and push it onto the array\r
147   For Each member in members\r
148     Set user = GetObject ("LDAP://"& member)\r
149     LDAPGroups.filter = array ("user")\r
150     user.GetInfo\r
151 \r
152     ' Kludgy way to check to see if this is a group: We attempt\r
153     ' to get groupType which should only be in a group type \r
154     ' record. If this fails then process the member as an\r
155     ' individual member, otherwise recurse to process the\r
156     ' group within the group...\r
157     Err.Clear\r
158     user.Get ("groupType")\r
159 \r
160     if Err.Number = 0 Then\r
161       Err.Clear\r
162       groupname = LCase (user.Get ("cn"))\r
163       DumpGroup (groupname)\r
164     Else\r
165       name = user.Get ("displayName")\r
166       pushArray grp_mbrs, name\r
167     End If\r
168   Next\r
169 End Sub  \r
170 \r
171 ' Open the groups definition file\r
172 Set groups = fso.OpenTextFile (groups_file)\r
173 \r
174 Do While Not groups.AtEndOfStream\r
175   line = groups.ReadLine\r
176 \r
177   ' *** Need to also skip blank lines\r
178   If Line <> "" Then\r
179     If InStr (line, "#") <> 1 Then\r
180       With New RegExp\r
181         .Pattern = "\s+"\r
182         .Global = True\r
183         line = Trim (.replace (line, " "))\r
184       End With\r
185 \r
186       ' Split out fields\r
187       groupname = ""\r
188       owner     = ""\r
189       fields = Split (line)\r
190       groupname = LCase (fields (0))\r
191       owner     = LCase (fields (1))\r
192 \r
193       echo "Processing group " & UCase (groupname) & " (" & owner & ")"\r
194 \r
195       Dim grp_mbrs ()\r
196 \r
197       ' Get members of this group\r
198       DumpGroup (groupname)\r
199 \r
200       If UBound (grp_mbrs) > 0 Then\r
201         ' Sort them\r
202         QuickSort grp_mbrs, LBound (grp_mbrs), UBound (grp_mbrs)\r
203 \r
204         ' Output them\r
205         If owner <> "" Then\r
206           Email_Owner owner, groupname, grp_mbrs\r
207         Else\r
208           echo "Group: " & UCase (groupname) & " has no owner email in " & groups_file\r
209         End If\r
210 \r
211         Erase grp_mbrs\r
212       End If\r
213     End If\r
214   End If\r
215 Loop\r