Guest User

dUkk

a guest
Oct 28th, 2008
1,304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. '==============================================================================
  2. '|                                                                            |
  3. '|   Most important thing while coding scripts or whatever is  -  sign it :)  |
  4. '|                                                                            |
  5. '|                           (c) dUkk 2008                                    |
  6. '==============================================================================
  7.  
  8.  
  9. Const ADS_SCOPE_SUBTREE = 2
  10. Const ADS_CHASE_REFERRALS_ALWAYS = &H60
  11. Dim TotalAccProcessed
  12. Dim RootDomainLDAP
  13.  
  14. 'check to see if we launched by correct interpreter(if not - relaunch correct)
  15. if Not isCScript() Then
  16.         set oShell = CreateObject("WScript.Shell")
  17.         set arguments = WScript.Arguments
  18.         sCMD = "cscript //nologo domgroupsenum.vbs"
  19.         For Each cmdArg in arguments
  20.             sCMD = sCMD & " " & cmdArg
  21.         Next
  22.         oShell.Run sCMD
  23.         WScript.Quit()
  24. End If
  25.  
  26. Set objArgs = WScript.Arguments
  27. if objArgs.Count < 2 Then
  28.    WScript.Echo "Enumerate all groups in specified domain"
  29.    WScript.Echo "and return all as tab delimited user specified text file"
  30.    WScript.Echo "ALL QUERYs are RECURSIVE!"
  31.    WScript.Echo "USAGE: domgroupsenum.vbs <LDAP query> <outfile.txt" & vbCrLf & vbCrLf
  32.    WScript.Echo "Example queryes:"
  33.    WScript.Echo "LDAP://dc=mydomain,dc=com              - to enum groups in *all* OUs on mydomain.com domain"
  34.    WScript.Echo "LDAP://ou=Groups,dc=mydomain,dc=com    - to start enum groups at 'Groups' OU on mydomain.com domain"
  35.    WScript.Echo "LDAP://domainserv/dc=mydomain,dc=com   - to enum *all* groups on mydomain.com domain at specified DC" & vbCrLf & vbCrLf
  36.    WScript.Echo "Press ENTER to quit"
  37.    WScript.StdIn.ReadLine()
  38.    WScript.Quit
  39. Else
  40.    LDAPQuery = objArgs(0)
  41. End if
  42.  
  43.  
  44. On Error Resume Next
  45. Set objConnection = CreateObject("ADODB.Connection")
  46. Set objCommand = CreateObject("ADODB.Command")
  47.  
  48. objConnection.Provider = "ADsDSOObject"
  49. objConnection.Open "Active Directory Provider"
  50. Set objCommand.ActiveConnection = objConnection
  51. objCommand.Properties("Page Size") = 1000
  52. objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
  53. objCommand.Properties("Chase referrals") = ADS_CHASE_REFERRALS_ALWAYS
  54. objCommand.Properties("TimeOut") = 120 'in seconds
  55. objCommand.Properties("Cache Results") = False
  56.  
  57.  
  58. Set cf = CreateObject("Scripting.FileSystemObject")
  59.  
  60. objCommand.CommandText = "SELECT primaryGroupToken, Name, description, member, groupType FROM '" & LDAPQuery & "' WHERE objectCategory='group'"
  61. Set objRecordSet = objCommand.Execute
  62. If objRecordSet.BOF Then
  63.    WScript.Echo "ERROR querying: " & LDAPQuery
  64.    WScript.Quit
  65. Else
  66.    objRecordSet.MoveFirst
  67. End If
  68.  
  69. RootDomainLDAP=ConstructGlobalDomain(LDAPQuery)
  70. Set cs = cf.OpenTextfile(objArgs(1), 2, True)
  71. If Err.Number <> 0 Then
  72.    WScript.Echo "Can't create output file!" & vbCrLf
  73.    WScript.Quit
  74. End If
  75.  
  76. Do Until objRecordSet.EOF
  77.        GroupName=objRecordSet.Fields("Name").Value
  78.        arrField = objRecordSet.Fields("description")
  79.        if IsArray(arrField) Then
  80.           For Each strItem In arrField
  81.               GroupDescr = strItem
  82.           Next
  83.        elseif Not IsNull(arrField) Then
  84.           GroupDescr = arrField.Value
  85.        else
  86.           GroupDescr = ""
  87.        End if
  88.        If Err.Number <> 0 Then
  89.           WScript.Echo "ERROR querying GroupName and GroupDescr: " & Err.Description & vbCrLf
  90.        End If
  91.  
  92.        Select Case objRecordSet.Fields("groupType")
  93.        Case 2
  94.             GroupType="Global" '"This is a global distribution group."
  95.       Case 4
  96.             GroupType="Local" '"This is a domain local distribution group."
  97.       Case 8
  98.             GroupType="Universal" '"This is a universal distribution group."
  99.       Case -2147483646
  100.             GroupType="Global" '"This is a global security group."
  101.       Case -2147483644
  102.             GroupType="Local" '"This is a domain local security group."
  103.       Case -2147483643
  104.             GroupType="Local" '"This is a domain local security group created by system."
  105.       Case -2147483640
  106.             GroupType="Universal" '"This is a universal security group."
  107.       Case else
  108.             GroupType=""
  109.        End Select
  110.        If Err.Number <> 0 Then
  111.           WScript.Echo "ERROR querying GroupType: " & Err.Description & vbCrLf
  112.        End If
  113.  
  114.        arrField = objRecordSet.Fields("member")
  115.        if IsArray(arrField) Then
  116.           For Each strItem In arrField
  117.               Set objGroup = GetObject("LDAP://" & strItem)
  118.               Select Case objGroup.sAMAccountType
  119.               Case 805306368
  120.                    GroupMemberType="User"
  121.               Case 805306369
  122.                    GroupMemberType="User"
  123.               Case 268435456
  124.                    GroupMemberType="Global"
  125.               Case 536870912
  126.                    GroupMemberType="Local"
  127.               Case else
  128.                    GroupMemberType="Contact"
  129.               End Select
  130.               If InStr(1, objGroup.sAMAccountName, "$", 1) < 1 Then
  131.                  'if GroupMemberType <> "Contact" Then
  132.                 cs.write MaskValueIfEmpty(GroupName, "") & vbTab 'GROUPNAME
  133.                 cs.write MaskValueIfEmpty(GroupDescr, "") & vbTab 'GROUPDESCRIPTION
  134.                 cs.write MaskValueIfEmpty(GroupType, "") & vbTab 'GROUP TYPE
  135.                 cs.write objGroup.samAccountName & vbTab 'GROUP:MEMBER NAME
  136.                 cs.write GroupMemberType & vbCrLf 'GROUP:MEMBER TYPE
  137.                 'End If
  138.              End If
  139.               Set objGroup = Nothing
  140.           Next
  141.        elseif Not IsNull(arrField) Then
  142.            cs.write MaskValueIfEmpty(GroupName, "") & vbTab 'GROUPNAME
  143.           cs.write MaskValueIfEmpty(GroupDescr, "") & vbTab 'GROUPDESCRIPTION
  144.           cs.write MaskValueIfEmpty(GroupType, "") & vbTab 'GROUP TYPE
  145.  
  146.            cs.write MaskValueIfEmpty(arrField.Value, "") & vbTab 'GROUP:MEMBER NAME
  147.           cs.write "" & vbCrLf
  148.        else
  149.            cs.write MaskValueIfEmpty(GroupName, "") & vbTab 'GROUPNAME
  150.           cs.write MaskValueIfEmpty(GroupDescr, "") & vbTab 'GROUPDESCRIPTION
  151.           cs.write MaskValueIfEmpty(GroupType, "") & vbTab 'GROUP TYPE
  152.  
  153.            cs.write "" & vbTab 'GROUP:MEMBER NAME
  154.           cs.write "" & vbCrLf 'GROUP:MEMBER TYPE
  155.       End if
  156.        If Err.Number <> 0 Then
  157.           WScript.Echo "ERROR working with GroupMember: " & Err.Description & vbCrLf
  158.        End If
  159.  
  160.        EnumPrimaryMembers(objRecordSet.Fields("primaryGroupToken"))
  161.  
  162.     TotalAccProcessed = TotalAccProcessed + 1
  163.     objRecordSet.MoveNext
  164. Loop
  165.  
  166.  
  167. WScript.Echo "Total groups Listed: " & TotalAccProcessed
  168.  
  169.  
  170. Set objConnection = Nothing
  171. Set objCommand = Nothing
  172.  
  173. cs.Close
  174. WScript.Quit
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211. 'return members for specified by token group
  212. Function EnumPrimaryMembers(intGroupToken)
  213. On Error Resume Next
  214. Dim objConnection2
  215. Dim objCommand2
  216. Dim objRecordset2
  217. Set objConnection2 = CreateObject("ADODB.Connection")
  218. Set objCommand2 = CreateObject("ADODB.Command")
  219. objConnection2.Open "Provider=ADsDSOObject;"
  220. objCommand2.ActiveConnection = objConnection2
  221. objCommand2.Properties("Page Size") = 1000
  222. objCommand2.Properties("Searchscope") = ADS_SCOPE_SUBTREE
  223. objCommand2.Properties("Chase referrals") = ADS_CHASE_REFERRALS_ALWAYS
  224. objCommand2.Properties("TimeOut") = 120 'in seconds
  225. objCommand2.Properties("Cache Results") = False
  226. objCommand2.CommandText = "SELECT sAMAccountName, sAMAccountType FROM '" & RootDomainLDAP & "' WHERE primaryGroupID=" & intGroupToken
  227. Set objRecordSet2 = objCommand2.Execute
  228. if Err.Number <> 0 Then
  229.    WScript.Echo "CRITICAL ERROR in EnumPrimaryMembers(): " & Err.Description & vbCrLf
  230.    WScript.Echo "In Params: " & intGroupToken & " LDAP " & RootDomainLDAP
  231. End If
  232. Do Until objRecordset2.EOF
  233.     Select Case objRecordset2.Fields("sAMAccountType")
  234.     Case 805306368
  235.           GroupMemberType="User"
  236.     Case 805306369
  237.           GroupMemberType="User"
  238.     Case 268435456
  239.           GroupMemberType="Global"
  240.     Case 536870912
  241.           GroupMemberType="Local"
  242.     Case 805306370
  243.           GroupMemberType="Computer"
  244.     Case else
  245.           GroupMemberType=objRecordset2.Fields("sAMAccountType")'"Contact"
  246.    End Select
  247.     If InStr(1, objRecordset2.Fields("sAMAccountName").Value, "$", 1) < 1 Then
  248.        cs.write MaskValueIfEmpty(GroupName, "") & vbTab 'GROUPNAME
  249.       cs.write MaskValueIfEmpty(GroupDescr, "") & vbTab 'GROUPDESCRIPTION
  250.       cs.write MaskValueIfEmpty(GroupType, "") & vbTab 'GROUP TYPE
  251.       cs.write objRecordset2.Fields("sAMAccountName").Value & vbTab 'GROUP:MEMBER NAME
  252.       cs.write GroupMemberType & vbCrLf 'GROUP:MEMBER TYPE
  253.    End If
  254.     objRecordset2.MoveNext
  255. Loop
  256. objConnection2.Close
  257. Set objConnection2 = Nothing
  258. Set objCommand2 = Nothing
  259. End Function
  260.  
  261. Function ConstructGlobalDomain(ldap)
  262.    On Error Resume Next
  263.    Dim Arr
  264.    Dim outstr
  265.    Arr = Split(ldap, ",", -1, 1)
  266.    For i = 0 TO UBound(Arr)
  267.      'we interested only in "DC"
  268.     If InStr(1, lcase(Arr(i)), "dc", 1) > 0 Then
  269.         If Len(outstr) > 0 Then outstr = outstr + ","
  270.         outstr=outstr + Arr(i)
  271.      End If
  272.    Next
  273.    'prepend LDAP:// of not here already
  274.   if InStr(1, lcase(outstr), "ldap://", 1) > 0 Then
  275.       ConstructGlobalDomain=outstr
  276.    else
  277.       ConstructGlobalDomain="LDAP://" & outstr
  278.    End If
  279.    if Err.Number <> 0 Then
  280.       Wscript.Echo "ConstructGlobalDomain() Error: " & vbCrLf & " , Description: " & Err.Description & vbCrLf
  281.    End If
  282.    On Error Goto 0
  283. End Function
  284.  
  285. 'fixup string value if it is empty or null
  286. Function MaskValueIfEmpty(Original, default)
  287.       if IsNull(Original) OR Len(Original) < 1 Then
  288.          MaskValueIfEmpty = default
  289.       Else
  290.          MaskValueIfEmpty = Original
  291.       End If
  292. End Function
  293.  
  294. ' convert OctetString (byte array) to Hex string
  295. Function OctetToHex(Octet)
  296.     OctetToHex = ""
  297.     For I = LBound(Octet) + 1 To UBound(Octet)
  298.         OctetToHex = OctetToHex & Right("0" & Hex(AscB(MidB(Octet, I, 1))), 2)
  299.     Next
  300. End Function
  301.  
  302. ' convert Sid hex string to string
  303. Function HexSidToString(HexSid)
  304.     Dim OctetSid, NumTmp
  305.     ReDim OctetSid(Len(HexSid) / 2 - 1)
  306.     For I = LBound(OctetSid) To UBound(OctetSid)
  307.         OctetSid(I) = CInt("&H" & Mid(HexSid, 2 * I + 1, 2))
  308.     Next
  309.     HexSidToString = "S-" & OctetSid(0) & "-" & OctetSid(1) & "-" & OctetSid(8)
  310.     NumTmp = OctetSid(15)
  311.     NumTmp = NumTmp * 256 + OctetSid(14)
  312.     NumTmp = NumTmp * 256 + OctetSid(13)
  313.     NumTmp = NumTmp * 256 + OctetSid(12)
  314.     HexSidToString = HexSidToString & "-" & CStr(NumTmp)
  315.     NumTmp = OctetSid(19)
  316.     NumTmp = NumTmp * 256 + OctetSid(18)
  317.     NumTmp = NumTmp * 256 + OctetSid(17)
  318.     NumTmp = NumTmp * 256 + OctetSid(16)
  319.     HexSidToString = HexSidToString & "-" & CStr(NumTmp)
  320.     NumTmp = OctetSid(23)
  321.     NumTmp = NumTmp * 256 + OctetSid(22)
  322.     NumTmp = NumTmp * 256 + OctetSid(21)
  323.     NumTmp = NumTmp * 256 + OctetSid(20)
  324.     HexSidToString = HexSidToString & "-" & CStr(NumTmp)
  325.     NumTmp = OctetSid(25)
  326.     NumTmp = NumTmp * 256 + OctetSid(24)
  327.     HexSidToString = HexSidToString & "-" & CStr(NumTmp)
  328. End Function
  329.  
  330. Function isCScript()
  331.  dim cmdline
  332.  cmdline = WScript.FullName
  333.  set tst = new regexp
  334.  tst.Pattern = "cscript.exe"
  335.  IsCScript=tst.test(WScript.FullName)
  336. End Function
  337.  
  338.  
Advertisement
Add Comment
Please, Sign In to add comment