• Harold_S
  • Registratie: Februari 2002
  • Laatst online: 02-03-2025
Ik moet van een OU in de AD een export maken van alle globale groepen die geen members bevat.
In het verleden heb ik een mooi vbscript gevonden wat wel van de volledige AD een export kan maken. Maar ik heb geen idee hoe ik dit kan aanpassen zodat het toepasbaar zou zijn voor 1 bepaalde OU.
Of heeft mogelijk iemand anders een prima oplossing?

Ik heb sterk getwijfeld in welk onderdeel ik dit moest posten. Hopelijk zit ik hier bij de juiste mensen :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
'VBScript to output to text file the members of all groups

On Error Resume Next
Set objArgs=wscript.Arguments

If objArgs(0)<>"-dn" Then
    wscript.echo "Dumping group membership using full DN..."
Else
    wscript.echo "Dumping group membership using only first CN part..."
End If

'Stuff for creating output text file
Const OutputFile = ".\groupdump.txt"
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Wshshell = Wscript.CreateObject("Wscript.Shell")
Set Output = Fso.OpentextFile(OutputFile, 2, True)

Set ADSIRootDSE = GetObject("LDAP://RootDSE")
ADSINamingNC = ADSIRootDSE.Get("rootDomainNamingContext")
Set ADSIConnection = CreateObject("ADODB.Connection")
ADSIConnection.Provider = "ADsDSOObject"
ADSIConnection.Open "ADs Provider"

ADSIQueryText = "<LDAP://" & ADSINamingNC & ">;(&(objectCategory=group));name,distinguishedName;subtree"

Set ADSICommand = CreateObject("ADODB.Command")
Set ADSICommand.ActiveConnection = ADSIConnection
ADSICommand.CommandText = ADSIQueryText
ADSICommand.Properties("Page Size") = 100
ADSICommand.Properties("Timeout") = 60
ADSICommand.Properties("searchscope") = 2
ADSICommand.Properties("Cache Results") = False

Set ADSIResult = ADSICommand.Execute

Do While not ADSIResult.EOF

    Output.WriteLine
    Output.WriteLine
    Output.WriteLine "Group: " & ADSIResult.Fields("name").Value
    Output.WriteLine "==============================================================="
    Set GetDN = GetObject("LDAP://" & ADSIResult.Fields("distinguishedName").Value)
    strAllValues = GetDN.GetEx("member")
    iGroupCount = 0
    For each strValue in strAllValues
        If Len(strValue) = 0 Then
            Output.WriteLine "There are no members in this group."
        Else
            iGroupCount = iGroupCount + 1
            If objArgs(0)<>"-dn" Then
                Output.WriteLine strValue
            Else
                Call Stripper(strValue)
                Output.WriteLine tmp
            End If
        End If
    Next
    Output.WriteLine "Total members in group: " & iGroupCount
    Set strAllValues = Nothing
    ADSIResult.MoveNext

Loop

Output.Close
wscript.echo "Operation has finished."
Wscript.quit


Function Stripper(StripperString)

pos = InStr(1, StripperString, "cn=", vbTextCompare)
If pos <> 0 Then
    tmp = Mid(StripperString, pos + 3)
    pos = InStr(tmp, ",")
    If pos <> 0 Then tmp = Mid(tmp, 1, pos - 1)
End If

End Function

  • alt-92
  • Registratie: Maart 2000
  • Niet online

alt-92

ye olde farte

4 dingetjes:

1: Gebruik de [ code ] tag als je scripts wil neerzetten, maakt het een stuk leesbaarder :)
2: Zelf de functies schrijven leer je over het algemeen veel meer van. 'Ergens' gevonden code dumpen met de vraag wat je aan moet passen is niet echt de manier ;)
3: doe het eens andersom: maak een dump van alle Global groepen in een OU, en filter op het aantal Members?
4: in plaats van VBscript, kun je hetzelfde niet bereiken met dsget en dsquery?

[ Voor 11% gewijzigd door alt-92 op 28-12-2009 12:11 ]

ik heb een 864 GB floppydrive! - certified prutser - the social skills of a thermonuclear device


  • Harold_S
  • Registratie: Februari 2002
  • Laatst online: 02-03-2025
alt-92 schreef op maandag 28 december 2009 @ 12:10:
4 dingetjes:

1: Gebruik de [ code ] tag als je scripts wil neerzetten, maakt het een stuk leesbaarder :)
2: Zelf de functies schrijven leer je over het algemeen veel meer van. 'Ergens' gevonden code dumpen met de vraag wat je aan moet passen is niet echt de manier ;)
3: doe het eens andersom: maak een dump van alle Global groepen in een OU, en filter op het aantal Members?
4: in plaats van VBscript, kun je hetzelfde niet bereiken met dsget en dsquery?
Dank je voor de tips. Ik wist totaal niet hoe dit soort dingen te posten. Ben blij dat het niet meteen wordt afgeschoten. Eens kijken of ik het nu nog kan aanpassen.
Ik ga morgen nog eens proberen om uberhaupt iets van scripten te begrijpen. Heb er nog minimaal mee gewerkt alleen al wel toegepast. Ben dit soort mensen dan ook altijd zeer dankbaar :)

  • Krypt
  • Registratie: April 2000
  • Laatst online: 31-01 02:19
Lijn 19 moet je aanpassen:
code:
1
ADSINamingNC = ADSIRootDSE.Get("rootDomainNamingContext")


Daar zet ie namelijk alleen je domain in, in deze vorm "DC=<this>,DC=<domain>,DC=<local>" (is het resultaat van ADSIRootDSE.Get("rootDomainNamingContext")).
Daar kan je ook OU's bij plaatsen door 'OU=' ervoor te plaatsen in de vorm van OU=<ou>,DC=<this>,DC=<domain>,DC=<local>

Als je lager gelegen OU's moet doorzoeken moet je meerdere 'OU=' toevoegen; elke OU een.

[ Voor 7% gewijzigd door Krypt op 28-12-2009 14:07 ]

Pvouput live