On Error Resume Next
Set WshShell = WScript.CreateObject ("WScript.Shell")
Set fso = CreateObject ("Scripting.FileSystemObject")
groups_file = "\\rtnlprod02\viewstore\PMO\CM_TOOLS\etc\groups.dat"
' Simple routine to shorten WScript.Echo!
Sub echo (msg)
WScript.Echo msg
End Sub ' echo
Sub Email_Owner (sendTo, groupname, members)
sch = "http://schemas.microsoft.com/cdo/configuration/"
Set cdoConfig = CreateObject ("CDO.Configuration")
With cdoConfig.Fields
.Item (sch & "sendusing") = 2 ' cdoSendUsingPort
.Item (sch & "smtpserver") = "appsmtp.ameriquest.net"
.Update
End With
Set email_msg = CreateObject ("CDO.Message")
email_msg.Configuration = cdoConfig
email_msg.From = "PMO-CM@Ameriquest.net"
email_msg.To = sendTo
email_msg.Subject = "Members of the " & UCase (groupname) & " Group"
email_msg.HTMLBody = "
Members of the " & UCase (groupname) & " Group
"
previous_member = ""
For Each member in members
If member <> previous_member Then
email_msg.HTMLBody = email_msg.HTMLBody & "- " & member & "
"
previous_member = member
End If
Next
email_msg.HTMLBody = email_msg.HTMLBody & "
"
email_msg.Send
End Sub
' Routine to push things onto an array
Sub pushArray (a, e)
On Error Resume Next
size = UBound (a)
If Err.Number <> 0 Then
size = 0
Else
size = size + 1
End If
ReDim preserve a (size)
a (UBound (a)) = e
End Sub 'pushArray
' The famous QuickSort!
Sub QuickSort (vec, loBound, hiBound)
Dim pivot
Dim loSwap
Dim hiSwap
Dim temp
' This procedure is adapted from the algorithm given in:
' Data Abstractions & Structures using C++ by
' Mark Headington and David Riley, pg. 586
' Quicksort is the fastest array sorting routine for
' unordered arrays. Its big O is n log n
' Two items to sort
If hiBound - loBound = 1 Then
If vec(loBound) > vec(hiBound) Then
temp = vec (loBound)
vec (loBound) = vec (hiBound)
vec (hiBound) = temp
End If
End If
' Three or more items to sort
pivot = vec (Int ((loBound + hiBound) / 2))
vec (Int ((loBound + hiBound) / 2)) = vec (loBound)
vec (loBound) = pivot
loSwap = loBound + 1
hiSwap = hiBound
Do
' Find the right loSwap
While loSwap < hiSwap and vec (loSwap) <= pivot
loSwap = loSwap + 1
Wend
' Find the right hiSwap
While vec (hiSwap) > pivot
hiSwap = hiSwap - 1
Wend
' Swap values if loSwap is less then hiSwap
If loSwap < hiSwap Then
temp = vec (loSwap)
vec (loSwap) = vec (hiSwap)
vec (hiSwap) = temp
End If
Loop While loSwap < hiSwap
vec (loBound) = vec(hiSwap)
vec (hiSwap) = pivot
' Recursively call function .. the beauty of Quicksort
' 2 or more items in first section
If loBound < (hiSwap - 1) Then
QuickSort vec, loBound, hiSwap - 1
End If
' 2 or more items in second section
If hiSwap + 1 < hibound Then
QuickSort vec, hiSwap+1, hiBound
End If
End Sub ' QuickSort
' Get the group members out of Active Directory and push them
' onto the grp_mbrs array
Sub DumpGroup (groupname)
' Create an LDAP object and set up the search for groupname
On Error Resume Next
Err.Clear
Set LDAPGroups = GetObject ( _
"LDAP://cn=" & _
groupname & _
",ou=apps,ou=Groups,ou=Corp,dc=ameriquest,dc=net" _
)
If Err.Number <> 0 Then
Err.Clear
echo "Warning: " & UCase (groupname) & " is empty!"
Exit Sub
End If
LDAPGroups.GetInfo
' Get an array of members
members = LDAPGroups.GetEx ("member")
' For each member get their displayName and push it onto the array
For Each member in members
Set user = GetObject ("LDAP://"& member)
LDAPGroups.filter = array ("user")
user.GetInfo
' Kludgy way to check to see if this is a group: We attempt
' to get groupType which should only be in a group type
' record. If this fails then process the member as an
' individual member, otherwise recurse to process the
' group within the group...
Err.Clear
user.Get ("groupType")
if Err.Number = 0 Then
Err.Clear
groupname = LCase (user.Get ("cn"))
DumpGroup (groupname)
Else
name = user.Get ("displayName")
pushArray grp_mbrs, name
End If
Next
End Sub
' Open the groups definition file
Set groups = fso.OpenTextFile (groups_file)
Do While Not groups.AtEndOfStream
line = groups.ReadLine
' *** Need to also skip blank lines
If Line <> "" Then
If InStr (line, "#") <> 1 Then
With New RegExp
.Pattern = "\s+"
.Global = True
line = Trim (.replace (line, " "))
End With
' Split out fields
groupname = ""
owner = ""
fields = Split (line)
groupname = LCase (fields (0))
owner = LCase (fields (1))
echo "Processing group " & UCase (groupname) & " (" & owner & ")"
Dim grp_mbrs ()
' Get members of this group
DumpGroup (groupname)
If UBound (grp_mbrs) > 0 Then
' Sort them
QuickSort grp_mbrs, LBound (grp_mbrs), UBound (grp_mbrs)
' Output them
If owner <> "" Then
Email_Owner owner, groupname, grp_mbrs
Else
echo "Group: " & UCase (groupname) & " has no owner email in " & groups_file
End If
Erase grp_mbrs
End If
End If
End If
Loop