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!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 92684
Url: https://administrator.de/contentid/92684
Ausgedruckt am: 18.11.2024 um 19:11 Uhr
40 Kommentare
Neuester Kommentar
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
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
Moin Moin
Gruppen zugeörigkeit setzen:
Ordner Erstellen läuft so:
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.
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.
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.
Hallo landuin!
Zum Thema "User in Gruppe aufnehmen": Mit
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:
Grüße
bastla
Zum Thema "User in Gruppe aufnehmen": Mit
Set GroupObj = GetObject("WinNT://vmware/" & Benutzer)
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
bastla
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.
Das soltes du mal tun.
Gruß L
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
Hallo landuin!
Die Gruppe muss natürlich beim Hinzufügen des Users bereits existieren.
Grüße
bastla
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 ).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
Hallo landuin!
Gruppen zu erstellen. Info zum Erstellen: http://www.microsoft.com/technet/scriptcenter/scripts/ad/groups/adgpvb0 ...
wobei es dann ein eigenes "Sub GruppeAnlegen" geben müsste.
Grüße
bastla
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ötigtenGruppen 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:> jn,nein,ja,12345Abc,TestGruppe,TestGruppe100
For i = 4 To UBound(Feld)
Gruppe = Feld(i)
GruppeAnlegen(Benutzer, Gruppe)
Next
Grüße
bastla
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:
Grüße
bastla
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")
bastla
Hallo landuin!
Damit erstellst Du keine OU, sondern greifst auf eine bereits vorhandene OU zu. Variabel geht es dann so:
Zu
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
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 ).
Grüße
bastla
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")
Set ouo = GetObject("LDAP://OU=" & Organisationseinheit & ",OU=schüler,OU=benutzer,OU=firma,DC=firma1,DC=local")
Organisationseinheit = Feld(5)
For i = 5 To UBound(Feld)
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 ).
Grüße
bastla
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
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.
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
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")
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
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
Hallo landuin!
Dann könnte auch die Zeile 21 lauten:
Grüße
bastla
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
objGroup.Put "sAMAccountName", Gruppe
bastla
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]
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]
Hallo landuin!
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
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
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
Hallo landuin!
Für eine Gruppe (welche in einer OU gleichen Namens liegt):
Grüße
bastla
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
objCommand.CommandText = _
"<LDAP://dc=firma1,dc=local>;" & _
"(distinguishedName=cn=" & Gruppe & ",ou=" & Gruppe & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local);distinguishedName"
bastla
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:
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:
Hallo landuin!
Der Ablauf muss etwa so aussehen:
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
Hallo landuin!
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.
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
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
Hallo landuin!
... 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
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
Hallo landuin!
Etwas begradigt und kommentiert:
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:
Grüße
bastla
P.S.: Viel Spaß beim Testen ...
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
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
bastla
P.S.: Viel Spaß beim Testen ...