Added client work scripts
[clearscm.git] / clients / Ameriquest / bin / whosin.vbs
diff --git a/clients/Ameriquest/bin/whosin.vbs b/clients/Ameriquest/bin/whosin.vbs
new file mode 100644 (file)
index 0000000..5f836f6
--- /dev/null
@@ -0,0 +1,169 @@
+On Error Resume Next\r
+\r
+Set WshShell = WScript.CreateObject ("WScript.Shell")\r
+Set fso      = CreateObject ("Scripting.FileSystemObject")\r
+\r
+' Argument vector\r
+Set ARGV = Wscript.Arguments\r
+\r
+' Simple routine to shorten WScript.Echo!\r
+Sub echo (msg)\r
+  WScript.Echo msg\r
+End Sub ' echo\r
+\r
+Sub Display_Members (sendTo, groupname, members)\r
+  echo "Members of the " & UCase (groupname) & " Group"\r
+\r
+  previous_member = ""\r
+  For Each member in members\r
+    If member <> previous_member Then\r
+      echo vbTAB & member\r
+      previous_member = member\r
+    End If\r
+  Next\r
+End Sub  \r
+\r
+' Routine to push things onto an array\r
+Sub pushArray (a, e)\r
+  On Error Resume Next\r
+  size = UBound (a)\r
+\r
+  If Err.Number <> 0 Then\r
+    size = 0\r
+  Else\r
+    size = size + 1\r
+  End If\r
+  \r
+  ReDim preserve a (size)\r
+\r
+  a (UBound (a)) = e\r
+End Sub 'pushArray\r
+\r
+' The famous QuickSort!\r
+Sub QuickSort (vec, loBound, hiBound)\r
+  Dim pivot\r
+  Dim loSwap\r
+  Dim hiSwap\r
+  Dim temp\r
+\r
+  ' This procedure is adapted from the algorithm given in:\r
+  '    Data Abstractions & Structures using C++ by\r
+  '    Mark Headington and David Riley, pg. 586\r
+  ' Quicksort is the fastest array sorting routine for\r
+  ' unordered arrays.  Its big O is  n log n\r
+\r
+  ' Two items to sort\r
+  If hiBound - loBound = 1 Then\r
+    If vec(loBound) > vec(hiBound) Then\r
+      temp          = vec (loBound)\r
+      vec (loBound) = vec (hiBound)\r
+      vec (hiBound) = temp\r
+    End If\r
+  End If\r
+\r
+  ' Three or more items to sort\r
+  pivot                               = vec (Int ((loBound + hiBound) / 2))\r
+  vec (Int ((loBound + hiBound) / 2)) = vec (loBound)\r
+  vec (loBound)                       = pivot\r
+  loSwap                              = loBound + 1\r
+  hiSwap                              = hiBound\r
+  \r
+  Do\r
+    ' Find the right loSwap\r
+    While loSwap < hiSwap and vec (loSwap) <= pivot\r
+      loSwap = loSwap + 1\r
+    Wend\r
+    \r
+    ' Find the right hiSwap\r
+    While vec (hiSwap) > pivot\r
+      hiSwap = hiSwap - 1\r
+    Wend\r
+    \r
+    ' Swap values if loSwap is less then hiSwap\r
+    If loSwap < hiSwap Then\r
+      temp         = vec (loSwap)\r
+      vec (loSwap) = vec (hiSwap)\r
+      vec (hiSwap) = temp\r
+    End If\r
+  Loop While loSwap < hiSwap\r
+  \r
+  vec (loBound) = vec(hiSwap)\r
+  vec (hiSwap)  = pivot\r
+  \r
+  ' Recursively call function .. the beauty of Quicksort\r
+    ' 2 or more items in first section\r
+  If loBound < (hiSwap - 1) Then\r
+    QuickSort vec, loBound, hiSwap - 1\r
+  End If\r
+  \r
+  ' 2 or more items in second section\r
+  If hiSwap + 1 < hibound Then\r
+    QuickSort vec, hiSwap+1, hiBound\r
+  End If\r
+End Sub ' QuickSort\r
+\r
+' Get the group members out of Active Directory and push them\r
+' onto the grp_mbrs array\r
+Sub DumpGroup (groupname)\r
+  ' Create an LDAP object and set up the search for groupname\r
+  On Error Resume Next\r
+  Err.Clear\r
+  Set LDAPGroups = GetObject (                            _\r
+    "LDAP://cn="                                        & _\r
+    groupname                                           & _ \r
+    ",ou=apps,ou=Groups,ou=Corp,dc=ameriquest,dc=net"     _\r
+  )\r
+  \r
+  If Err.Number <> 0 Then\r
+    Err.Clear\r
+    echo "Warning: " & UCase (groupname) & " is empty!"\r
+    Exit Sub\r
+  End If\r
+\r
+  LDAPGroups.GetInfo\r
+\r
+  ' Get an array of members\r
+  members = LDAPGroups.GetEx ("member")\r
+\r
+  ' For each member get their displayName and push it onto the array\r
+  For Each member in members\r
+    Set user = GetObject ("LDAP://"& member)\r
+    LDAPGroups.filter = array ("user")\r
+    user.GetInfo\r
+\r
+    ' Kludgy way to check to see if this is a group: We attempt\r
+    ' to get groupType which should only be in a group type \r
+    ' record. If this fails then process the member as an\r
+    ' individual member, otherwise recurse to process the\r
+    ' group within the group...\r
+    Err.Clear\r
+    user.Get ("groupType")\r
+\r
+    if Err.Number = 0 Then\r
+      Err.Clear\r
+      groupname = LCase (user.Get ("cn"))\r
+      DumpGroup (groupname)\r
+    Else\r
+      name = user.Get ("displayName")\r
+      pushArray grp_mbrs, name\r
+    End If\r
+  Next\r
+End Sub\r
+\r
+For Each ARG in ARGV\r
+  Dim grp_mbrs ()\r
+\r
+  ' Get members of this group\r
+  DumpGroup (ARG)\r
+  \r
+  If UBound (grp_mbrs) > 0 Then\r
+    ' Sort them\r
+    QuickSort grp_mbrs, LBound (grp_mbrs), UBound (grp_mbrs)\r
+    \r
+    ' Output them\r
+    Display_Members owner, ARG, grp_mbrs\r
+\r
+    Erase grp_mbrs\r
+    echo\r
+  End If\r
+Next
\ No newline at end of file