3 Set WshShell = WScript.CreateObject ("WScript.Shell")
\r
4 Set fso = CreateObject ("Scripting.FileSystemObject")
\r
6 groups_file = "\\rtnlprod02\viewstore\PMO\CM_TOOLS\etc\groups.dat"
\r
8 ' Simple routine to shorten WScript.Echo!
\r
13 Sub Email_Owner (sendTo, groupname, members)
\r
14 sch = "http://schemas.microsoft.com/cdo/configuration/"
\r
16 Set cdoConfig = CreateObject ("CDO.Configuration")
\r
18 With cdoConfig.Fields
\r
19 .Item (sch & "sendusing") = 2 ' cdoSendUsingPort
\r
20 .Item (sch & "smtpserver") = "appsmtp.ameriquest.net"
\r
24 Set email_msg = CreateObject ("CDO.Message")
\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> </p><ol>"
\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
40 email_msg.HTMLBody = email_msg.HTMLBody & "</ol>"
\r
44 ' Routine to push things onto an array
\r
45 Sub pushArray (a, e)
\r
46 On Error Resume Next
\r
49 If Err.Number <> 0 Then
\r
55 ReDim preserve a (size)
\r
60 ' The famous QuickSort!
\r
61 Sub QuickSort (vec, loBound, hiBound)
\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
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
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
90 ' Find the right loSwap
\r
91 While loSwap < hiSwap and vec (loSwap) <= pivot
\r
95 ' Find the right hiSwap
\r
96 While vec (hiSwap) > pivot
\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
106 Loop While loSwap < hiSwap
\r
108 vec (loBound) = vec(hiSwap)
\r
109 vec (hiSwap) = pivot
\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
117 ' 2 or more items in second section
\r
118 If hiSwap + 1 < hibound Then
\r
119 QuickSort vec, hiSwap+1, hiBound
\r
121 End Sub ' QuickSort
\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
129 Set LDAPGroups = GetObject ( _
\r
132 ",ou=apps,ou=Groups,ou=Corp,dc=ameriquest,dc=net" _
\r
135 If Err.Number <> 0 Then
\r
137 echo "Warning: " & UCase (groupname) & " is empty!"
\r
143 ' Get an array of members
\r
144 members = LDAPGroups.GetEx ("member")
\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
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
158 user.Get ("groupType")
\r
160 if Err.Number = 0 Then
\r
162 groupname = LCase (user.Get ("cn"))
\r
163 DumpGroup (groupname)
\r
165 name = user.Get ("displayName")
\r
166 pushArray grp_mbrs, name
\r
171 ' Open the groups definition file
\r
172 Set groups = fso.OpenTextFile (groups_file)
\r
174 Do While Not groups.AtEndOfStream
\r
175 line = groups.ReadLine
\r
177 ' *** Need to also skip blank lines
\r
179 If InStr (line, "#") <> 1 Then
\r
183 line = Trim (.replace (line, " "))
\r
189 fields = Split (line)
\r
190 groupname = LCase (fields (0))
\r
191 owner = LCase (fields (1))
\r
193 echo "Processing group " & UCase (groupname) & " (" & owner & ")"
\r
197 ' Get members of this group
\r
198 DumpGroup (groupname)
\r
200 If UBound (grp_mbrs) > 0 Then
\r
202 QuickSort grp_mbrs, LBound (grp_mbrs), UBound (grp_mbrs)
\r
205 If owner <> "" Then
\r
206 Email_Owner owner, groupname, grp_mbrs
\r
208 echo "Group: " & UCase (groupname) & " has no owner email in " & groups_file
\r