landuin
Goto Top

VB Script zum User anlegen zusammenschustern

Hi Leute,

bevor ich euch mein Problem darstelle möchte ich noch was zu sagen. Ich habe bis vor zwei Tagen nie mit VB gearbeitet und habe auch sonst nicht viel erfahrung mit Programmieren. Das Basisprogramm hatte ich nach zwei Tagen soweit das es ohne Fehler lief (worauf ich ansich schon recht stolz bin weil ichs allein geschafft habe (ich habe es btw nicht selbst geschrieben lediglich angepasst)) nur müsste es jetzt erweitert werden durch:

- Nutzer und Gruppen anlegen incl. Rechtevergabe

- erstellen von Ordnern und einer Art Festplatte die dann ein Gruppenordner darstellen soll

- und Nutzer dürfen nur auf ihren eigenen Ordner zugreifen und dort lesen und schreiben können mit Ausnahme des Gruppenordners da dürfen dies auch


Benutzt habe ich dieses Scipt:


Dim fso, f, Zeile, Feld
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile ("user.txt",1,0)
Do while not f.AtEndOfLine
Zeile = f.readLine
Feld = split(Zeile,",")
Benutzer = Feld(0)
Vorname = Feld(1)
Nachname = Feld(2)
Passwort = Feld(3)Call BenuntzerAnlegen(Benutzer,Vorname,Nachname,Passwort)
Loop
f.Close
Wscript.Quit(0)
Sub BenuntzerAnlegen(Benutzer,Vorname,Nachname,Passwort)
Dim ouo, b
Set ouo = GetObject("LDAP:OU=abc,DC=firma1,DC=local")
Set b = ouo.Create("user", "CN=" & Vorname & " " & Nachname)
Dim WshShell, ret
Set WshShell = WScript.CreateObject("WScript.Shell")
b.Put "sAMAccountName", Benutzer
b.Put "displayName", Vorname & " " & Nachname
b.Put "givenName", Vorname
b.Put "sn", Nachname
b.Put "userAccountControl", 66082
b.Put "userPrincipalName", Benutzer & "@DomainName.TopLevelDomain"
b.Put "profilePath", "\\WMWARE\daten\profile\" & Benutzer
b.Put "homeDirectory", "\\WMWARE\daten\home\" & Benutzer
b.Put "homeDrive", "H:"
b.SetInfo
b.SetPassword Passwort
b.AccountDisabled = False
b.SetInfo
WScript.Sleep(1000)
ret = WshShell.Run ("verz.cmd " & Benutzer,0,1)
End Sub

Ein bisschen was kann es ja schon nur fehlen die Rechte, Gruppen, Laufwerke und Gruppenlaufwerke.

Meine Suche im Internet hat das zu den Rechten ergeben:

md \\server\daten\home\%1
echo J | cacls \\server\daten\home\%1 /C /E /G Administratoren:F
echo J | cacls \\server\daten\home\%1 /C /E /G domaene\%1:F
echo J | cacls \\server\daten\home\%1 /C /E /R Jeder
md \\server\daten\profile\%1
echo J | cacls \\server\daten\profile\%1 /C /E /G Administratoren:F
echo J | cacls \\server\daten\profile\%1 /C /E /G domaene\%1:F
echo J | cacls \\server\daten\profile\%1 /C /E /R Jeder

winpop ADD %1@MeinDomaene

Ich hab aber keine Ahnung wie ich das einbinden soll....


Und zu den Gruppen hab ich das gefunden:

' Die Gruppe wird gesucht und als Ziel definiert.
Set GroupObj = GetObject("" &"WinNT:
" & _
DomainString &"/"& GroupString &"")
' Der User wird in die entsprechende Gruppe integriert.
GroupObj.Add (""&"WinNT://"& _
DomainString &"/"& UserString &"")
Set DomainObj = Nothing ' Variable wird frei gegeben '
Set GroupObj = Nothing ' Variable wird frei gegeben '

Und hier hab ich auch keine Ahnung von....

Naja....selbst wenn die beiden Scripts dort oben funktionieren fehlen noch immer die Ordner und das Gruppenlaufwerk.
Ich hoffe es kann mir da jemand helfen.

Und vielen Dank wer sich bis hierhin durchgelesen hat! face-smile

Content-ID: 92684

Url: https://administrator.de/contentid/92684

Ausgedruckt am: 18.11.2024 um 19:11 Uhr

Nailara
Nailara 23.07.2008 um 10:40:48 Uhr
Goto Top
Hi,

willst Du es einfach nur gemacht haben oder lernen?

Zum Lernen nutze bitte: http://www.microsoft.com/technet/scriptcenter/scripts/network/dns/manag ...

Grüße
landuin
landuin 23.07.2008 um 12:20:59 Uhr
Goto Top
Vielen dank schon mal für deine Antwort! face-smile

Hmmm......also lernen wäre zwar eine gute Idee aber das werde ich wohl nicht im Praktikum schaffen und in zwei Wochen sollte ich das erledigt haben. Das Problem ist das ich den Admin nicht fragen kann weil er selbst nicht viel von VB versteht, obwohl er ansonsten echt Ahnung hat, nur halt davon nicht. Bei den drei Brocken oben versuche ich schon die ganze Zeit die zusammen zu basteln.....

Ich finde auch irgendwie nicht den passenden Script Code in deinem Link den ich für mein Programm bräuchte.
Logan000
Logan000 23.07.2008 um 14:20:32 Uhr
Goto Top
Moin Moin

Gruppen zugeörigkeit setzen:
Gruppenname = "MeineGruppe"  
Username = "MeinNeuereUser"  

Const ADS_PROPERTY_APPEND = 3 
Set objGroup = GetObject ("LDAP://cn=" & Gruppenname & ",OU=abc,DC=firma1,DC=local") 				  
objGroup.PutEx ADS_PROPERTY_APPEND, "member", Array("cn=" & Username & ",OU=abc,DC=firma1,DC=local"")  
objGroup.SetInfo

Ordner Erstellen läuft so:
Set objFSO = CreateObject("Scripting.FileSystemObject")  
objFSO.CreateFolder("c:\Neuer Ordner")  

Kleiner Tip: Spar dir das Homver. und lass die user lieber in Eigene Dateien arbeiten.

Das mit den Laufwerken und Gruppenlaufwerken habe ich überhaupt nicht verstanden.

Vieleicht ist dieser Link besser.

Gruß L.
landuin
landuin 23.07.2008 um 15:19:38 Uhr
Goto Top
Also mit dem Script arbeite ich zur Zeit und es funktioniert auch gut und auch die Rechte werden vergeben. Das einzige was an diesem Script nicht stimmt ist das die Gruppen nicht erstellt werden. Also ich wollte das eigentlich so haben das die User erstellt und dann gleich in die richtige Gruppe gepackt werden.


Ich bekomme die Fehlermeldung:

Zeile: 80

Zeichen: 1

Das Objekt unterstützt diese Eigenschaft oder Methode nicht.:'GroupObj.Add'

Code: 800A01B6

Quelle Laufzeitfehler in Microsoft VBScript


Dim fso, f, Zeile, Feld
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)

Do while not f.AtEndOfLine
Zeile = f.readLine
Feld = split(Zeile,",")
Benutzer = Feld(0)
Vorname = Feld(1)
Nachname = Feld(2)
Passwort = Feld(3)
Call BenuntzerAnlegen(Benutzer,Vorname,Nachname,Passwort)
Loop
f.Close
'MSGBOX "Scriptverarbeitung abgeschlossen" & vbCrlf & "Who am I"
Wscript.Quit(0)


Sub BenuntzerAnlegen(Benutzer,Vorname,Nachname,Passwort)
Dim ouo, b
Set ouo = GetObject("LDAP:OU=abc,DC=firma1,DC=local")
Set b = ouo.Create("user", "CN=" & Vorname & " " & Nachname)
Dim WshShell, ret
Set WshShell = WScript.CreateObject("WScript.Shell")
b.Put "sAMAccountName", Benutzer
b.Put "displayName", Vorname & " " & Nachname
b.Put "givenName", Vorname
b.Put "sn", Nachname
b.Put "userAccountControl", 66082
b.Put "userPrincipalName", Benutzer & "@DomainName.TopLevelDomain"
b.Put "profilePath", "\\vmware\daten\profile\" & Benutzer
b.Put "homeDirectory", "\\vmware\daten\home\" & Benutzer
b.Put "homeDrive", "q:"
b.SetInfo

'Password läuft nicht ab'
b.SetPassword Passwort
b.Put "userAccountControl", 66082
b.AccountDisabled = False
b.SetInfo


'Logincript'
Set UserObj = GetObject("WinNT:
vmware/" & Benutzer)
UserObj.LoginScript = "datev.bat"
UserObj.SetInfo
Set UserObj = Nothing


Dieser Teil geht nicht.....
'Gruppe hinzufügen'
Set GroupObj = GetObject("WinNT:vmware/" & Benutzer)
GroupObj.Add = ("WinNT:
vmware/" & Benutzer) <------------------Der Teil wäre Zeile 80
GroupObj.SetInfo
Set DomainObj = Nothing
Set GroupObj = Nothing

WScript.Sleep(1000)
ret = WshShell.Run ("rechte.cmd " & Benutzer,0,1)
End Sub
'...........................................................................

'3. Teil - Verz.cmd

'md \\server\daten\home\%1
'echo J | cacls \\server\daten\home\%1 /C /E /G Administratoren:F
'echo J | cacls \\server\daten\home\%1 /C /E /G domaene\%1:F
'echo J | cacls \\server\daten\home\%1 /C /E /R Jeder
'md \\server\daten\profile\%1
'echo J | cacls \\server\daten\profile\%1 /C /E /G Administratoren:F
'echo J | cacls \\server\daten\profile\%1 /C /E /G domaene\%1:F
'echo J | cacls \\server\daten\profile\%1 /C /E /R Jeder


________________________________________________________________


@Logan000
Ja vielen Dank damit kann ich sicherlich mehr Anfangen. xD

Also ich glaube bei den Sachen mit den Laufwerken hab ich mich wohl falsch ausgedrückt. Der User soll zwei Ordner haben einmal den eigenen und einmal den Gruppenordner.....Ich weiss nicht so recht wie ich das erklären soll.....


Gruppenname = "MeineGruppe"
Username = "MeinNeuereUser"

Const ADS_PROPERTY_APPEND = 3
Set objGroup = GetObject ("LDAP://cn=" & Gruppenname & ",OU=abc,DC=firma1,DC=local")
objGroup.PutEx ADS_PROPERTY_APPEND, "member", Array("cn=" & Username & ",OU=abc,DC=firma1,DC=local"")
objGroup.SetInfo

Kann ich dann das Script für die Gruppenzugehörigkeit für den nicht funktionierenden Teil nehmen?


Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CreateFolder("c:\Neuer Ordner")

Muss ich das erst irgendwie einbinden oder geht das auch einfach so?
Logan000
Logan000 23.07.2008 um 16:18:07 Uhr
Goto Top
Kann ich dann das Script für die Gruppenzugehörigkeit für den nicht funktionierenden Teil nehmen?
So war es gedacht.

Muss ich das erst irgendwie einbinden oder geht das auch einfach so?
Einbinden?
Du baust den Teil dort in deinem Skript ein wo du einen Ordner anlegen möchtest.

..Ich weiss nicht so recht wie ich das erklären soll.....
Das ist aber schlecht zu skripten.

Der User soll zwei Ordner haben einmal den eigenen und einmal den Gruppenordner...
Nun "den eigenen " das dürfte das Homverz. des users sein. DAs legst du mit CreateFolder an.
Gruppenordner
Klingt nicht sehr Userspezifisch da her wird er wohl existieren. Wenn nicht Woher soll der Name für diesen Ordner kommen?

Gruß L.
bastla
bastla 23.07.2008 um 22:19:02 Uhr
Goto Top
Hallo landuin!

Zum Thema "User in Gruppe aufnehmen": Mit
Set GroupObj = GetObject("WinNT://vmware/" & Benutzer)  
greifst Du ja wieder auf das User-Objekt zu, dem Du dann (auch mit richtiger Syntax) den User ja schlecht als Migllied hinzufügen kannst ...

Unter der Annahme, dass die Variable "Gruppe" den Gruppennamen (woher der stammt, musst Du selbst wissen) enthält, sollte es auch über "WinNT" gehen:
Set UserObj = GetObject("WinNT://vmware/" & Benutzer) 'hattest Du oben schon, daher hier nur der Vollständigkeit wegen  

Set GroupObj = GetObject("WinNT://vmware/" & Gruppe)  
GroupObj.Add UserObj.AdsPath
GroupObj.SetInfo
Grüße
bastla
landuin
landuin 24.07.2008 um 09:10:45 Uhr
Goto Top
Guten Morgen, face-smile


also ich hab heute beide Quelltexte ausprobiert den von bastla und den von Logan000.

Bei bastla bekomme ich folgende Fehlermeldung: 80005000

Und bei Logan000 wird "Code: 800A0409" angezeigt.

Die Frage ist jetzt welcher Fehler leichter zu beheben ist und wie man den beheben kann damit das Script auch sauber läuft.

EDIT: Muss ich in meiner user.txt auch den Gruppennamen eingeben? Weil bisher siehts so aus: jn,nein,ja,12345Abc <------also das ist der user name

EDIT2: Kann es auch sein das man die Gruppe in "B.Put" noch erwähnen muss wenn ja dann wie?

Das ist mein aktueller Stand:



Dim fso, f, Zeile, Feld
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)

Do while not f.AtEndOfLine
Zeile = f.readLine
Feld = split(Zeile,",")
Benutzer = Feld(0)
Vorname = Feld(1)
Nachname = Feld(2)
Passwort = Feld(3)
Call BenuntzerAnlegen(Benutzer,Vorname,Nachname,Passwort)
Loop
f.Close
Wscript.Quit(0)


Sub BenuntzerAnlegen(Benutzer,Vorname,Nachname,Passwort)
Dim ouo, b
Set ouo = GetObject("LDAP:OU=abc,DC=firma1,DC=local")
Set b = ouo.Create("user", "CN=" & Vorname & " " & Nachname)
Dim WshShell, ret
Set WshShell = WScript.CreateObject("WScript.Shell")
b.Put "sAMAccountName", Benutzer
b.Put "displayName", Vorname & " " & Nachname
b.Put "givenName", Vorname
b.Put "sn", Nachname
b.Put "userAccountControl", 66082
b.Put "userPrincipalName", Benutzer & "@DomainName.TopLevelDomain"
b.Put "profilePath", "\\vmware\daten\profile\" & Benutzer
'b.Put "homeDirectory", "\\vmware\daten\home\" & Benutzer
b.Put "homeDrive", "q:"
b.SetInfo


'Password läuft nicht ab'
'b.SetPassword Passwort
'b.Put "userAccountControl", 66082
'b.AccountDisabled = False
'b.SetInfo


'Logincript'
'Set UserObj = GetObject("WinNT:
vmware/" & Benutzer)
'UserObj.LoginScript = "datev.bat"
'UserObj.SetInfo
'Set UserObj = Nothing


Set UserObj = GetObject("WinNT:vmware/" & Benutzer)

Set GroupObj = GetObject("WinNT:
vmware/" & Gruppe)<------Genau da kommt der Fehler 80005000 Zeichen 1
GroupObj.Add UserObj.AdsPath
GroupObj.SetInfo


'Gruppenname = "TestGruppe"
'Username = "MeinNeuereUser" <----------den hatte ich auskommentiert gehabt beim Test denn damit kann man doch nur einen User anlegen?! Wollte aber schon mit dem Script so ca 500 User in die AD incl Gruppen aufnehmen.

'Const ADS_PROPERTY_APPEND = 3
'Set objGroup = GetObject ("LDAP:cn=" & Gruppenname & ",OU=abc,DC=firma1,DC=local")
'objGroup.PutEx ADS_PROPERTY_APPEND, "member", Array("cn=" & Username & ",OU=abc,DC=firma1,DC=local"") <-------fehlende Zeichenfolgenkonstante<----- 800A0409
'objGroup.SetInfo



'Gruppe hinzufügen'
'Set GroupObj = GetObject("WinNT:
vmware/" & Benutzer)
'GroupObj.Add = ("WinNT://vmware/" & Benutzer)
'GroupObj.SetInfo
'Set DomainObj = Nothing
'Set GroupObj = Nothing


WScript.Sleep(1000)
ret = WshShell.Run ("rechte.cmd " & Benutzer,0,1)
End Sub
'...........................................................................

'3. Teil - Verz.cmd

'md \\server\daten\home\%1
'echo J | cacls \\server\daten\home\%1 /C /E /G Administratoren:F
'echo J | cacls \\server\daten\home\%1 /C /E /G domaene\%1:F
'echo J | cacls \\server\daten\home\%1 /C /E /R Jeder
'md \\server\daten\profile\%1
'echo J | cacls \\server\daten\profile\%1 /C /E /G Administratoren:F
'echo J | cacls \\server\daten\profile\%1 /C /E /G domaene\%1:F
'echo J | cacls \\server\daten\profile\%1 /C /E /R Jede
Logan000
Logan000 24.07.2008 um 10:05:44 Uhr
Goto Top
Moin Moin

Erstmal vorweg:
1. Du brauchst nicht jedesmal das gesamte skript zu posten. Es reichen die interesanten Teile (an denen du Änderungen vorgenommen hast ...).
2. Schau mal in der Formatierungshilfe nach . Das sieht nicht nur schicker aus sodern erleichtert auch die Arbeit.
3. Sei etwas sparsamer mit Leerzeilen.

Muss ich in meiner user.txt auch den Gruppennamen eingeben?
Das oder du holst ihn woander her. Wie auch immer, du hast weder in bastlas code die Variable "gruppe" noch in meinen bsp. "Gruppenname" mit Werten versehen.
Das soltes du mal tun.

Gruß L
bastla
bastla 24.07.2008 um 10:08:18 Uhr
Goto Top
Hallo landuin!

Set UserObj = GetObject("WinNT://vmware/" & Benutzer) <------Genau da kommt der Fehler 80005000 Zeichen 1
Anhand der Fehlernummer wirst Du vermutlich selbst schon herausgefunden haben, dass offensichtlich der Benutzer nicht gefunden wird ("ungültiger ADSI-Pfadname").

'objGroup.PutEx ADS_PROPERTY_APPEND, "member", Array("cn=" & Username & ",OU=abc,DC=firma1,DC=local"") <-------fehlende Zeichenfolgenkonstante<----- 800A0409
Es befinden sich hinter "local" zwei Anführungszeichen - entferne eines davon (welches ist Dir überlassen face-wink).

Muss ich in meiner user.txt auch den Gruppennamen eingeben? Weil bisher siehts so aus: jn,nein,ja,12345Abc <------also das ist der user name
Wenn der neue Benutzer genau einer Gruppe zugeordnet werden soll, wäre das sinnvoll - beim Einlesen müsstest Du den Gruppennamen dann der Variable "Gruppe" (bzw bei Logan000: "Gruppenname") zuweisen. Ansonsten muss auf andere Weise festgelegt werden, welcher(n) Gruppe(n) der Benutzer angehören soll.

Die Gruppe muss natürlich beim Hinzufügen des Users bereits existieren.

Kann es auch sein das man die Gruppe in "B.Put" noch erwähnen muss wenn ja dann wie?
Nein.

Grüße
bastla
landuin
landuin 24.07.2008 um 10:41:15 Uhr
Goto Top
OMG das hat tatsächlich funktioniert!!!!! Vielen vielen Dank!!! XXXDDD


Einen Wermutstropfen gibts aber noch denn es fehlt noch das die Gruppen automatisch mit angelegt werden. Das eben hat funktioniert weil ich den Gruppennamen mit reingeschrieben hatte habe ich den rausgelassen hat er nur die Benutzer angelegt ohne alles. Vielleicht ist das das letzte was benötigt wird aber wer weiss was sich der admin hier noch so schönes einfallen lässt....
landuin
landuin 24.07.2008 um 10:57:21 Uhr
Goto Top
Anhand der Fehlernummer wirst Du vermutlich selbst schon herausgefunden haben, dass offensichtlich der Benutzer nicht gefunden wird ("ungültiger ADSI-Pfadname").

Ja das ist mir aufgefallen nur wusste ich ne Zeitlang nicht das ich zb auch den Gruppennamen in die user.txt Datei schreiben sollte.

Es befinden sich hinter "local" zwei Anführungszeichen - entferne eines davon (welches ist Dir überlassen face-wink).

Ja ein " hatte ich schon raus genommen in dem Versuch wo es funktioniert hat. XD

Wenn der neue Benutzer genau einer Gruppe zugeordnet werden soll, wäre das sinnvoll

Ist es auch möglich einem user mehrere Gruppen zuzuordnen also zb:

jn,nein,ja,12345Abc,TestGruppe,TestGruppe100

Ist es denn überhaupt möglich die Gruppen anzulegen ohne sie vorher in die AD geschrieben zu haben?

Achja das Script hat funktioniert weil ich den Gruppennamen so geschrieben habe "TestGruppe" und noch zusätzlich in die user.txt den Grupennamen hinzugefügt habe.
bastla
bastla 24.07.2008 um 11:18:23 Uhr
Goto Top
Hallo landuin!

Ist es denn überhaupt möglich die Gruppen anzulegen ohne sie vorher in die AD geschrieben zu haben?
Mit "Gruppen anlegen" dürftest Du das Aufnehmen von Benutzern in die Gruppe meinen, und das setzt voraus, dass es die Gruppe bereits gibt - insofern wären vorweg (sinnvoller Weise auf Basis einer zweiten Liste/csv-Datei) alle benötigten
Gruppen zu erstellen. Info zum Erstellen: http://www.microsoft.com/technet/scriptcenter/scripts/ad/groups/adgpvb0 ...

Ist es auch möglich einem user mehrere Gruppen zuzuordnen also zb:
> jn,nein,ja,12345Abc,TestGruppe,TestGruppe100
Ja, auch wenn's datenbankmäßig unsauber wäre (insbesondere, wenn es eine unterschiedliche Zahl von Gruppen je User gäbe). Das könnte dann schematisch etwa so aussehen:
For i = 4 To UBound(Feld)
    Gruppe = Feld(i)
    GruppeAnlegen(Benutzer, Gruppe)
Next
wobei es dann ein eigenes "Sub GruppeAnlegen" geben müsste.

Grüße
bastla
landuin
landuin 24.07.2008 um 11:37:55 Uhr
Goto Top
Das heisst dann das ich den

Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000

Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com")  
Set objGroup = objOU.Create("Group", "cn=HR-Employees")  

objGroup.Put "sAMAccountName", "HRStaff"  
objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _  
    ADS_GROUP_TYPE_SECURITY_ENABLED
objGroup.SetInfo

und den Code

For i = 4 To UBound(Feld)
    Gruppe = Feld(i)
    GruppeAnlegen(Benutzer, Gruppe)
Next

so kombinieren kann das ich je nachdem wieviele user es gibt die dann einer dem entsprechenden Gruppe zuordnen kann? Wäre dann aber nicht nur ein User pro Gruppe möglich?

EDIT: Was mache ich wenn ich die User in OUs reinpacke also zb firma->nutzer->schüler ? Kann man das so schreiben ?

Set ouo = GetObject("LDAP://OU=firma,OU=benutzer,OU=schüler,DC=firma1,DC=local")  
bastla
bastla 24.07.2008 um 11:50:53 Uhr
Goto Top
Hallo landuin!

Die beiden Codestücke haben nur sehr bedingt miteinander zu tun ...

Der erste Code dient dem Erstellen der Gruppen und muss für jede Gruppe ausgeführt werden, bevor die Useranlage überhaupt beginnt - ob als eigenes Script oder als vorgeschalteter Script-Teil musst Du selbst entscheiden.

Wenn Du dann alle benötigten Gruppen erstellt hast, ist es möglich, die neuen User den Gruppen hinzuzufügen - die "For"-Schleife gehört also zum Anlegen der User und sorgt dafür, dass der User Mitglied in allen der für ihn in der csv-Datei eingetragenen Gruppen wird.
Der LDAP-Pfad ist immer von unten nach oben aufzulösen - wenn daher die OU, in welche der User soll, "schüler" ist, wäre der Pfad so festzulegen:
Set ouo = GetObject("LDAP://OU=schüler,OU=benutzer,OU=firma,DC=firma1,DC=local")  
Grüße
bastla
landuin
landuin 24.07.2008 um 13:38:12 Uhr
Goto Top
Vielen Dank es hat wieder funktioniert ! XD

Aber es geht noch weiter.Also folgendes es muss eine Organisationseinheit erstellt werden die dann auch Variabel bleiben soll also so in etwa.

Set ouo = GetObject("LDAP:// hier soll eine Variable rein ,OU=schüler,OU=benutzer,OU=firma,DC=firma1,DC=local")  

In diese Variable kommt dann sowas wie "Klasse 31A" was sich das script aus der usertxt holen soll so wie im unteren Teil beschrieben. Geht das denn überhaupt?

Do while not f.AtEndOfLine
Zeile = f.readLine
Feld = split(Zeile,",")  
Benutzer = Feld(0)
Vorname = Feld(1)
Nachname = Feld(2)
Passwort = Feld(3)
Organisationseinheit = Feld(5)
Call BenuntzerAnlegen(Benutzer,Vorname,Nachname,Passwort)
Loop
f.Close
Wscript.Quit(0)


Ich nehme noch gerne Vorschläge entgegen. :D
bastla
bastla 24.07.2008 um 14:07:42 Uhr
Goto Top
Hallo landuin!

Also folgendes es muss eine Organisationseinheit erstellt werden die dann auch Variabel bleiben soll also so in etwa.
Set ouo = GetObject("LDAP:// hier soll eine Variable rein ,OU=schüler,OU=benutzer,OU=firma,DC=firma1,DC=local")  
Damit erstellst Du keine OU, sondern greifst auf eine bereits vorhandene OU zu. Variabel geht es dann so:
Set ouo = GetObject("LDAP://OU=" & Organisationseinheit & ",OU=schüler,OU=benutzer,OU=firma,DC=firma1,DC=local")  
Zu
Organisationseinheit = Feld(5)
Wenn Du das oben dargestellte Konzept mit mehreren Gruppen je Benutzer verwenden willst, solltest Du in der csv-Datei dafür "Platz" lassen und die OU unmittelbar nach dem Passwort und dann erst die Gruppe(n) angeben - daher also Feld(4) für die OU und ab Feld(5) - die "For"-Schleife wäre dann entsprechend auf
For i = 5 To UBound(Feld)
anzupassen - für die Gruppe(n).

Außerdem müsstest Du die Organisationseinheit auch an das "Sub BenuntzerAnlegen" übergeben bzw dort übernehmen (und könntest bei dieser Gelegenheit vielleicht doch das zweite im Namen des Sub vorkommende "n" entsorgen face-wink).

Grüße
bastla
landuin
landuin 24.07.2008 um 14:38:27 Uhr
Goto Top
Das mit den Gruppen lass ich mir erstmal offen ich weiss noch nicht ob ich wirklich mehr als eine anlegen muss. :D

Aber ich versteh nicht wie ich das in mein Script einbaues denn wenn ich diese Gruppe unter

Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000

Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com")  
Set objGroup = objOU.Create("Group", "cn=HR-Employees")  

objGroup.Put "sAMAccountName", "HRStaff"  
objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _  
    ADS_GROUP_TYPE_SECURITY_ENABLED
objGroup.SetInfo
dieses Script packe 

Do while not f.AtEndOfLine
Zeile = f.readLine
Feld = split(Zeile,",")  
Benutzer = Feld(0)
Vorname = Feld(1)
Nachname = Feld(2)
Passwort = Feld(3)
Organisationseinheit = Feld(5)
Call BenuntzerAnlegen(Benutzer,Vorname,Nachname,Passwort)
Loop
f.Close
Wscript.Quit(0)


Bekomme ich diesen Fehler : 800708AC und er findet den Gruppennamen nicht mehr

Und umgekehrt findet er diese Zeile nicht mehr.

Set ouo = GetObject("LDAP://OU=" & Organisationseinheit & ",OU=schüler,OU=benutzer,OU=firma,DC=firma1,DC=local")  

Und gibt dann auch Fehler 80005000 aus. Also ich verstehe zwar warum die Fehler auftreten aber ich weiss nicht wie ich die beheben soll.


EDIT:


Und wenn ich das so schreibe bekomme ich folgenden Fehler:

Zeile = f.readLine
Feld = split(Zeile,",")  
Organisationseinheit = Feld(4)
f.Close


Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000

Set objOU = GetObject("LDAP://OU=" & Organisationseinheit & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local") <-------genau hier ist der Fehler  
Set objGroup = objOU.Create("Group", "cn=TestGruppe")  

objGroup.Put "sAMAccountName", "TestGruppe"  
objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _  
    ADS_GROUP_TYPE_SECURITY_ENABLED
objGroup.SetInfo




Do while not f.AtEndOfLine
Zeile = f.readLine
Feld = split(Zeile,",")  
Benutzer = Feld(0)
Vorname = Feld(1)
Nachname = Feld(2)
Passwort = Feld(3)
Organisationseinheit = Feld(5)
Call BenuntzerAnlegen(Benutzer,Vorname,Nachname,Passwort)
Loop
f.Close
Wscript.Quit(0)



Ein solches objekt ist auf dem Server nicht vorhanden
80072030

Und darunter kann ich mir gar nix vorstellen.
bastla
bastla 24.07.2008 um 16:12:46 Uhr
Goto Top
Hallo landuin!

So ganz weißt Du aber nicht, was Du da eigentlich tun sollst?

Vielleicht stellst Du einmal klar, was denn nun an AD-Struktur (OU, Gruppen) vorausgesetzt werden kann bzw was erstellt werden muss.

Erstellt wird in der Reihenfolge OU, Unter-OU, Unter-Unter-OU, ..., (falls gewünscht: Lokale Gruppe), Globale Gruppe, Benutzer (zur Erstellung einer OU: http://www.microsoft.com/technet/scriptcenter/scripts/ad/ous/adouvb07.m ..).

Das muss auch der Ablauf in Deinem Script sein, daher kann
Set ouo = GetObject("LDAP://OU=" & Organisationseinheit & ",OU=schüler,OU=benutzer,OU=firma,DC=firma1,DC=local")  
nur funktionieren, wenn es alle OU-Ebenen bereits gibt.

Das Beispiel für das Erstellen einer Gruppe ist an Deine AD-Struktur anzupassen (eine OU "HR" in der Domäne "fabrikam.com" hast Du ja wohl nicht) und kann auch nicht "unter" das Script zum Benutzererstellen gepackt werden, sondern muss, bevor der erste Benutzer angelegt wird, bereits erledigt sein.

Set objOU = GetObject("LDAP://OU=" & Organisationseinheit & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local") <-------genau hier ist der Fehler  
Gibt es alle verschachtelten Organisationseinheiten, also "firma", darin "benutzer", darin "schüler" und darin die in der Variablen "Organisationseinheit" gespeicherte OU? Sobald es diese gibt, solltest Du keinen Fehler mehr bekommen.

In Deinem letzten Script sind die Zeilen 1 bis 4 vollkommen entbehrlich - das Einlesen der Organisationseinheit, in welcher der Benutzer angelegt werden soll, passiert in Zeile 28 (mit der Feldnummer, für die Du Dich letztlich entscheidest, also 4 = vor der Gruppenangabe, oder 5 = nach der ersten Gruppe), zum Anlegen der OU siehe oben.

Also nochmals: Kläre die benötigte Struktur (welche / wieviele OU und Gruppen), stelle sie dar, und dann sehen wir weiter ...

Grüße
bastla
landuin
landuin 24.07.2008 um 17:40:15 Uhr
Goto Top
Ich hoffe ich hab es jetzt etwas verständlicher geschrieben.

So ganz weißt Du aber nicht, was Du da eigentlich tun sollst?

Richtig! Ich versuche es nach dem try&error Prinzip hinzubekommen. Obwohl ich mittlerweile schon was verstehe nur die Variablen OUs haben mir irgendwie den Rest gegeben und deswegen kam das zustande. Aber das witzige ist das es mittlerweile läuft. :D


Vielleicht stellst Du einmal klar, was denn nun an AD-Struktur (OU, Gruppen) vorausgesetzt werden kann bzw was erstellt werden muss.

Also das erstellen der User, der (mittlerweile variablen) Gruppe und der Variablen OU funktioniert.


(eine OU "HR" in der Domäne "fabrikam.com" hast Du ja wohl nicht)

Ja das stimmt aber das ist mir erst ein paar Stunden nach meinem Post aufgefallen.

Also nochmals: Kläre die benötigte Struktur (welche / wieviele OU und Gruppen), stelle sie dar, und dann sehen wir weiter ...

Wieviele OUs es im Endeffekt werden weiss ich nicht da die Teilnehmerzahl und die aktuellen Gruppen im Haus schwanken daher ist jetzt die Gruppe und die OU variabel gehalten.

Im Moment siehts bei mir so aus das die Gruppe und die OU den selben Namen haben sollten. Das heisst ja das die txt Datei wieder vorher aufgerufen werden muss und dann der Klassenname in die OU und in die Gruppe geschrieben werden soll. Nur fehlt mir dazu leider wieder die Erfahrung.

So siehts im mom aus:

Dim fso, f, Zeile, Feld 
Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  

dim Organisationseinheit
Organisationseinheit = "Klasse"  

dim Gruppe
Gruppe = "MOD085"  

Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000

Set objOU = GetObject("LDAP://ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local")  
Set objOU2 = objOU.Create("OrganizationalUnit", "OU=" & Organisationseinheit )  
objOU2.SetInfo

Set objOU = GetObject("LDAP://ou="&Organisationseinheit&",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local")  
Set objGroup = objOU.Create("Group", "cn=" & Gruppe)   '<-------  

objGroup.Put "sAMAccountName", "& Organisationseinheit"  
objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _  
    ADS_GROUP_TYPE_SECURITY_ENABLED
objGroup.SetInfo





Do while not f.AtEndOfLine
Zeile = f.readLine
Feld = split(Zeile,";")  
Vpname = Feld(0)
KursNR = Feld(1)
VpVorname = Feld(4)
VertrEnde = Feld(8)
Anmeldename = Feld(9)
Call BenuntzerAnlegen(Vpname,KursNR,VpVorname,VertrEnde,Anmeldename)
Loop
f.Close
Wscript.Quit(0)
bastla
bastla 24.07.2008 um 18:43:26 Uhr
Goto Top
Hallo landuin!

Im Moment siehts bei mir so aus das die Gruppe und die OU den selben Namen haben sollten.
Das steht aber im Widerspruch zu den Scriptzeilen 6 und 9 - so gesehen müsste Zeile 9 eigentlich heißen:
Gruppe = Organisationseinheit
Dann könnte auch die Zeile 21 lauten:
objGroup.Put "sAMAccountName", Gruppe  
Grüße
bastla
landuin
landuin 28.07.2008 um 09:04:35 Uhr
Goto Top
Hi bastla,

vielen Dank hat super funktioniert direkt auf Anhieb! :D

Bräuchte aber nochmals Hilfe. Und zwar soll das Programm jetzt um Fehlermeldungen erweitert werden also es soll gemeckert werden wenn zb die User, die Gruppe oder die Klasse schon vorhanden sind.
bastla
bastla 28.07.2008 um 09:28:30 Uhr
Goto Top
Hallo landuin!

Am Beispiel "User" (siehe http://www.microsoft.com/technet/scriptcenter/scripts/ad/users/list/usl ... ): Abfrage erstellen, Anzahl der gefundenen Ergebnisdatensätze überprüfen - wenn 0: Objekt noch nicht vorhanden ...

Grüße
bastla

[Edit] Link jetzt klickbar [/Edit]
landuin
landuin 28.07.2008 um 09:40:40 Uhr
Goto Top
Der Link funktioniert leider nicht.

Da steht "Page Not Found"......
Nailara
Nailara 28.07.2008 um 09:41:20 Uhr
Goto Top
Nimm mal die Klammer am Ende der Adresse weg ...

Grüße
landuin
landuin 28.07.2008 um 10:38:01 Uhr
Goto Top
Nimm mal die Klammer am Ende der Adresse weg ...

War ja noch früh am morgen *hust*


dim fso, f, xx

Set fso = CreateObject("Scripting.FileSystemObject")  
Set xx = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  

dim Anmeldename


Do while not xx.AtEndOfLine
Zeile = xx.readLine
Feld = split(Zeile,";")  
Anmeldename = Feld(9)
Loop
xx.Close



dtStart = TimeValue(Now())
Set objConnection = CreateObject("ADODB.Connection")  
objConnection.Open "Provider=ADsDSOObject;"  
 
Set objCommand = CreateObject("ADODB.Command")  
objCommand.ActiveConnection = objConnection
 
objCommand.CommandText = _
    "<LDAP://ou=MOD085,ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local>;(&(objectCategory=User)" & _  
         "(samAccountName=" & Anmeldename & "));samAccountName;subtree"  
  
Set objRecordSet = objCommand.Execute
 
If objRecordset.RecordCount = 0 Then
    WScript.Echo "sAMAccountName: " & Anmeldename & " does not exist."  
Else
    WScript.Echo Anmeldename & " exists."  
End If
 
objConnection.Close

Bisher gibt er immer nur eine Meldung an wenn ich aber die Schleife oben weglasse gibt er zwar auch eine Meldung an aber dafür eine andere.
Also der Scriptteil funktioniert soweit nur würde ich gerne die Fehlermelungen in eine Text Datei geschrieben haben antatt als popup und das er alle User durchgeht und zu jedem sagt ob er bereits existiert oder nicht. Kann man sowas machen?
bastla
bastla 28.07.2008 um 12:28:22 Uhr
Goto Top
Hallo landuin!

das er alle User durchgeht und zu jedem sagt ob er bereits existiert oder nicht
Du musst die Abfrage innherhalb der Schleife platzieren, etwa indem Du die Zeilen 15 und 16 an das Ende verschiebst.

würde ich gerne die Fehlermelungen in eine Text Datei geschrieben haben
Dazu vor der Schleife eine Textdatei erzeugen, innerhalb der Schleife in diese schreiben und nach der Schleife die Datei wieder schließen:
Set LogFile = fso.CreateTextFile("D:\BereitsExistierendeUser.txt", True)  
...
LogFile.WriteLine "Bereits angelegt: " & Anmeldename  
...
LogFile.Close
Die entsprechende(n) "WScript.Echo"-Zeile(n) kannst Du dafür entfallen lassen.
Noch ein Hinweis: Z.B. auf dieser Seite von "dieseyer.de" findest Du den Download der Script-Doku "script56.chm" in Deutsch ...

Grüße
bastla
landuin
landuin 28.07.2008 um 13:27:16 Uhr
Goto Top
Hat wieder funktioniert. face-smile

dim fso, f, xx, LogFile

Set fso = CreateObject("Scripting.FileSystemObject")  
'Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  
Set xx = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  

dim Anmeldename

Set LogFile = fso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\FehlerLog.txt", True)  

Do while not xx.AtEndOfLine
Zeile = xx.readLine
Feld = split(Zeile,";")  
Klasse = Feld(1)
Anmeldename = Feld(9)

dim Klasse


dim Organisationseinheit
Organisationseinheit =  Klasse

dim Gruppe
Gruppe = Organisationseinheit



dtStart = TimeValue(Now())
Set objConnection = CreateObject("ADODB.Connection")  
objConnection.Open "Provider=ADsDSOObject;"  
 
Set objCommand = CreateObject("ADODB.Command")  
objCommand.ActiveConnection = objConnection
 
objCommand.CommandText = _
    "<LDAP://ou=Organisationseinheit  
,ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local>;(&(objectCategory=User)" & _  
         "(samAccountName=" & Anmeldename & "));samAccountName;subtree"  
  
Set objRecordSet = objCommand.Execute
 
'If objRecordset.RecordCount = 0 Then  
'     "sAMAccountName: " & Anmeldename & " does not exist."  
'Else  
'    WScript.Echo  Anmeldename & " exists."  
'End If  
'   
' WScript.Echo objConnection.Close  

	If objRecordset.RecordCount = 0 Then

		LogFile.WriteLine "Nicht Existent: " & Anmeldename  

	Else

		LogFile.WriteLine "Existent: " & Anmeldename  

	end If
Loop
xx.Close

LogFile.Close

Aber wie bekomme ich die Variable ins Fehlermelde Script? Beim Script zum erstellen der Gruppe wird die automatisch erkannt weil die gleich mit erstellt wird. Aber hier weiss ich nicht wie ich das schreiben soll was fehlt denn noch?
bastla
bastla 28.07.2008 um 13:53:05 Uhr
Goto Top
Hallo landuin!

Ich dachte die OU (oder Gruppe) steht als Feld(5) in der csv-Datei - da Du ohnehin den Anmeldenamen (Feld(9)) ausliest, kannst Du ja auch gleich die OU/Gruppe "mitnehmen".

Dass OU und Gruppe natürlich davor schon existieren müssen, hatten wir ja oben schon ...

Grüße
bastla
landuin
landuin 28.07.2008 um 14:05:40 Uhr
Goto Top
Das stimm aber mein Fehler war auch noch ganz woanders.

dim gso, OO, LogF

Set gso = CreateObject("Scripting.FileSystemObject")  
Set OO = gso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  

dim Klassenraum

Set LogF = gso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\FehlerLog_Gruppe_Klasse.txt", True)  

Do while not OO.AtEndOfLine
Zeile = OO.readLine
Feld = split(Zeile,";")  
Klassenraum = Feld(1)

dtStart = TimeValue(Now())
Set objConnection = CreateObject("ADODB.Connection")  
objConnection.Open "Provider=ADsDSOObject;"  
 
Set objCommand = CreateObject("ADODB.Command")  
objCommand.ActiveConnection = objConnection
 
objCommand.CommandText = _
    "<LDAP://ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local>;(&(objectCategory=user)" & _  
         "(samAccountName=" & Klassenraum & "));samAccountName;subtree"  
  
Set objRecordSet = objCommand.Execute


	If objRecordset.RecordCount = 0 Then

		LogF.WriteLine "Nicht Existent: " & Klassenraum  

	Else

		LogF.WriteLine "Existent: " & Klassenraum  

	end If
Loop

oo.close

Nachdem ich "Organisationseinheit" rausgenommen hatte lief das Programm auch.


Wie muss man das Programm umschreiben das das auch für die Klassen funktioniert? Braucht man dafür nen anderen Code?

Weil ich habe jetzt den selben Code genommen wie vorhin und die User werden, wenn sie existieren oder wenn sie es nicht tun dementsprechend in die txt Datei geschrieben. Bei der Gruppe sieht es so aus das immer in die txt hinein geschrieben wird das der Klassenraum nicht existiert, egal ob er angelegt wurde oder nicht.
bastla
bastla 28.07.2008 um 18:02:01 Uhr
Goto Top
Hallo landuin!

Wie muss man das Programm umschreiben das das auch für die Klassen funktioniert? Braucht man dafür nen anderen Code?
Etwas anders, da sich hier als Kriterium "distinguishedName" anbietet - Du kennst ja den vollständigen LDAP-Pfad. Der relevante Teil sähe dann etwa so aus:
Set objConnection = CreateObject("ADODB.Connection")  
objConnection.Open "Provider=ADsDSOObject;"  
 
Set objCommand = CreateObject("ADODB.Command")  
objCommand.ActiveConnection = objConnection
 
objCommand.CommandText = _
"<LDAP://dc=firma1,dc=local>;" & _  
"(distinguishedName=ou=" & Klassenraum & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local);distinguishedName"  
  
Set objRecordSet = objCommand.Execute

If objRecordset.RecordCount = 0 Then
	LogF.WriteLine "Nicht Existent: " & Klassenraum  
Else
	LogF.WriteLine "Existent: " & Klassenraum  
End If
Für eine Gruppe (welche in einer OU gleichen Namens liegt):
objCommand.CommandText = _
"<LDAP://dc=firma1,dc=local>;" & _  
"(distinguishedName=cn=" & Gruppe & ",ou=" & Gruppe & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local);distinguishedName"  
Grüße
bastla
ADGuru
ADGuru 28.07.2008 um 20:58:05 Uhr
Goto Top
Hi

für diese zwecke kann ich dir das tool adprofiler von bluetools empfehlen.

Die Software ADprofiler synchronisiert die Daten der Anwender direkt aus bestehenden Quellen wie etwa Adressverwaltung oder Personaldatenbank in das Active Directory, den Exchange Server sowie das Datei-/ Berechtigungssystem von Microsoft Windows.

Das ding ist script fähig. doch die meisten funktionen (wie anlegen von benutzerordnern etc.) kann das tool von hause aus.

es gibt bereits einen artikel über adprofiler (oder benutze den google)

ich hoffe ich konnte dir etwas helfen....

gruss

link adprofiler:
landuin
landuin 29.07.2008 um 09:14:25 Uhr
Goto Top
@ADGuru

Vielen Dank fürs Tool aber mein Script steht schon. Gibt allerdings nur noch ein paar kleine Schönheitsfehler zu korrigieren.

@bastla

Gut das du Gedanken lesen kannst danach hätte ich als nächstes gefragt. face-smile


dim fso, f, yy, LogFile

Set fso = CreateObject("Scripting.FileSystemObject")  
Set yy = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  

dim Anmeld

dim Kla


Set LogFile = fso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\FehlerLog.txt", True)  

Do while not yy.AtEndOfLine
Zeile = yy.readLine
Feld = split(Zeile,";")  
Kla = Feld(1)
Anmeld = Feld(9)

dtStart = TimeValue(Now())
Set objConnection = CreateObject("ADODB.Connection")  
objConnection.Open "Provider=ADsDSOObject;"  
 
Set objCommand = CreateObject("ADODB.Command")  
objCommand.ActiveConnection = objConnection
 
objCommand.CommandText = _
    "<LDAP://ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local>;(&(objectCategory=User)" & _  
         "(samAccountName=" & Anmeld & "));samAccountName;subtree"  
  
Set objRecordSet = objCommand.Execute
 


	If objRecordset.RecordCount = 0 Then

		LogFile.WriteLine "Nicht Existent: " & Anmeld  

	Else

		LogFile.WriteLine "Existent: " & Anmeld  

	end If



dim  BBB, LogF, gso


Set gso = CreateObject("Scripting.FileSystemObject")  

Set BBB = gso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Fe\User.txt",1,0)  


dim Klassenraum


Set LogF = gso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Fe\FehlerLog_Gruppe_Klasse.txt", True)  

Do while not BBB.AtEndOfLine
Zeile = BBB.readLine
Feld = split(Zeile,";")  
Klassenraum = Feld(1)

Set objConnection = CreateObject("ADODB.Connection")  
objConnection.Open "Provider=ADsDSOObject;"  
 
Set objCommand = CreateObject("ADODB.Command")  
objCommand.ActiveConnection = objConnection
 
objCommand.CommandText = _
"<LDAP://dc=firma1,dc=local>;" & _  
"(distinguishedName=ou=" & Klassenraum & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local);distinguishedName"  
  
Set objRecordSet = objCommand.Execute

If objRecordset.RecordCount = 0 Then
	LogF.WriteLine "Nicht Existent: " & Klassenraum  
Else
	LogF.WriteLine "Existent: " & Klassenraum  
End If

dim  AAA, LogA, aso


Set aso = CreateObject("Scripting.FileSystemObject")  

Set AAA = aso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  

dim Gruppen

Set LogA = aso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\FehlerLog_Gruppen_Klasse.txt", True)  

Do while not AAA.AtEndOfLine
Zeile = AAA.readLine
Feld = split(Zeile,";")  
Gruppen = Feld(1)



Set objConnection = CreateObject("ADODB.Connection")  
objConnection.Open "Provider=ADsDSOObject;"  
 
Set objCommand = CreateObject("ADODB.Command")  
objCommand.ActiveConnection = objConnection
 




objCommand.CommandText = _
"<LDAP://dc=firma1,dc=local>;" & _  
"(distinguishedName=cn=" & Gruppen & ",ou=" & Gruppen & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local);distinguishedName"  


Set objRecordSet = objCommand.Execute

If objRecordset.RecordCount = 0 Then
	LogA.WriteLine "Nicht Existent: " & Gruppen  
Else
	LogA.WriteLine "Existent: " & Gruppen  
End If


Loop

AAA.Close

LogA.Close

Loop

BBB.Close

LogF.Close

Loop
yy.Close

LogFile.Close

End Sub



EDIT: Aber da wäre noch eine Kleinigkeit. Das Script sollte erkennen ob es einen Benutzer, Klasse oder Raum schon gibt und diese Information in eine txt Datei als Fehlermeldung ausgeben das er oder es schon existiert aber dennoch weitermachen bis das Programm durchgelaufen ist. Geht das bereits schon mit dem Script das da ist ? Oder ist das ein völlig anderer Code den man dafür braucht?


md \\server\daten\home\%1
echo J | cacls \\server\daten\home\%1 /C /E /G Administratoren:F
echo J | cacls \\server\daten\home\%1 /C /E /G domaene\%1:F    '<--------------- Die Gruppe soll nicht auf die einzelnen user ordner zugreifen  
echo J | cacls \\server\daten\home\%1 /C /E /R Jeder      '<-----------die user sollen nur auf ihren eigenen Ordner und auf den Gruppenordner zugreifen  

Also gut bei den Rechten muss auch noch was gemacht werden.

Die Gruppe soll einen einzigen Ordner besitzen der dann von jedem user benutzt werden kann. Die user sollen allerdings nur auf ihren eigenen persönlichen Order zugreifen können bzw die Ordner der andern user erst gar nicht sehen können. Brauch man dafür andere Befehle?

Aber wenn die Dinge erledigt sind ist wirklich alles geschafft und das Script fertig. Wie gesagt es sind nur noch Kleinigkeiten die fehlen. face-smile
bastla
bastla 29.07.2008 um 11:36:18 Uhr
Goto Top
Hallo landuin!

Aber da wäre noch eine Kleinigkeit. Das Script sollte erkennen ob es einen Benutzer, Klasse oder Raum schon gibt und diese Information in eine txt Datei als Fehlermeldung ausgeben das er oder es schon existiert aber dennoch weitermachen bis das Programm durchgelaufen ist. Geht das bereits schon mit dem Script das da ist ? Oder ist das ein völlig anderer Code den man dafür braucht?
... womit wir wieder bei der Frage nach der Gesamtstruktur wären ...

Der Ablauf muss etwa so aussehen:

  • Einlesen der benötigten OU aus einer csv-Datei
  • Für jede OU
    • überprüfen, ob bereits vorhanden
      • Wenn bereits vorhanden, Meldung in Log schreiben
      • Wenn nicht vorhanden, erstellen

  • Einlesen der benötigten Gruppen aus einer csv-Datei (bzw, wenn immer eine Gruppe je OU, mit obigen Schritten kombinieren)
  • Für jede Gruppe
    • überprüfen, ob bereits vorhanden
      • Wenn bereits vorhanden, Meldung in Log schreiben
      • Wenn nicht vorhanden, erstellen
    • Überprüfen, ob Gruppenordner bereits vorhanden
      • Wenn bereits vorhanden, Meldung in Log schreiben
      • Wenn nicht vorhanden, erstellen
    • Rechte für Gruppenordner (neu) setzen

    • Einlesen der benötigten User (mit Detaildaten) aus einer csv-Datei
    • Für jeden User
      • Prüfen, ob bereits vorhanden
        • Wenn bereits vorhanden, Meldung in Log schreiben
        • Wenn nicht vorhanden, erstellen
      • Prüfen, ob User bereits Mitglied der entsprechenden Gruppe (siehe http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr= ... )
        • Wenn bereits Mitglied, Meldung in Log schreiben
        • User der Gruppe hinzufügen
      • Prüfen, ob Ordner des Users bereits vorhanden
        • Wenn bereits vorhanden, Meldung in Log schreiben
        • Wenn nicht vorhanden, erstellen
      • Rechte für Userordner (neu) setzen
      ----
      Die Gruppe soll einen einzigen Ordner haben wo alle user drauf zugreifen können und nich das die Gruppe auf die gesamten Userordner zugreifen soll.
      Geht analog zum Userordner - ein Unterschied wäre eigentlich nur durch den Speicherort gegeben, ansonsten könntest Du den Batch 1:1 übernehmen und müsstest beim Aufruf eben nicht den Usernamen, sondern den Gruppennamen übergeben.
      Hinsichtlich Optimierungen: Erst ein Thema, wenn das Script alles tut, was es soll ...
      (... obwohl Du zwischendurch auch schon zumindest darauf achten solltest, Objekte nicht mehrfach zu erstellen - es genügt etwa ein "fso", um mehrere Dateien lesen/schreiben zu können, ein "gso" ist nicht erforderlich).

      Grüße
      bastla
landuin
landuin 29.07.2008 um 12:06:19 Uhr
Goto Top
@bastla

So sollte es im Idealfall aussehen. Aber mein Script bricht immer ab wenn die Klasse, Gruppe oder ein User bereits existiert. Wäre es nicht ein völlig anderes Script wenn ich es so aufbauen würde wie du es vorschlägst? Welche von diesen Funktionen hat mein jetziges Script denn schon?


Du den Batch 1:1 übernehmen und müsstest beim Aufruf eben nicht den Usernamen, sondern den Gruppennamen übergeben.

Also wenn die Rechte doch so stimmen dann lass ich die so.

es genügt etwa ein "fso", um mehrere Dateien lesen/schreiben zu können, ein "gso" ist nicht erforderlich

Das war wieder etwas was ich nicht wusste ich dachte ich müsste dann immer eine neue Variable für einlesen.
bastla
bastla 29.07.2008 um 12:25:05 Uhr
Goto Top
Hallo landuin!

Wäre es nicht ein völlig anderes Script wenn ich es so aufbauen würde wie du es vorschlägst?
Es wäre eigentlich das gleiche Script, nur eben um die gewünschte Funktionalität "Fehlerprüfung" ergänzt.

Ich bin zwar über den geplanten Ablauf noch immer nicht wirklich im Bilde, aber selbst, wenn in einer User-csv-Datei immer nur User einer bestimmten OU/Gruppe enthalten sein sollten, wären diese OU und Gruppe vorweg anzulegen und hätten nur eben keine eigenen csv-Dateien, sondern die Info könnte der User-Datei entnommen werden.

Welche von diesen Funktionen hat mein jetziges Script denn schon?
Deine beiden Scripts haben die allermeisten Funktionen bereits - neu wären das Überprüfen der Gruppenmitgliedschaft des Benutzers und die Kontrollen auf Vorhandensein von Gruppen- bzw Userordner (ein einfaches "if fso.FolderExists(...)").

Aber mein Script bricht immer ab wenn die Klasse, Gruppe oder ein User bereits existiert.
Ich dachte, dass Du auch deshalb seit gestern daran gearbeitet hättest, das Vorhandensein von Usern etc überprüfen zu können ...

Wenn Du Dich nicht darauf beschränkst, nur eine Meldung "Nicht Existent: " in eine Log-Datei zu schreiben, sondern im selben Programmzweig dann auch das Erstellen des noch nicht existenten Objektes vornimmst, hast Du Dein Ziel im Prinzip schon erreicht.

Grüße
bastla
landuin
landuin 29.07.2008 um 12:55:39 Uhr
Goto Top
Ich bin zwar über den geplanten Ablauf noch immer nicht wirklich im Bilde, aber selbst, wenn in einer User-csv-Datei immer nur User einer bestimmten OU/Gruppe enthalten sein sollten,

Es ist so das alles in einer User-Datei ist incl Gruppenname und je nachdem wenn neue Klassen dazu kommen, wird eine neue User Datei angelegt und mit dem Script erneut ausgeführt.

wären diese OU und Gruppe vorweg anzulegen und hätten nur eben keine eigenen csv-Dateien, sondern die Info könnte der User-Datei entnommen werden.

Die Gruppe und die OU wird gleich als erstes angelegt soweit ich das sehe. Aber da ich nicht so wirklich weiss was der jeweilige Code macht kann ich das auch nicht 100% sagen.

neu wären das Überprüfen der Gruppenmitgliedschaft des Benutzers und die Kontrollen auf Vorhandensein von Gruppen- bzw Userordner (ein einfaches "if fso.FolderExists(...)").

Genau die brauche ich noch! Aber wohin mit dem "if fso.FolderExists(...)"? Ach dann könnte ich das als reine Textausgabe machen bräuchte doch dann aber wieder Variable oder? Wenn ja könnte ich dann die nehmen die ich bereits benutze?

Ich dachte, dass Du auch deshalb seit gestern daran gearbeitet hättest, das Vorhandensein von Usern etc überprüfen zu können ...

Das sollte, laut Admin, ins selbe Script wie die User anlegen und bricht daher eben ab wenn schon was existiert. Wenn es alleine läuft passiert das nicht und gibt dann auch aus ob der jeweilige user existiert oder nicht.

Wie verhindere ich denn das er abbricht wenn zb schon ein user oder eine Klasse existiert?

Wenn Du Dich nicht darauf beschränkst, nur eine Meldung "Nicht Existent: " in eine Log-Datei zu schreiben, sondern im selben Programmzweig dann auch das Erstellen des noch nicht existenten Objektes vornimmst, hast Du Dein Ziel im Prinzip schon erreicht.

Ja das sollte das Script auch können incl Ausgabe in eine txt Datei das ein vorher nicht existierender user erstellt worden ist.

Dann kann ich das ja vielleicht so machen?

 If UserExists(sUserName) Then
    CreateUser = False
    Exit Function
  End If

http://www.naterice.com/blog/template_permalink.asp?id=62

Könnte man das dann auch genau so mit der Gruppe und der Klasse machen? Wohin setze ich das dann am besten?


Dim fso, f, Zeile, Feld, xx
Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  
Set xx = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  



Zeile = xx.readLine
Feld = split(Zeile,";")  
Klasse = Feld(1)
xx.Close
'Wscript.Quit(0)  

dim Klasse


dim Organisationseinheit
Organisationseinheit =  Klasse

dim Gruppe
Gruppe = Organisationseinheit

Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000

Set objOU = GetObject("LDAP://ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local")  
Set objOU2 = objOU.Create("OrganizationalUnit", "OU=" & Organisationseinheit )  
objOU2.SetInfo

Set objOU = GetObject("LDAP://ou="&Organisationseinheit&",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local")  
Set objGroup = objOU.Create("Group", "cn=" & Gruppe)   '<-------  

objGroup.Put "sAMAccountName", "& Gruppe"  
objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _  
    ADS_GROUP_TYPE_SECURITY_ENABLED
objGroup.SetInfo



Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  

Do while not f.AtEndOfLine
Zeile = f.readLine
Feld = split(Zeile,";")  
Vpname = Feld(0)
KursNR = Feld(1)
VpVorname = Feld(4)
VertrEnde = Feld(8)
Anmeldename = Feld(9)
Call BenuntzerAnlegen(Vpname,KursNR,VpVorname,VertrEnde,Anmeldename)
Loop
f.Close
Wscript.Quit(0)

Sub BenuntzerAnlegen(Vpname,KursNR,VpVorname,VertrEnde,Anmeldename)
Dim ouo, b
Set ouo = GetObject("LDAP://ou="&Organisationseinheit&",OU=schüler,OU=benutzer,OU=firma,DC=firma1,DC=local")  
Set b = ouo.Create("user", "CN=" & VpVorname & " " & Vpname)  
Dim WshShell, ret
Set WshShell = WScript.CreateObject("WScript.Shell")  
b.Put "sAMAccountName", Anmeldename  
b.Put "displayName", VpVorname & " " & Vpname  
b.Put "givenName", VpVorname  
b.Put "sn", Vpname  
b.Put "userAccountControl", 66082  
b.Put "userPrincipalName", Anmeldename & "@DomainName.TopLevelDomain"  
b.Put "profilePath", "\\vmware\daten\profile\" & Anmeldename  
'b.Put "homeDirectory", "\\vmware\daten\home\" & Benutzer  
b.Put "homeDrive", "q:"  
b.SetInfo

'Password läuft nicht ab'  
b.SetPassword Passwort
b.Put "userAccountControl", 66082  
b.AccountDisabled = False
b.SetInfo


'Logincript'  
Set UserObj = GetObject("WinNT://vmware/" & Anmeldename)  
UserObj.LoginScript = "datev.bat"  
UserObj.SetInfo
Set UserObj = Nothing


Set UserObj = GetObject("WinNT://vmware/" & Anmeldename) 'hattest Du oben schon, daher hier nur der Vollständigkeit wegen  

Set GroupObj = GetObject("WinNT://vmware/" & "& Gruppe")  
GroupObj.Add UserObj.AdsPath
GroupObj.SetInfo


WScript.Sleep(1000)
ret = WshShell.Run ("rechte.cmd " & Anmeldename,0,1)  
bastla
bastla 29.07.2008 um 15:04:35 Uhr
Goto Top
Hallo landuin!

Dann kann ich das ja vielleicht so machen? ...
So und auf 3 andere Arten - ist ja Dein Script ...

... allerdings war mir so, als hättest Du bereits eine funktionierende Möglichkeit, die Existenz von Usern (und Gruppen und OU) zu überprüfen - oder irre ich mich da?
Vielleicht postest Du am besten mal den jeweils letzten Stand Deiner funktionierenden Scripts und eine Beispielszeile aus der csv-Datei.

Grüße
bastla
landuin
landuin 29.07.2008 um 15:20:19 Uhr
Goto Top
allerdings war mir so, als hättest Du bereits eine funktionierende Möglichkeit, die Existenz von Usern (und Gruppen und OU) zu überprüfen - oder irre ich mich da?

Ja schon aber das wollte ich zusätzlich einbauen und dann damit auch gleich verhindern das ein bereits existierender user angelegt wird bzw die daraus resultierende Fehlermeldung und den danach folgenden Abbruch des Scripts.

Vielleicht postest Du am besten mal den jeweils letzten Stand Deiner funktionierenden Scripts

Dim fso, f, Zeile, Feld, xx
Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  
Set xx = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  

Zeile = xx.readLine
Feld = split(Zeile,";")  
Klasse = Feld(1)
xx.Close
Wscript.Quit(0)

dim Klasse


dim Organisationseinheit
Organisationseinheit =  Klasse

dim Gruppe
Gruppe = Organisationseinheit

Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000

Set objOU = GetObject("LDAP://ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local")  
Set objOU2 = objOU.Create("OrganizationalUnit", "OU=" & Organisationseinheit )  
objOU2.SetInfo

Set objOU = GetObject("LDAP://ou="&Organisationseinheit&",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local")  
Set objGroup = objOU.Create("Group", "cn=" & Gruppe)   '<-------  

objGroup.Put "sAMAccountName", "& Gruppe"  
objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _  
    ADS_GROUP_TYPE_SECURITY_ENABLED
objGroup.SetInfo



Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  

Do while not f.AtEndOfLine
Zeile = f.readLine
Feld = split(Zeile,";")  
Vpname = Feld(0)
KursNR = Feld(1)
VpVorname = Feld(4)
VertrEnde = Feld(8)
Anmeldename = Feld(9)
Call BenuntzerAnlegen(Vpname,KursNR,VpVorname,VertrEnde,Anmeldename)
Loop
f.Close
Wscript.Quit(0)

Sub BenuntzerAnlegen(Vpname,KursNR,VpVorname,VertrEnde,Anmeldename)
Dim ouo, b
Set ouo = GetObject("LDAP://ou="&Organisationseinheit&",OU=schüler,OU=benutzer,OU=firma,DC=firma1,DC=local")  
Set b = ouo.Create("user", "CN=" & VpVorname & " " & Vpname)  
Dim WshShell, ret
Set WshShell = WScript.CreateObject("WScript.Shell")  
b.Put "sAMAccountName", Anmeldename  
b.Put "displayName", VpVorname & " " & Vpname  
b.Put "givenName", VpVorname  
b.Put "sn", Vpname  
b.Put "userAccountControl", 66082  
b.Put "userPrincipalName", Anmeldename & "@DomainName.TopLevelDomain"  
b.Put "profilePath", "\\vmware\daten\profile\" & Anmeldename  
'b.Put "homeDirectory", "\\vmware\daten\home\" & Benutzer  
b.Put "homeDrive", "q:"  
b.SetInfo

'Password läuft nicht ab'  
b.SetPassword Passwort
b.Put "userAccountControl", 66082  
b.AccountDisabled = False
b.SetInfo


'Logincript'  
Set UserObj = GetObject("WinNT://vmware/" & Anmeldename)  
UserObj.LoginScript = "datev.bat"  
UserObj.SetInfo
Set UserObj = Nothing


Set UserObj = GetObject("WinNT://vmware/" & Anmeldename) 'hattest Du oben schon, daher hier nur der Vollständigkeit wegen  

Set GroupObj = GetObject("WinNT://vmware/" & "& Gruppe")  
GroupObj.Add UserObj.AdsPath
GroupObj.SetInfo

WScript.Sleep(1000)
ret = WshShell.Run ("rechte.cmd " & Anmeldename,0,1)  

'--------------------------------------------------------------Der untere Teil kontrolliert nur ob zb die user existieren  

dim fso, f, yy, LogFile

Set fso = CreateObject("Scripting.FileSystemObject")  
Set yy = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0)  

dim Anmeld

dim Kla

Set LogFile = fso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\FehlerLog.txt", True)  

Do while not yy.AtEndOfLine
Zeile = yy.readLine
Feld = split(Zeile,";")  
Kla = Feld(1)
Anmeld = Feld(9)

dtStart = TimeValue(Now())
Set objConnection = CreateObject("ADODB.Connection")  
objConnection.Open "Provider=ADsDSOObject;"  
 
Set objCommand = CreateObject("ADODB.Command")  
objCommand.ActiveConnection = objConnection
 
objCommand.CommandText = _
    "<LDAP://ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local>;(&(objectCategory=User)" & _  
         "(samAccountName=" & Anmeld & "));samAccountName;subtree"  
  
Set objRecordSet = objCommand.Execute

	If objRecordset.RecordCount = 0 Then

		LogFile.WriteLine "Nicht Existent: " & Anmeld  

	Else

		LogFile.WriteLine "Existent: " & Anmeld  

	end If

dim  BBB, LogF, gso

Set gso = CreateObject("Scripting.FileSystemObject")  

Set BBB = gso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Fe\User.txt",1,0)  

dim Klassenraum

Set LogF = gso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Fe\FehlerLog_Gruppe_Klasse.txt", True)  

Do while not BBB.AtEndOfLine
Zeile = BBB.readLine
Feld = split(Zeile,";")  
Klassenraum = Feld(1)


Set objConnection = CreateObject("ADODB.Connection")  
objConnection.Open "Provider=ADsDSOObject;"  
 
Set objCommand = CreateObject("ADODB.Command")  
objCommand.ActiveConnection = objConnection
 
objCommand.CommandText = _
"<LDAP://dc=firma1,dc=local>;" & _  
"(distinguishedName=ou=" & Klassenraum & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local);distinguishedName"  
  
Set objRecordSet = objCommand.Execute

If objRecordset.RecordCount = 0 Then
	LogF.WriteLine "Nicht Existent: " & Klassenraum  
Else
	LogF.WriteLine "Existent: " & Klassenraum  
End If

Loop

BBB.Close

LogF.Close

Loop
yy.Close

LogFile.Close

End Sub


und eine Beispielszeile aus der csv-Datei.

Muster;MOD085;0;Herr;Max;10.07.2008;10.07.2008;21.08.2008;21.08.2008;13345

Daran ist das interessanteste die Klasse (MOD085) Vor und Nachnahme und die Anmeldenummer (13345 , steht ganz hinten)
bastla
bastla 29.07.2008 um 18:18:35 Uhr
Goto Top
Hallo landuin!

Etwas begradigt und kommentiert:
Option Explicit
Dim Dom, DomTLD, dc, DCPfad, ADPfad, BasisPfad, UserCSV, LogFile
Dim fso, f, lf, Zeile, Feld
Dim WshShell, ret
Dim objOU, objOU2, objGroup, objConnection, objCommand, objRecordSet
Dim Klasse, Organisationseinheit, Gruppe, ADPfadNeu
Dim Vpname, KursNR,VpVorname, Passwort, VertrEnde, Anmeldename

'ab hier Pfade anpassen  
Dom = "FIRMA1" 'NT-Domäne  
DomTLD = "firma1.local" 'Domäne  
DCPfad = "" 'DC-Pfad erzeugen  
For Each dc In Split(DomTLD, ".")  
	DCPfad = DCPfad & ",dc=" & dc  
Next
DCPfad = Mid(DCPfad, 2)
ADPfad = "ou=schüler,ou=benutzer,ou=firma," & DCPfad 'Alle weiteren Objekte werden in oder unterhalb dieser OU erstellt  
BasisPfad = "\\vmware\daten" 'Alle Ordner für User und Gruppen werden in oder unterhalb dieses Pfades erstellt  
UserCSV = "C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt"  
LogFile = "C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\FehlerLog.txt"  
'bis hier Pfade anpassen  

Set WshShell = WScript.CreateObject("WScript.Shell")  
Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.OpenTextFile (UserCSV,1,0)
Zeile = f.ReadLine
Feld = Split(Zeile,";")  
Klasse = Feld(1)
f.Close

Organisationseinheit = Klasse
Gruppe = Organisationseinheit

Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000

Set objConnection = CreateObject("ADODB.Connection")  
objConnection.Open "Provider=ADsDSOObject;"  
Set objCommand = CreateObject("ADODB.Command")  
objCommand.ActiveConnection = objConnection

'Logfile erstellen und öffnen  
Set lf = fso.CreateTextFile(LogFile, True)

'Ist OU (Klasse) bereits vorhanden?  
ADPfadNeu = "ou=" & Organisationseinheit & "," & ADPfad  
objCommand.CommandText = _
"<LDAP://" & ADPfad & ">;" & _  
"(distinguishedName=" & ADPfadNeu & ");distinguishedName"  
  
Set objRecordSet = objCommand.Execute
If objRecordset.RecordCount = 0 Then
	lf.WriteLine "Nicht Existent: OU: " & Organisationseinheit  
	Set objOU = GetObject("LDAP://" & ADPfad)  
	'OU (Klasse) erstellen  
	Set objOU2 = objOU.Create("OrganizationalUnit", "OU=" & Organisationseinheit )  
	objOU2.SetInfo
Else
	lf.WriteLine "Existent: OU: " & Organisationseinheit  
End If

'Objekt für OU (Klasse) erzeugen  
Set objOU2 = GetObject("LDAP://" & ADPfadNeu)  

'Ist Gruppe bereits vorhanden?  
objCommand.CommandText = _
"<LDAP://" & DCPfad & ">;" & _  
"(distinguishedName=cn=" & Gruppe & "," & ADPfadNeu & ");distinguishedName"  
If objRecordset.RecordCount = 0 Then
	lf.WriteLine "Nicht Existent: Gruppe: " & Gruppe  
	'Gruppe erstellen  
	Set objGroup = objOU2.Create("Group", "cn=" & Gruppe)  
	objGroup.Put "sAMAccountName", Gruppe  
	objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _  
		ADS_GROUP_TYPE_SECURITY_ENABLED
	objGroup.SetInfo
Else
	lf.WriteLine "Existent: Gruppe: " & Gruppe  
End If

'Gruppenordner bei Bedarf erstellen und Rechte setzen  
ret = WshShell.Run ("rechte.cmd " & BasisPfad & "\groups\ " & Dom & " " & Gruppe,0,1)  

'Gruppenobjekt erzeugen (für spätere Zuweisung der User)  
Set objGroup = GetObject("LDAP://" & "cn=" & Gruppe & "," & ADPfadNeu)  

'Userdatei auslesen  
Set f = fso.OpenTextFile (UserCSV,1,0)
Do While Not f.AtEndOfLine
	Zeile = f.ReadLine
	Feld = Split(Zeile,";")  
	Vpname = Feld(0)
	KursNR = Feld(1)
	VpVorname = Feld(4)
	VertrEnde = Feld(8)
	Anmeldename = Feld(9)
	Passwort = "Neues#555"  
	Call BenutzerAnlegen(Vpname,KursNR,VpVorname,Passwort,VertrEnde,Anmeldename,Klasse,objOU,objOU2,objGroup,BasisPfad)
Loop
f.Close
lf.Close
Wscript.Quit(0)
'------- Ende Hauptprogramm --------  

Sub BenutzerAnlegen(Vpname,KursNR,VpVorname,Passwort,VertrEnde,Anmeldename,Klasse,objOU,objOU2,objGroup,BasisPfad)
Dim UserObj

'Wurde ein User mit dem angegebenen Anmeldenamen bereits angelegt?  
objCommand.CommandText = _
    "<LDAP://" & DCPfad & ">;(&(objectCategory=User)" & _  
         "(samAccountName=" & Anmeldename & "));samAccountName;subtree"  
Set objRecordSet = objCommand.Execute
If objRecordset.RecordCount = 0 Then 'neuer User  
	lf.WriteLine "Nicht Existent: User: " & Anmeldename  
		
	'User anlegen  
	Set UserObj = objOU2.Create("user", "CN=" & VpVorname & " " & Vpname) 'User-Objekt erzeugen  
	UserObj.Put "sAMAccountName", Anmeldename  
	UserObj.Put "displayName", VpVorname & " " & Vpname  
	UserObj.Put "givenName", VpVorname  
	UserObj.Put "sn", Vpname  
	UserObj.Put "userAccountControl", 66082  
	UserObj.Put "userPrincipalName", Anmeldename & "@" & DomTLD  
	UserObj.Put "profilePath", BasisPfad & "\profile\" & Anmeldename  
	'UserObj.Put "homeDirectory", BasisPfad & "home\" & Anmeldename  
	UserObj.Put "homeDrive", "q:"  
	UserObj.SetInfo

	'Password läuft nicht ab'  
	UserObj.SetPassword Passwort
	UserObj.Put "userAccountControl", 66082  
	UserObj.AccountDisabled = False
	UserObj.SetInfo

	'Logincript  
	UserObj.LoginScript = "datev.bat"  
	UserObj.SetInfo

	'User bereits Mitglied der Gruppe?  
	
	'User in Gruppe aufnehmen  
	objGroup.Add UserObj.AdsPath
	objGroup.SetInfo

	WScript.Sleep(1000)
	'Userordner erstellen und Rechte setzen  
	ret = WshShell.Run ("rechte.cmd " & BasisPfad & "\profile " & Dom & " " & Anmeldename,0,1)  
	ret = WshShell.Run ("rechte.cmd " & BasisPfad & "\home " & Dom & " " & Anmeldename,0,1)  
		
Else ' User bereits vorhanden  
	lf.WriteLine "Existent: User: " & Anmeldename  

End If
End Sub
Das Überprüfen der Gruppenzugehörigkeit kann unterbleiben, da die Zuordnung zur Gruppe ohnehin nur bei einer Neuanlage des Users erfolgt.

Der Gruppenordner wird, parallel zu "profile" und "home" der User, in einem Ordner "groups" des Basispfades erstellt.

Die Batchdatei "rechte.cmd" sieht (etwas allgemeiner formuliert) nun so aus und ist damit auch für die Erstellung des Gruppenordners verwendbar:
@echo off & setlocal
::Parameter 1: Pfad
::Parameter 2: Domaene
::Parameter 3: Benutzername oder Gruppe

set "Pfad=%~1\%~3"  
if not exist "%Pfad%" md "%Pfad%"  
echo J | cacls "%Pfad%" /C /E /G Administratoren:F  
echo J | cacls "%Pfad%" /C /E /G "%~2\%~3":F  
echo J | cacls "%Pfad%" /C /E /R Jeder  
Grüße
bastla

P.S.: Viel Spaß beim Testen ... face-wink
landuin
landuin 30.07.2008 um 08:49:48 Uhr
Goto Top
Vielen Herzlich Dank für deine Mühe ! Damit hatte ich nur wirklich nicht gerechnet! Nun ist auch das Programm endlich komplett fertig! XD