Gruppen anlegen aus csv datei und user hinzufügen
hey admin freunde
vielleicht kann einer von euch mal dieses script sich mal anschauen und mir sagen wo der fehler liegt
dieses script liest aus einer .csv datei die benutzer und gruppen aus und legt sie im AD an. noch dazu werden benutzerordner erstellt und im netzwerk freigegebene.
das problem was ich habe, sind dieses shit gruppen.
in der csv datei sind natürlich einige gruppen doppelt vorhanden, letzt endlich steht dort nur, das der user xy denn gruppen V und Z zugeordnet sind. problem ist dies, dass er zwar die gruppen anlegt, aber immer nur einen benutzer hinzufügt. dabei sollte zb die gruppe Z 5Mitglieder haben.
ich bin schon am verzweifeln und es kotzt mch langsam an. ich brauche keine nutzlosen tipps, dass ich die lösung in der script-center.chm datei finden also spart euch die mühe, es mir mitzuteilen. ich hab schon alles möglich probiert, vieles verscuht und doch am ende gescheiter.
hab schon hier, dass problem gepostet ob es ne möglichkeit gäbe, irgendwie diese Gruppen erstellen so abzufangen, dass das script es selbst checkt, das die gruppe bereits existiert. aber außer gulasch und dem tollen tipp "im script-center.chm" findest du die lösung, kam nichts brauchbares heraus.
im netz finden man hilfen, wie man user in gruppen addet. starte ich das script kriege ich an immer an der selben stelle nen fehler, dabei kann es nicht falsch sein... denn es steht sogar in dieser script-center drine von der jeder hier so schwärmt
dies ist der code
der fehler steckt irgendwo zwischen zeile 35 und 47.
nehme ich das "ON ERROR RESUME NEXT"
werden als erstes die objGroup = objOU.Create befehle bemängelt, lasse ich die weg, krieg ich ne meldung dass objGroup.ADD ein unbekannter befehl ist.
usw usw... ein teufelskreis
mfg
koluschkiB
vielleicht kann einer von euch mal dieses script sich mal anschauen und mir sagen wo der fehler liegt
dieses script liest aus einer .csv datei die benutzer und gruppen aus und legt sie im AD an. noch dazu werden benutzerordner erstellt und im netzwerk freigegebene.
das problem was ich habe, sind dieses shit gruppen.
in der csv datei sind natürlich einige gruppen doppelt vorhanden, letzt endlich steht dort nur, das der user xy denn gruppen V und Z zugeordnet sind. problem ist dies, dass er zwar die gruppen anlegt, aber immer nur einen benutzer hinzufügt. dabei sollte zb die gruppe Z 5Mitglieder haben.
ich bin schon am verzweifeln und es kotzt mch langsam an. ich brauche keine nutzlosen tipps, dass ich die lösung in der script-center.chm datei finden also spart euch die mühe, es mir mitzuteilen. ich hab schon alles möglich probiert, vieles verscuht und doch am ende gescheiter.
hab schon hier, dass problem gepostet ob es ne möglichkeit gäbe, irgendwie diese Gruppen erstellen so abzufangen, dass das script es selbst checkt, das die gruppe bereits existiert. aber außer gulasch und dem tollen tipp "im script-center.chm" findest du die lösung, kam nichts brauchbares heraus.
im netz finden man hilfen, wie man user in gruppen addet. starte ich das script kriege ich an immer an der selben stelle nen fehler, dabei kann es nicht falsch sein... denn es steht sogar in dieser script-center drine von der jeder hier so schwärmt
dies ist der code
Dim objDomain, objOU, objUser, objGroup
Dim fso, f, Zeile, Feld
Dim objFSO, objFolder, strComputer, objWMIService, objNewShare
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile ("c:\user.txt",1,0)
Do while not f.AtEndOfLine
Zeile = f.readLine
Feld = split(Zeile,";")
Vorname = Feld(0)
Nachname = Feld(1)
Abteilung = Feld(2)
Gruppe1 = Feld(3)
Gruppe2 = Feld(4)
Gruppe3 = Feld(5)
Gruppe4 = Feld(6)
Gruppe5 = Feld(7)
Set objOU = GetObject("LDAP://cn=users,dc=testad,dc=int")
Set objUser = objOU.Create("user", "CN=" & Vorname & " " & Nachname)
objUser.Put "sAMAccountName", Nachname
objUser.Put "displayName", Vorname & " " & Nachname
objUser.Put "givenName", Vorname
objUser.Put "sn", Nachname
objUser.Put "description", Abteilung
'objUser.Put "userAccountControl", 66082
objUser.Put "userPrincipalName", left(Vorname,3) & left(nachname,2) & "@testAD.int"
objUser.SetInfo
Set objGroup = objOU.Create("Group", "cn=" & Gruppe1)
Set objGroup = objOU.Create("Group", "cn=" & Gruppe2)
Set objGroup = objOU.Create("Group", "cn=" & Gruppe3)
Set objGroup = objOU.Create("Group", "cn=" & Gruppe4)
Set objGroup = objOU.Create("Group", "cn=" & Gruppe5)
On Error Resume Next
objGroup.SetInfo
objGroup.Add objUser.ADsPath
'Ordner werden für denn Benutzer angelegt, dabei wird der Nachname als Ordnernameverwendet
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.CreateFolder("C:\Freigaben\" &Nachname)
Dim File_Share
File_Share = 0
Dim MAXIMUM_CONNECTIONS
MAXIMUM_CONNECTIONS = 25
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objNewShare = objWMIService.Get("Win32_Share")
errReturn = objNewShare.Create _
("C:\Freigaben\" &Nachname, ""&Nachname, File_Share, _
MAXIMUM_CONNECTIONS, "Benutzerordner")
Loop
der fehler steckt irgendwo zwischen zeile 35 und 47.
nehme ich das "ON ERROR RESUME NEXT"
werden als erstes die objGroup = objOU.Create befehle bemängelt, lasse ich die weg, krieg ich ne meldung dass objGroup.ADD ein unbekannter befehl ist.
usw usw... ein teufelskreis
mfg
koluschkiB
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 143493
Url: https://administrator.de/forum/gruppen-anlegen-aus-csv-datei-und-user-hinzufuegen-143493.html
Ausgedruckt am: 20.12.2024 um 07:12 Uhr
15 Kommentare
Neuester Kommentar
Hallo koluschkiB!
Weil Du dermaßen freundlich fragst, werde ich versuchen, Dir Hilfestellung in Form von Hinweisen auf Beispiele anzubieten (ohne eine ".chm" - obwohl es hier auch eine solche gäbe ):
http://blogs.technet.com/b/heyscriptingguy/archive/2005/09/21/how-can-i ...
http://blogs.technet.com/b/heyscriptingguy/archive/2005/11/23/how-can-i ...
Auf Basis dessen, was dort gezeigt wird, könntest Du dann zB eine Funktion, die prüft, ob es eine bestimmte Gruppe schon gibt, verwenden und, abhängig vom Ergebnis, die Gruppe neu erstellen oder nur per "
Verwenden lässt sich diese Funktion etwa so:
Grüße
bastla
P.S.:
Weil Du dermaßen freundlich fragst, werde ich versuchen, Dir Hilfestellung in Form von Hinweisen auf Beispiele anzubieten (ohne eine ".chm" - obwohl es hier auch eine solche gäbe ):
http://blogs.technet.com/b/heyscriptingguy/archive/2005/09/21/how-can-i ...
http://blogs.technet.com/b/heyscriptingguy/archive/2005/11/23/how-can-i ...
Auf Basis dessen, was dort gezeigt wird, könntest Du dann zB eine Funktion, die prüft, ob es eine bestimmte Gruppe schon gibt, verwenden und, abhängig vom Ergebnis, die Gruppe neu erstellen oder nur per "
GetObject
" auf die schon bestehende Gruppe zugreifen - im einfacheren Fall (Ziel-OU bekannt, keine Notwendigkeit, im gesamten AD auf Vorhandensein einer gleichnamigen Gruppe zu prüfen):Function GroupExists(Group, OU)
'OU wird als Obejkt übergeben; es interessieren nur die enthaltenen Gruppen
OU.Filter = Array("group")
'Default: Gruppe noch nicht vorhanden
GroupExists = False
'Alle in der OU enthaltenen Gruppen durchgehen
For Each objGroup in OU
'klein geschriebenen Gruppennamen der betrachteten Gruppe
'mit klein geschriebenem übergebenen Gruppennamen vergleichen
If LCase(objGroup.sAMAccountName) = LCase(Group) Then
'bei Übereinstimmung gibt es die Gruppe bereits ...
GroupExists = True
'... und es müssen die weiteren Gruppen nicht mehr geprüft werden
Exit For
End If
Next
End Function
If GroupExists("GruppeZ", objOU) Then
'Gruppe nur referenzieren
Else
'Gruppe erzeugen
End If
bastla
P.S.:
das problem was ich habe, sind dieses shit gruppen
Es ist ja wirklich nicht einzusehen, dass Du Dich als Anfänger anstatt mit Sicherheitsgruppen gleich mit "shit"-Gruppen herumschlagen sollst ...
Hallo koluschkiB!
erforderlich.
Das zweite Script macht eigentlich genau das Verkehrte - wenn Du die Gruppe (gerade eben) erstellt hast, brauchst Du nicht mehr zu prüfen, ob es sie schon gibt - die Prüfung soll ja eben verhindern, dass Du die Gruppe anzulegen versuchst, wenn sie bereits vorhanden ist ...
Grüße
bastla
If GroupExist("Gruppe1", objOU) Then
objGroup.Add objUser.ADsPath
Else
Set objGroup = objOU.Create("Group", "cn=" & Gruppe1)
objGroup.Add objUser.ADsPath
End If
an sich ist es logisch, wenn gruppe1 existiert den nötigen user hinzufügen. wenn gruppe1 nicht existiert, anlegen und dann den vogel dazu adden. leider ist theorie nicht mit der praxis zu vergleichen. oder habe ich da grade nen denkfehler?
Der Ablauf wäre soweit ok, allerdings kannst Du den User im ersten Fall nur hinzufügen, wenn Du bereits die Gruppe als Objekt zur Verfügung hast, was aber (noch) nicht der Fall ist - daher wäre noch einSet objGroup = GetObject ...
Das zweite Script macht eigentlich genau das Verkehrte - wenn Du die Gruppe (gerade eben) erstellt hast, brauchst Du nicht mehr zu prüfen, ob es sie schon gibt - die Prüfung soll ja eben verhindern, dass Du die Gruppe anzulegen versuchst, wenn sie bereits vorhanden ist ...
Grüße
bastla
Hallo koluschkiB!
Das sollte (zB ab Zeile 33 Deines ursprünglichen Scripts) etwa so aussehen (wobei sich natürlich für 5 Gruppen eine Schleife anbieten würde):
Grüße
bastla
Das sollte (zB ab Zeile 33 Deines ursprünglichen Scripts) etwa so aussehen (wobei sich natürlich für 5 Gruppen eine Schleife anbieten würde):
If GroupExists(Gruppe1, objOU) Then
Set objGroup = GetObject("LDAP://cn=" & Gruppe1 & ",cn=Users,dc=testad,dc=int")
Else
Set objGroup = objOU.Create("Group", "cn=" & Gruppe1)
objGroup.SetInfo
End If
objGroup.Add objUser.ADSPath
bastla
Hallo koluschkiB!
Ich weiß ja nun nicht, wie und wo Du das eingebaut hast, aber so sollte es auf jeden Fall funktionieren:
Ein paar Anmerkungen:
Grüße
bastla
Ich weiß ja nun nicht, wie und wo Du das eingebaut hast, aber so sollte es auf jeden Fall funktionieren:
Option Explicit
Dim OU, objDomain, objOU, objUser, objGroup
Dim fso, f, Zeile, Feld, Vorname, Nachname, Abteilung, i
Dim objFolder, strComputer, objWMIService, objNewShare, errReturn
OU = "cn=users,dc=testad,dc=int"
Set objOU = GetObject("LDAP://" & OU)
Const File_Share = 0
Const MAXIMUM_CONNECTIONS = 25
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objNewShare = objWMIService.Get("Win32_Share")
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("c:\user.txt",1,0)
Do While Not f.AtEndOfLine
Zeile = f.readLine
Feld = split(Zeile,";")
Vorname = Feld(0)
Nachname = Feld(1)
Abteilung = Feld(2)
' Gruppen werden in Schleife direkt angesprochen
' Gruppe1 = Feld(3)
' Gruppe2 = Feld(4)
' Gruppe3 = Feld(5)
' Gruppe4 = Feld(6)
' Gruppe5 = Feld(7)
Set objUser = objOU.Create("user", "CN=" & Vorname & " " & Nachname)
objUser.Put "sAMAccountName", Nachname
objUser.Put "displayName", Vorname & " " & Nachname
objUser.Put "givenName", Vorname
objUser.Put "sn", Nachname
objUser.Put "description", Abteilung
'objUser.Put "userAccountControl", 66082
objUser.Put "userPrincipalName", left(Vorname,3) & left(nachname,2) & "@testAD.int"
objUser.SetInfo
For i = 3 To 7 'alle Gruppen bearbeiten
If Feld(i) <> "" Then
If GroupExists(Feld(i), objOU) Then
Set objGroup = GetObject("LDAP://cn=" & Feld(i) & "," & OU)
Else
Set objGroup = objOU.Create("Group", "cn=" & Feld(i))
objGroup.Put "sAMAccountName", Feld(i)
objGroup.SetInfo
End If
objGroup.Add objUser.ADSPath
End If
Next
'Ordner werden für denn Benutzer angelegt, dabei wird der Nachname als Ordnername verwendet
Set objFolder = fso.CreateFolder("C:\Freigaben\" & Nachname)
errReturn = objNewShare.Create _
("C:\Freigaben\" & Nachname, Nachname, File_Share, _
MAXIMUM_CONNECTIONS, "Benutzerordner")
Loop
Function GroupExists(Group, OU)
'OU wird als Objekt übergeben; es interessieren nur die enthaltenen Gruppen
OU.Filter = Array("group")
'Default: Gruppe noch nicht vorhanden
GroupExists = False
'Alle in der OU enthaltenen Gruppen durchgehen
For Each objGroup in OU
'klein geschriebenen Gruppennamen der betrachteten Gruppe
'mit klein geschriebenem übergebenen Gruppennamen vergleichen
If LCase(objGroup.sAMAccountName) = LCase(Group) Then
'bei Übereinstimmung gibt es die Gruppe bereits ...
GroupExists = True
'... und es müssen die weiteren Gruppen nicht mehr geprüft werden
Exit For
End If
Next
End Function
- Wenn Du in VBS Variablen deklarierst, dann nur nach einem "
Option Explicit
" (und natürlich alle). - Mehrfach verwendete Objekte immer wieder in einer Schleife zu erstellen ist wenig sinnvoll.
- Es genügt ein "FileSystemObject" ("fso" vs "objFSO").
- Öfter verwendete Strings (zB den Pfad der OU) vorweg in eine Variable oder sogar Konstante schreiben - macht das Script leichter anpassbar.
- Gleiches gilt für konstante Werte wie etwa "File_Share".
- Auch für das Erstellen der Benutzerordner wäre vorweg eine Prüfung, ob der Ordner bereits existiert, sinnvoll.
- Wer hatte eigentlich die Idee, für jeden Ordner eine eigene Freigabe zu verwenden?
- Einrückungen machen einen Code übersichtlicher.
Grüße
bastla
Hallo koluschkiB!
Zum Testen kannst Du zwischen Zeile 52 und 53 zB
einfügen und das Script aus einer CMD-Shell mit
testen - so kannst Du nachvollziehen, bei welchem User und welcher Gruppe der Fehler entsteht.
Grüße
bastla
"das objekt ist bereits vorhanden"
... klingt nach Resten eines vorigen Tests - sollte aber gerade bei Gruppen (also in Zeile 58) nicht passieren, da ja deren Existenz vorweg geprüft wird.Zum Testen kannst Du zwischen Zeile 52 und 53 zB
WScript.Echo Nachname, Feld(i)
cscript //nologo C:\Useranlage.vbs
in der aufgabenstellung heisst es, jedem benutzer soll eine verzeichnis eingerichtet werden, welches für denn netzwerkzugriff eingerichtet wird
Dazu würde es aber reichen, wenn Du "C:\Freigaben" frei gibst und mit passenden NTFS-Rechten dafür sorgst, dass auf den darunter liegenden User-Ordner nur noch der User selbst und zB die Gruppe "Administratoren" zugreifen können.Grüße
bastla
Hallo koluschkiB!
Na schön ...
Da ich das ja offensichtlich übersehen haben muss:
[Edit]
Falls Du
gemeint haben solltest: Es ist ziemlich sinnfrei, einen Leerstring mit einer Variablen zusammenzufügen - das Ergebnis ist wieder nur der Inhalt der Variablen ...
[/Edit]
Grüße
bastla
P.S.: Wie sieht denn nun Dein funktionierendes Script aus?
Na schön ...
Da ich das ja offensichtlich übersehen haben muss:
dass in deinem code meine lieblingsfehler waren "" und & hat an einer stelle gefehlt.
Wo (in welcher Zeile meines Entwurfs) haben denn die Teile gefehlt?[Edit]
Falls Du
""&Nachname
[/Edit]
Grüße
bastla
P.S.: Wie sieht denn nun Dein funktionierendes Script aus?
Hallo koluschkiB!
Grüße
bastla
bei der ordner erstellung die variable bzw in deinem script die const File_SHare und Maximum_Connection. hab aus const dim gemacht und zack, lief es problemlos durch. frag mich nicht, wieso das so war.
Der Unterschied zwischen "Const
" (kannst Du im gesamten Script nur einmal machen - daher auch gleich am Anfang) und "Dim
" (ist mehrmals möglich) kommt eigentlich nur zum Tragen, wenn Du den jeweiligen Befehl innerhalb einer Schleife platzierst - den Wert von "File_Share" und "MAXIMUM_CONNECTIONS" willst Du ja ohnehin zwischendurch nicht mehr ändern (dazu müssten es Variable und daher per "Dim
" deklariert sein) ...Grüße
bastla