Eingelese Objekte überprüfen in VBScript
Hallo,
vorweg möchte ich erwähnen, das ich noch ein Anfänger bin was Scripting betrifft. Ich muss ein Script schreiben welches bei allen Benutzern in der Domäne das Feld "Company" füllt. In den Grundzügen habe ich das Script auch bereits fertig, nur ergeben sich für mich 2 abschliessende Probleme: Mein Script nimmt alle Objekte (Benutzer als auch Gruppen) und versucht das Feld Company zu befüllen es soll aber nur die Benutzer "anfassen" und mein 2. Problem ist, wie kann ich das Script so umbauen, dass es wahllos alle OUs auf dem Server durchsucht und nicht nur die Standard OU "Users"?
Um nur die Benutzer anzufassen, habe ich mir überlegt eine If-Bedingung in die FOR-Schleife einzubauen, allerdings weiß ich nicht wie ich überprüfen kann ob das momentane Objekt ein User ist.
So sieht mein Script bisher aus:
Code
On Error Resume Next
Const vCompany = "MusterCompany"*
Set objRootLDAP = GetObject("LDAP:rootDSE")
strDNSDomain = objRootLDAP.Get("defaultNamingContext")
Set objContainer = GetObject("LDAP:cn=Users," & strDNSDomain)
Set ou = GetObject ("LDAP://test.test.de/CN=Users, dc=test, dc=test, dc=de")
For Each obj In ou
If obj
obj.Put "company", vCompany
obj.SetInfo
WScript.Echo obj.samAccountName & VbCrLf & obj.company*
Next
Code
*) Handelt sich an der Stelle nur um ein Beispiel.
) Das Script läuft momentan noch auf einer Testdomäne, daher auch der komische LDAP-Pfad.
*) Das WScript ist zu Debugg-Zwecken drin.
Vielen Dank an alle die Antworten!
Mit freundlichen Grüßen
Wolfi
vorweg möchte ich erwähnen, das ich noch ein Anfänger bin was Scripting betrifft. Ich muss ein Script schreiben welches bei allen Benutzern in der Domäne das Feld "Company" füllt. In den Grundzügen habe ich das Script auch bereits fertig, nur ergeben sich für mich 2 abschliessende Probleme: Mein Script nimmt alle Objekte (Benutzer als auch Gruppen) und versucht das Feld Company zu befüllen es soll aber nur die Benutzer "anfassen" und mein 2. Problem ist, wie kann ich das Script so umbauen, dass es wahllos alle OUs auf dem Server durchsucht und nicht nur die Standard OU "Users"?
Um nur die Benutzer anzufassen, habe ich mir überlegt eine If-Bedingung in die FOR-Schleife einzubauen, allerdings weiß ich nicht wie ich überprüfen kann ob das momentane Objekt ein User ist.
So sieht mein Script bisher aus:
Code
On Error Resume Next
Const vCompany = "MusterCompany"*
Set objRootLDAP = GetObject("LDAP:rootDSE")
strDNSDomain = objRootLDAP.Get("defaultNamingContext")
Set objContainer = GetObject("LDAP:cn=Users," & strDNSDomain)
Set ou = GetObject ("LDAP://test.test.de/CN=Users, dc=test, dc=test, dc=de")
For Each obj In ou
If obj
obj.Put "company", vCompany
obj.SetInfo
WScript.Echo obj.samAccountName & VbCrLf & obj.company*
Next
Code
*) Handelt sich an der Stelle nur um ein Beispiel.
) Das Script läuft momentan noch auf einer Testdomäne, daher auch der komische LDAP-Pfad.
*) Das WScript ist zu Debugg-Zwecken drin.
Vielen Dank an alle die Antworten!
Mit freundlichen Grüßen
Wolfi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 65077
Url: https://administrator.de/contentid/65077
Ausgedruckt am: 26.11.2024 um 14:11 Uhr
1 Kommentar
Hallo Wolfroc!
Ein Beispiel, wie alle OU rekursiv nach Usern abgegrast werden können, findest Du zB hier: http://www.codeproject.com/useritems/Disable_Stale_AD_Users.asp (siehe Functions "EnumOUs" und "EnumUsers").
Alternativ dazu könntest Du folgende Vorgangsweise versuchen: Zunächst eine Abfrage mit entsprechendem Filter, um für die User DN und sAMAccountName zu erhalten, und dann jedes passende User-Objekt (im Beispiel unten werden Computerkonten, die OU "Users" und 2 einzelne User ausgespart) einzeln aufrufen:
Noch ein Selektionsbeispiel: Um (zB beim Testen) nur alle User aus einer bestimmten OU und deren Unter-OUs zu erhalten, könntest Du folgende Bedingung verwenden:
Grüße
bastla
Ein Beispiel, wie alle OU rekursiv nach Usern abgegrast werden können, findest Du zB hier: http://www.codeproject.com/useritems/Disable_Stale_AD_Users.asp (siehe Functions "EnumOUs" und "EnumUsers").
Alternativ dazu könntest Du folgende Vorgangsweise versuchen: Zunächst eine Abfrage mit entsprechendem Filter, um für die User DN und sAMAccountName zu erhalten, und dann jedes passende User-Objekt (im Beispiel unten werden Computerkonten, die OU "Users" und 2 einzelne User ausgespart) einzeln aufrufen:
Const vCompany = "MusterCompany"
Set adoConnection = CreateObject("ADODB.Connection")
Set adoCommand = CreateObject("ADODB.Command")
adoConnection.Provider = "ADsDSOOBject"
adoConnection.Open "Active Directory Provider"
Set adoCommand.ActiveConnection = adoConnection
Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("DefaultNamingContext")
'Abfrage auf User beschränken ...
strFilter = "(objectClass=user)"
'... und gewünschte Felder festlegen (sowie "subtree" für alle (Unter-)OU)
strQuery = "<LDAP://" & strDNSDomain & ">;" & strFilter _
& ";distinguishedName,sAMAccountName;subtree"
adoCommand.CommandText = strQuery
'Abfrage ausführen
Set adoRecordset = adoCommand.Execute
Do Until adoRecordset.EOF
'Keine Computerkonten ändern
If Right(adoRecordSet.Fields("sAMAccountName"), 1) <> "$" Then
'Konten in OU Users nicht ändern
If InStr(adoRecordSet.Fields("distinguishedName"), "CN=Users") = 0 Then
'Bestimmte User aussparen
Select Case LCase(adoRecordSet.Fields("sAMAccountName"))
'Folgende Konten (Anmeldenamen in Kleinbuchstaben) nicht ändern
Case "test01", "test02"
'hier keine Aktion durchführen
'Änderung für alle übrigen Konten durchführen
Case Else
Set obj = GetObject("LDAP://test.test.de/" & _
adoRecordSet.Fields("distinguishedName"))
obj.Put "company", vCompany
obj.SetInfo
WScript.Echo obj.samAccountName & VbCrLf & obj.company
End Select
End If
End If
adoRecordSet.MoveNext
Loop
If InStr(adoRecordSet.Fields("distinguishedName"), "OU=TestOU") <> 0 Then
Grüße
bastla