Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

VB Script zum User anlegen zusammenschustern

Frage Entwicklung

Mitglied: landuin

landuin (Level 1) - Jetzt verbinden

23.07.2008, aktualisiert 30.07.2008, 13593 Aufrufe, 40 Kommentare

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!
40 Antworten
Mitglied: Nailara
23.07.2008 um 10:40 Uhr
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
Bitte warten ..
Mitglied: landuin
23.07.2008 um 12:20 Uhr
Vielen dank schon mal für deine Antwort!

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.
Bitte warten ..
Mitglied: Logan000
23.07.2008 um 14:20 Uhr
Moin Moin

Gruppen zugeörigkeit setzen:
01.
Gruppenname = "MeineGruppe" 
02.
Username = "MeinNeuereUser" 
03.
 
04.
Const ADS_PROPERTY_APPEND = 3  
05.
Set objGroup = GetObject ("LDAP://cn=" & Gruppenname & ",OU=abc,DC=firma1,DC=local") 				 
06.
objGroup.PutEx ADS_PROPERTY_APPEND, "member", Array("cn=" & Username & ",OU=abc,DC=firma1,DC=local"") 
07.
objGroup.SetInfo
Ordner Erstellen läuft so:
01.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
02.
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.
Bitte warten ..
Mitglied: landuin
23.07.2008 um 15:19 Uhr
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?
Bitte warten ..
Mitglied: Logan000
23.07.2008 um 16:18 Uhr
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.
Bitte warten ..
Mitglied: bastla
23.07.2008 um 22:19 Uhr
Hallo landuin!

Zum Thema "User in Gruppe aufnehmen": Mit
01.
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:
01.
Set UserObj = GetObject("WinNT://vmware/" & Benutzer) 'hattest Du oben schon, daher hier nur der Vollständigkeit wegen 
02.
 
03.
Set GroupObj = GetObject("WinNT://vmware/" & Gruppe) 
04.
GroupObj.Add UserObj.AdsPath 
05.
GroupObj.SetInfo
Grüße
bastla
Bitte warten ..
Mitglied: landuin
24.07.2008 um 09:10 Uhr
Guten Morgen,



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
Bitte warten ..
Mitglied: Logan000
24.07.2008 um 10:05 Uhr
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 <code></code>. 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
Bitte warten ..
Mitglied: bastla
24.07.2008 um 10:08 Uhr
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 ).

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
Bitte warten ..
Mitglied: landuin
24.07.2008 um 10:41 Uhr
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....
Bitte warten ..
Mitglied: landuin
24.07.2008 um 10:57 Uhr
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.
Bitte warten ..
Mitglied: bastla
24.07.2008 um 11:18 Uhr
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:
01.
For i = 4 To UBound(Feld) 
02.
    Gruppe = Feld(i) 
03.
    GruppeAnlegen(Benutzer, Gruppe) 
04.
Next
wobei es dann ein eigenes "Sub GruppeAnlegen" geben müsste.

Grüße
bastla
Bitte warten ..
Mitglied: landuin
24.07.2008 um 11:37 Uhr
Das heisst dann das ich den

01.
Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2 
02.
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000 
03.
 
04.
Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com") 
05.
Set objGroup = objOU.Create("Group", "cn=HR-Employees") 
06.
 
07.
objGroup.Put "sAMAccountName", "HRStaff" 
08.
objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _ 
09.
    ADS_GROUP_TYPE_SECURITY_ENABLED 
10.
objGroup.SetInfo
und den Code

01.
For i = 4 To UBound(Feld) 
02.
    Gruppe = Feld(i) 
03.
    GruppeAnlegen(Benutzer, Gruppe) 
04.
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 ?

01.
Set ouo = GetObject("LDAP://OU=firma,OU=benutzer,OU=schüler,DC=firma1,DC=local")
Bitte warten ..
Mitglied: bastla
24.07.2008 um 11:50 Uhr
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:
01.
Set ouo = GetObject("LDAP://OU=schüler,OU=benutzer,OU=firma,DC=firma1,DC=local")
Grüße
bastla
Bitte warten ..
Mitglied: landuin
24.07.2008 um 13:38 Uhr
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.

01.
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?

01.
Do while not f.AtEndOfLine 
02.
Zeile = f.readLine 
03.
Feld = split(Zeile,",") 
04.
Benutzer = Feld(0) 
05.
Vorname = Feld(1) 
06.
Nachname = Feld(2) 
07.
Passwort = Feld(3) 
08.
Organisationseinheit = Feld(5) 
09.
Call BenuntzerAnlegen(Benutzer,Vorname,Nachname,Passwort) 
10.
Loop 
11.
f.Close 
12.
Wscript.Quit(0)

Ich nehme noch gerne Vorschläge entgegen. :D
Bitte warten ..
Mitglied: bastla
24.07.2008 um 14:07 Uhr
Hallo landuin!

Also folgendes es muss eine Organisationseinheit erstellt werden die dann auch Variabel bleiben soll also so in etwa.
01.
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:
01.
Set ouo = GetObject("LDAP://OU=" & Organisationseinheit & ",OU=schüler,OU=benutzer,OU=firma,DC=firma1,DC=local")
Zu
01.
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
01.
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 ).

Grüße
bastla
Bitte warten ..
Mitglied: landuin
24.07.2008 um 14:38 Uhr
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

01.
Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2 
02.
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000 
03.
 
04.
Set objOU = GetObject("LDAP://ou=HR,dc=NA,dc=fabrikam,dc=com") 
05.
Set objGroup = objOU.Create("Group", "cn=HR-Employees") 
06.
 
07.
objGroup.Put "sAMAccountName", "HRStaff" 
08.
objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _ 
09.
    ADS_GROUP_TYPE_SECURITY_ENABLED 
10.
objGroup.SetInfo
01.
dieses Script packe  
02.
 
03.
<code>Do while not f.AtEndOfLine 
04.
Zeile = f.readLine 
05.
Feld = split(Zeile,",") 
06.
Benutzer = Feld(0) 
07.
Vorname = Feld(1) 
08.
Nachname = Feld(2) 
09.
Passwort = Feld(3) 
10.
Organisationseinheit = Feld(5) 
11.
Call BenuntzerAnlegen(Benutzer,Vorname,Nachname,Passwort) 
12.
Loop 
13.
f.Close 
14.
Wscript.Quit(0)

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

Und umgekehrt findet er diese Zeile nicht mehr.

01.
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:

01.
Zeile = f.readLine 
02.
Feld = split(Zeile,",") 
03.
Organisationseinheit = Feld(4) 
04.
f.Close 
05.
 
06.
 
07.
Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2 
08.
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000 
09.
 
10.
Set objOU = GetObject("LDAP://OU=" & Organisationseinheit & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local") <-------genau hier ist der Fehler 
11.
Set objGroup = objOU.Create("Group", "cn=TestGruppe") 
12.
 
13.
objGroup.Put "sAMAccountName", "TestGruppe" 
14.
objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _ 
15.
    ADS_GROUP_TYPE_SECURITY_ENABLED 
16.
objGroup.SetInfo 
17.
 
18.
 
19.
 
20.
 
21.
Do while not f.AtEndOfLine 
22.
Zeile = f.readLine 
23.
Feld = split(Zeile,",") 
24.
Benutzer = Feld(0) 
25.
Vorname = Feld(1) 
26.
Nachname = Feld(2) 
27.
Passwort = Feld(3) 
28.
Organisationseinheit = Feld(5) 
29.
Call BenuntzerAnlegen(Benutzer,Vorname,Nachname,Passwort) 
30.
Loop 
31.
f.Close 
32.
Wscript.Quit(0)


Ein solches objekt ist auf dem Server nicht vorhanden
80072030

Und darunter kann ich mir gar nix vorstellen.
Bitte warten ..
Mitglied: bastla
24.07.2008 um 16:12 Uhr
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
01.
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.

01.
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
Bitte warten ..
Mitglied: landuin
24.07.2008 um 17:40 Uhr
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:

01.
Dim fso, f, Zeile, Feld  
02.
Set fso = CreateObject("Scripting.FileSystemObject") 
03.
Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
04.
 
05.
dim Organisationseinheit 
06.
Organisationseinheit = "Klasse" 
07.
 
08.
dim Gruppe 
09.
Gruppe = "MOD085" 
10.
 
11.
Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2 
12.
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000 
13.
 
14.
Set objOU = GetObject("LDAP://ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local") 
15.
Set objOU2 = objOU.Create("OrganizationalUnit", "OU=" & Organisationseinheit ) 
16.
objOU2.SetInfo 
17.
 
18.
Set objOU = GetObject("LDAP://ou="&Organisationseinheit&",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local") 
19.
Set objGroup = objOU.Create("Group", "cn=" & Gruppe)   '<------- 
20.
 
21.
objGroup.Put "sAMAccountName", "& Organisationseinheit" 
22.
objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _ 
23.
    ADS_GROUP_TYPE_SECURITY_ENABLED 
24.
objGroup.SetInfo 
25.
 
26.
 
27.
 
28.
 
29.
 
30.
Do while not f.AtEndOfLine 
31.
Zeile = f.readLine 
32.
Feld = split(Zeile,";") 
33.
Vpname = Feld(0) 
34.
KursNR = Feld(1) 
35.
VpVorname = Feld(4) 
36.
VertrEnde = Feld(8) 
37.
Anmeldename = Feld(9) 
38.
Call BenuntzerAnlegen(Vpname,KursNR,VpVorname,VertrEnde,Anmeldename) 
39.
Loop 
40.
f.Close 
41.
Wscript.Quit(0)
Bitte warten ..
Mitglied: bastla
24.07.2008 um 18:43 Uhr
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:
01.
Gruppe = Organisationseinheit
Dann könnte auch die Zeile 21 lauten:
01.
objGroup.Put "sAMAccountName", Gruppe
Grüße
bastla
Bitte warten ..
Mitglied: landuin
28.07.2008 um 09:04 Uhr
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.
Bitte warten ..
Mitglied: bastla
28.07.2008 um 09:28 Uhr
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]
Bitte warten ..
Mitglied: landuin
28.07.2008 um 09:40 Uhr
Der Link funktioniert leider nicht.

Da steht "Page Not Found"......
Bitte warten ..
Mitglied: Nailara
28.07.2008 um 09:41 Uhr
Nimm mal die Klammer am Ende der Adresse weg ...

Grüße
Bitte warten ..
Mitglied: landuin
28.07.2008 um 10:38 Uhr
Nimm mal die Klammer am Ende der Adresse weg ...

War ja noch früh am morgen *hust*


01.
 
02.
 
03.
dim fso, f, xx 
04.
 
05.
Set fso = CreateObject("Scripting.FileSystemObject") 
06.
Set xx = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
07.
 
08.
dim Anmeldename 
09.
 
10.
 
11.
Do while not xx.AtEndOfLine 
12.
Zeile = xx.readLine 
13.
Feld = split(Zeile,";") 
14.
Anmeldename = Feld(9) 
15.
Loop 
16.
xx.Close 
17.
 
18.
 
19.
 
20.
dtStart = TimeValue(Now()) 
21.
Set objConnection = CreateObject("ADODB.Connection") 
22.
objConnection.Open "Provider=ADsDSOObject;" 
23.
  
24.
Set objCommand = CreateObject("ADODB.Command") 
25.
objCommand.ActiveConnection = objConnection 
26.
  
27.
objCommand.CommandText = _ 
28.
    "<LDAP://ou=MOD085,ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local>;(&(objectCategory=User)" & _ 
29.
         "(samAccountName=" & Anmeldename & "));samAccountName;subtree" 
30.
   
31.
Set objRecordSet = objCommand.Execute 
32.
  
33.
If objRecordset.RecordCount = 0 Then 
34.
    WScript.Echo "sAMAccountName: " & Anmeldename & " does not exist." 
35.
Else 
36.
    WScript.Echo Anmeldename & " exists." 
37.
End If 
38.
  
39.
objConnection.Close 
40.
 
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?
Bitte warten ..
Mitglied: bastla
28.07.2008 um 12:28 Uhr
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:
01.
Set LogFile = fso.CreateTextFile("D:\BereitsExistierendeUser.txt", True) 
02.
... 
03.
LogFile.WriteLine "Bereits angelegt: " & Anmeldename 
04.
... 
05.
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
Bitte warten ..
Mitglied: landuin
28.07.2008 um 13:27 Uhr
Hat wieder funktioniert.

01.
dim fso, f, xx, LogFile 
02.
 
03.
Set fso = CreateObject("Scripting.FileSystemObject") 
04.
'Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
05.
Set xx = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
06.
 
07.
dim Anmeldename 
08.
 
09.
Set LogFile = fso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\FehlerLog.txt", True) 
10.
 
11.
Do while not xx.AtEndOfLine 
12.
Zeile = xx.readLine 
13.
Feld = split(Zeile,";") 
14.
Klasse = Feld(1) 
15.
Anmeldename = Feld(9) 
16.
 
17.
dim Klasse 
18.
 
19.
 
20.
dim Organisationseinheit 
21.
Organisationseinheit =  Klasse 
22.
 
23.
dim Gruppe 
24.
Gruppe = Organisationseinheit 
25.
 
26.
 
27.
 
28.
dtStart = TimeValue(Now()) 
29.
Set objConnection = CreateObject("ADODB.Connection") 
30.
objConnection.Open "Provider=ADsDSOObject;" 
31.
  
32.
Set objCommand = CreateObject("ADODB.Command") 
33.
objCommand.ActiveConnection = objConnection 
34.
  
35.
objCommand.CommandText = _ 
36.
    "<LDAP://ou=Organisationseinheit 
37.
,ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local>;(&(objectCategory=User)" & _ 
38.
         "(samAccountName=" & Anmeldename & "));samAccountName;subtree" 
39.
   
40.
Set objRecordSet = objCommand.Execute 
41.
  
42.
'If objRecordset.RecordCount = 0 Then 
43.
'     "sAMAccountName: " & Anmeldename & " does not exist." 
44.
'Else 
45.
'    WScript.Echo  Anmeldename & " exists." 
46.
'End If 
47.
'  
48.
' WScript.Echo objConnection.Close 
49.
 
50.
	If objRecordset.RecordCount = 0 Then 
51.
 
52.
		LogFile.WriteLine "Nicht Existent: " & Anmeldename 
53.
 
54.
	Else 
55.
 
56.
		LogFile.WriteLine "Existent: " & Anmeldename 
57.
 
58.
	end If 
59.
Loop 
60.
xx.Close 
61.
 
62.
LogFile.Close 
63.
 
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?
Bitte warten ..
Mitglied: bastla
28.07.2008 um 13:53 Uhr
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
Bitte warten ..
Mitglied: landuin
28.07.2008 um 14:05 Uhr
Das stimm aber mein Fehler war auch noch ganz woanders.

01.
 
02.
dim gso, OO, LogF 
03.
 
04.
Set gso = CreateObject("Scripting.FileSystemObject") 
05.
Set OO = gso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
06.
 
07.
dim Klassenraum 
08.
 
09.
Set LogF = gso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\FehlerLog_Gruppe_Klasse.txt", True) 
10.
 
11.
Do while not OO.AtEndOfLine 
12.
Zeile = OO.readLine 
13.
Feld = split(Zeile,";") 
14.
Klassenraum = Feld(1) 
15.
 
16.
dtStart = TimeValue(Now()) 
17.
Set objConnection = CreateObject("ADODB.Connection") 
18.
objConnection.Open "Provider=ADsDSOObject;" 
19.
  
20.
Set objCommand = CreateObject("ADODB.Command") 
21.
objCommand.ActiveConnection = objConnection 
22.
  
23.
objCommand.CommandText = _ 
24.
    "<LDAP://ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local>;(&(objectCategory=user)" & _ 
25.
         "(samAccountName=" & Klassenraum & "));samAccountName;subtree" 
26.
   
27.
Set objRecordSet = objCommand.Execute 
28.
 
29.
 
30.
	If objRecordset.RecordCount = 0 Then 
31.
 
32.
		LogF.WriteLine "Nicht Existent: " & Klassenraum 
33.
 
34.
	Else 
35.
 
36.
		LogF.WriteLine "Existent: " & Klassenraum 
37.
 
38.
	end If 
39.
Loop 
40.
 
41.
oo.close 
42.
 
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.
Bitte warten ..
Mitglied: bastla
28.07.2008 um 18:02 Uhr
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:
01.
Set objConnection = CreateObject("ADODB.Connection") 
02.
objConnection.Open "Provider=ADsDSOObject;" 
03.
  
04.
Set objCommand = CreateObject("ADODB.Command") 
05.
objCommand.ActiveConnection = objConnection 
06.
  
07.
objCommand.CommandText = _ 
08.
"<LDAP://dc=firma1,dc=local>;" & _ 
09.
"(distinguishedName=ou=" & Klassenraum & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local);distinguishedName" 
10.
   
11.
Set objRecordSet = objCommand.Execute 
12.
 
13.
If objRecordset.RecordCount = 0 Then 
14.
	LogF.WriteLine "Nicht Existent: " & Klassenraum 
15.
Else 
16.
	LogF.WriteLine "Existent: " & Klassenraum 
17.
End If
Für eine Gruppe (welche in einer OU gleichen Namens liegt):
01.
objCommand.CommandText = _ 
02.
"<LDAP://dc=firma1,dc=local>;" & _ 
03.
"(distinguishedName=cn=" & Gruppe & ",ou=" & Gruppe & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local);distinguishedName"
Grüße
bastla
Bitte warten ..
Mitglied: ADGuru
28.07.2008 um 20:58 Uhr
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:
http://www.administrator.de/index.php?content=b4ee9307c17c6aedce4ad0118 ...
Bitte warten ..
Mitglied: landuin
29.07.2008 um 09:14 Uhr
@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.


01.
dim fso, f, yy, LogFile 
02.
 
03.
Set fso = CreateObject("Scripting.FileSystemObject") 
04.
Set yy = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
05.
 
06.
dim Anmeld 
07.
 
08.
dim Kla 
09.
 
10.
 
11.
Set LogFile = fso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\FehlerLog.txt", True) 
12.
 
13.
Do while not yy.AtEndOfLine 
14.
Zeile = yy.readLine 
15.
Feld = split(Zeile,";") 
16.
Kla = Feld(1) 
17.
Anmeld = Feld(9) 
18.
 
19.
dtStart = TimeValue(Now()) 
20.
Set objConnection = CreateObject("ADODB.Connection") 
21.
objConnection.Open "Provider=ADsDSOObject;" 
22.
  
23.
Set objCommand = CreateObject("ADODB.Command") 
24.
objCommand.ActiveConnection = objConnection 
25.
  
26.
objCommand.CommandText = _ 
27.
    "<LDAP://ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local>;(&(objectCategory=User)" & _ 
28.
         "(samAccountName=" & Anmeld & "));samAccountName;subtree" 
29.
   
30.
Set objRecordSet = objCommand.Execute 
31.
  
32.
 
33.
 
34.
	If objRecordset.RecordCount = 0 Then 
35.
 
36.
		LogFile.WriteLine "Nicht Existent: " & Anmeld 
37.
 
38.
	Else 
39.
 
40.
		LogFile.WriteLine "Existent: " & Anmeld 
41.
 
42.
	end If 
43.
 
44.
 
45.
 
46.
dim  BBB, LogF, gso 
47.
 
48.
 
49.
Set gso = CreateObject("Scripting.FileSystemObject") 
50.
 
51.
Set BBB = gso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Fe\User.txt",1,0) 
52.
 
53.
 
54.
dim Klassenraum 
55.
 
56.
 
57.
Set LogF = gso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Fe\FehlerLog_Gruppe_Klasse.txt", True) 
58.
 
59.
Do while not BBB.AtEndOfLine 
60.
Zeile = BBB.readLine 
61.
Feld = split(Zeile,";") 
62.
Klassenraum = Feld(1) 
63.
 
64.
Set objConnection = CreateObject("ADODB.Connection") 
65.
objConnection.Open "Provider=ADsDSOObject;" 
66.
  
67.
Set objCommand = CreateObject("ADODB.Command") 
68.
objCommand.ActiveConnection = objConnection 
69.
  
70.
objCommand.CommandText = _ 
71.
"<LDAP://dc=firma1,dc=local>;" & _ 
72.
"(distinguishedName=ou=" & Klassenraum & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local);distinguishedName" 
73.
   
74.
Set objRecordSet = objCommand.Execute 
75.
 
76.
If objRecordset.RecordCount = 0 Then 
77.
	LogF.WriteLine "Nicht Existent: " & Klassenraum 
78.
Else 
79.
	LogF.WriteLine "Existent: " & Klassenraum 
80.
End If 
81.
 
82.
dim  AAA, LogA, aso 
83.
 
84.
 
85.
Set aso = CreateObject("Scripting.FileSystemObject") 
86.
 
87.
Set AAA = aso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
88.
 
89.
dim Gruppen 
90.
 
91.
Set LogA = aso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\FehlerLog_Gruppen_Klasse.txt", True) 
92.
 
93.
Do while not AAA.AtEndOfLine 
94.
Zeile = AAA.readLine 
95.
Feld = split(Zeile,";") 
96.
Gruppen = Feld(1) 
97.
 
98.
 
99.
 
100.
Set objConnection = CreateObject("ADODB.Connection") 
101.
objConnection.Open "Provider=ADsDSOObject;" 
102.
  
103.
Set objCommand = CreateObject("ADODB.Command") 
104.
objCommand.ActiveConnection = objConnection 
105.
  
106.
 
107.
 
108.
 
109.
 
110.
objCommand.CommandText = _ 
111.
"<LDAP://dc=firma1,dc=local>;" & _ 
112.
"(distinguishedName=cn=" & Gruppen & ",ou=" & Gruppen & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local);distinguishedName" 
113.
 
114.
 
115.
Set objRecordSet = objCommand.Execute 
116.
 
117.
If objRecordset.RecordCount = 0 Then 
118.
	LogA.WriteLine "Nicht Existent: " & Gruppen 
119.
Else 
120.
	LogA.WriteLine "Existent: " & Gruppen 
121.
End If 
122.
 
123.
 
124.
Loop 
125.
 
126.
AAA.Close 
127.
 
128.
LogA.Close 
129.
 
130.
Loop 
131.
 
132.
BBB.Close 
133.
 
134.
LogF.Close 
135.
 
136.
Loop 
137.
yy.Close 
138.
 
139.
LogFile.Close 
140.
 
141.
End Sub 
142.
 


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?


01.
md \\server\daten\home\%1 
02.
echo J | cacls \\server\daten\home\%1 /C /E /G Administratoren:F 
03.
echo J | cacls \\server\daten\home\%1 /C /E /G domaene\%1:F    '<--------------- Die Gruppe soll nicht auf die einzelnen user ordner zugreifen 
04.
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.
Bitte warten ..
Mitglied: bastla
29.07.2008 um 11:36 Uhr
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
Bitte warten ..
Mitglied: landuin
29.07.2008 um 12:06 Uhr
@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.
Bitte warten ..
Mitglied: bastla
29.07.2008 um 12:25 Uhr
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
Bitte warten ..
Mitglied: landuin
29.07.2008 um 12:55 Uhr
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?

01.
 If UserExists(sUserName) Then 
02.
    CreateUser = False 
03.
    Exit Function 
04.
  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?





01.
Dim fso, f, Zeile, Feld, xx 
02.
Set fso = CreateObject("Scripting.FileSystemObject") 
03.
Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
04.
Set xx = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
05.
 
06.
 
07.
 
08.
Zeile = xx.readLine 
09.
Feld = split(Zeile,";") 
10.
Klasse = Feld(1) 
11.
xx.Close 
12.
'Wscript.Quit(0) 
13.
 
14.
dim Klasse 
15.
 
16.
 
17.
dim Organisationseinheit 
18.
Organisationseinheit =  Klasse 
19.
 
20.
dim Gruppe 
21.
Gruppe = Organisationseinheit 
22.
 
23.
Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2 
24.
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000 
25.
 
26.
Set objOU = GetObject("LDAP://ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local") 
27.
Set objOU2 = objOU.Create("OrganizationalUnit", "OU=" & Organisationseinheit ) 
28.
objOU2.SetInfo 
29.
 
30.
Set objOU = GetObject("LDAP://ou="&Organisationseinheit&",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local") 
31.
Set objGroup = objOU.Create("Group", "cn=" & Gruppe)   '<------- 
32.
 
33.
objGroup.Put "sAMAccountName", "& Gruppe" 
34.
objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _ 
35.
    ADS_GROUP_TYPE_SECURITY_ENABLED 
36.
objGroup.SetInfo 
37.
 
38.
 
39.
 
40.
Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
41.
 
42.
Do while not f.AtEndOfLine 
43.
Zeile = f.readLine 
44.
Feld = split(Zeile,";") 
45.
Vpname = Feld(0) 
46.
KursNR = Feld(1) 
47.
VpVorname = Feld(4) 
48.
VertrEnde = Feld(8) 
49.
Anmeldename = Feld(9) 
50.
Call BenuntzerAnlegen(Vpname,KursNR,VpVorname,VertrEnde,Anmeldename) 
51.
Loop 
52.
f.Close 
53.
Wscript.Quit(0) 
54.
 
55.
Sub BenuntzerAnlegen(Vpname,KursNR,VpVorname,VertrEnde,Anmeldename) 
56.
Dim ouo, b 
57.
Set ouo = GetObject("LDAP://ou="&Organisationseinheit&",OU=schüler,OU=benutzer,OU=firma,DC=firma1,DC=local") 
58.
Set b = ouo.Create("user", "CN=" & VpVorname & " " & Vpname) 
59.
Dim WshShell, ret 
60.
Set WshShell = WScript.CreateObject("WScript.Shell") 
61.
b.Put "sAMAccountName", Anmeldename 
62.
b.Put "displayName", VpVorname & " " & Vpname 
63.
b.Put "givenName", VpVorname 
64.
b.Put "sn", Vpname 
65.
b.Put "userAccountControl", 66082 
66.
b.Put "userPrincipalName", Anmeldename & "@DomainName.TopLevelDomain" 
67.
b.Put "profilePath", "\\vmware\daten\profile\" & Anmeldename 
68.
'b.Put "homeDirectory", "\\vmware\daten\home\" & Benutzer 
69.
b.Put "homeDrive", "q:" 
70.
b.SetInfo 
71.
 
72.
'Password läuft nicht ab' 
73.
b.SetPassword Passwort 
74.
b.Put "userAccountControl", 66082 
75.
b.AccountDisabled = False 
76.
b.SetInfo 
77.
 
78.
 
79.
'Logincript' 
80.
Set UserObj = GetObject("WinNT://vmware/" & Anmeldename) 
81.
UserObj.LoginScript = "datev.bat" 
82.
UserObj.SetInfo 
83.
Set UserObj = Nothing 
84.
 
85.
 
86.
Set UserObj = GetObject("WinNT://vmware/" & Anmeldename) 'hattest Du oben schon, daher hier nur der Vollständigkeit wegen 
87.
 
88.
Set GroupObj = GetObject("WinNT://vmware/" & "& Gruppe") 
89.
GroupObj.Add UserObj.AdsPath 
90.
GroupObj.SetInfo 
91.
 
92.
 
93.
WScript.Sleep(1000) 
94.
ret = WshShell.Run ("rechte.cmd " & Anmeldename,0,1)
Bitte warten ..
Mitglied: bastla
29.07.2008 um 15:04 Uhr
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
Bitte warten ..
Mitglied: landuin
29.07.2008 um 15:20 Uhr
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

01.
Dim fso, f, Zeile, Feld, xx 
02.
Set fso = CreateObject("Scripting.FileSystemObject") 
03.
Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
04.
Set xx = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
05.
 
06.
Zeile = xx.readLine 
07.
Feld = split(Zeile,";") 
08.
Klasse = Feld(1) 
09.
xx.Close 
10.
Wscript.Quit(0) 
11.
 
12.
dim Klasse 
13.
 
14.
 
15.
dim Organisationseinheit 
16.
Organisationseinheit =  Klasse 
17.
 
18.
dim Gruppe 
19.
Gruppe = Organisationseinheit 
20.
 
21.
Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2 
22.
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000 
23.
 
24.
Set objOU = GetObject("LDAP://ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local") 
25.
Set objOU2 = objOU.Create("OrganizationalUnit", "OU=" & Organisationseinheit ) 
26.
objOU2.SetInfo 
27.
 
28.
Set objOU = GetObject("LDAP://ou="&Organisationseinheit&",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local") 
29.
Set objGroup = objOU.Create("Group", "cn=" & Gruppe)   '<------- 
30.
 
31.
objGroup.Put "sAMAccountName", "& Gruppe" 
32.
objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _ 
33.
    ADS_GROUP_TYPE_SECURITY_ENABLED 
34.
objGroup.SetInfo 
35.
 
36.
 
37.
 
38.
Set f = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
39.
 
40.
Do while not f.AtEndOfLine 
41.
Zeile = f.readLine 
42.
Feld = split(Zeile,";") 
43.
Vpname = Feld(0) 
44.
KursNR = Feld(1) 
45.
VpVorname = Feld(4) 
46.
VertrEnde = Feld(8) 
47.
Anmeldename = Feld(9) 
48.
Call BenuntzerAnlegen(Vpname,KursNR,VpVorname,VertrEnde,Anmeldename) 
49.
Loop 
50.
f.Close 
51.
Wscript.Quit(0) 
52.
 
53.
Sub BenuntzerAnlegen(Vpname,KursNR,VpVorname,VertrEnde,Anmeldename) 
54.
Dim ouo, b 
55.
Set ouo = GetObject("LDAP://ou="&Organisationseinheit&",OU=schüler,OU=benutzer,OU=firma,DC=firma1,DC=local") 
56.
Set b = ouo.Create("user", "CN=" & VpVorname & " " & Vpname) 
57.
Dim WshShell, ret 
58.
Set WshShell = WScript.CreateObject("WScript.Shell") 
59.
b.Put "sAMAccountName", Anmeldename 
60.
b.Put "displayName", VpVorname & " " & Vpname 
61.
b.Put "givenName", VpVorname 
62.
b.Put "sn", Vpname 
63.
b.Put "userAccountControl", 66082 
64.
b.Put "userPrincipalName", Anmeldename & "@DomainName.TopLevelDomain" 
65.
b.Put "profilePath", "\\vmware\daten\profile\" & Anmeldename 
66.
'b.Put "homeDirectory", "\\vmware\daten\home\" & Benutzer 
67.
b.Put "homeDrive", "q:" 
68.
b.SetInfo 
69.
 
70.
'Password läuft nicht ab' 
71.
b.SetPassword Passwort 
72.
b.Put "userAccountControl", 66082 
73.
b.AccountDisabled = False 
74.
b.SetInfo 
75.
 
76.
 
77.
'Logincript' 
78.
Set UserObj = GetObject("WinNT://vmware/" & Anmeldename) 
79.
UserObj.LoginScript = "datev.bat" 
80.
UserObj.SetInfo 
81.
Set UserObj = Nothing 
82.
 
83.
 
84.
Set UserObj = GetObject("WinNT://vmware/" & Anmeldename) 'hattest Du oben schon, daher hier nur der Vollständigkeit wegen 
85.
 
86.
Set GroupObj = GetObject("WinNT://vmware/" & "& Gruppe") 
87.
GroupObj.Add UserObj.AdsPath 
88.
GroupObj.SetInfo 
89.
 
90.
WScript.Sleep(1000) 
91.
ret = WshShell.Run ("rechte.cmd " & Anmeldename,0,1) 
92.
 
93.
'--------------------------------------------------------------Der untere Teil kontrolliert nur ob zb die user existieren 
94.
 
95.
dim fso, f, yy, LogFile 
96.
 
97.
Set fso = CreateObject("Scripting.FileSystemObject") 
98.
Set yy = fso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt",1,0) 
99.
 
100.
dim Anmeld 
101.
 
102.
dim Kla 
103.
 
104.
Set LogFile = fso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\FehlerLog.txt", True) 
105.
 
106.
Do while not yy.AtEndOfLine 
107.
Zeile = yy.readLine 
108.
Feld = split(Zeile,";") 
109.
Kla = Feld(1) 
110.
Anmeld = Feld(9) 
111.
 
112.
dtStart = TimeValue(Now()) 
113.
Set objConnection = CreateObject("ADODB.Connection") 
114.
objConnection.Open "Provider=ADsDSOObject;" 
115.
  
116.
Set objCommand = CreateObject("ADODB.Command") 
117.
objCommand.ActiveConnection = objConnection 
118.
  
119.
objCommand.CommandText = _ 
120.
    "<LDAP://ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local>;(&(objectCategory=User)" & _ 
121.
         "(samAccountName=" & Anmeld & "));samAccountName;subtree" 
122.
   
123.
Set objRecordSet = objCommand.Execute 
124.
 
125.
	If objRecordset.RecordCount = 0 Then 
126.
 
127.
		LogFile.WriteLine "Nicht Existent: " & Anmeld 
128.
 
129.
	Else 
130.
 
131.
		LogFile.WriteLine "Existent: " & Anmeld 
132.
 
133.
	end If 
134.
 
135.
dim  BBB, LogF, gso 
136.
 
137.
Set gso = CreateObject("Scripting.FileSystemObject") 
138.
 
139.
Set BBB = gso.OpenTextFile ("C:\Dokumente und Einstellungen\Administrator\Desktop\Fe\User.txt",1,0) 
140.
 
141.
dim Klassenraum 
142.
 
143.
Set LogF = gso.CreateTextFile("C:\Dokumente und Einstellungen\Administrator\Desktop\Fe\FehlerLog_Gruppe_Klasse.txt", True) 
144.
 
145.
Do while not BBB.AtEndOfLine 
146.
Zeile = BBB.readLine 
147.
Feld = split(Zeile,";") 
148.
Klassenraum = Feld(1) 
149.
 
150.
 
151.
Set objConnection = CreateObject("ADODB.Connection") 
152.
objConnection.Open "Provider=ADsDSOObject;" 
153.
  
154.
Set objCommand = CreateObject("ADODB.Command") 
155.
objCommand.ActiveConnection = objConnection 
156.
  
157.
objCommand.CommandText = _ 
158.
"<LDAP://dc=firma1,dc=local>;" & _ 
159.
"(distinguishedName=ou=" & Klassenraum & ",ou=schüler,ou=benutzer,ou=firma,dc=firma1,dc=local);distinguishedName" 
160.
   
161.
Set objRecordSet = objCommand.Execute 
162.
 
163.
If objRecordset.RecordCount = 0 Then 
164.
	LogF.WriteLine "Nicht Existent: " & Klassenraum 
165.
Else 
166.
	LogF.WriteLine "Existent: " & Klassenraum 
167.
End If 
168.
 
169.
Loop 
170.
 
171.
BBB.Close 
172.
 
173.
LogF.Close 
174.
 
175.
Loop 
176.
yy.Close 
177.
 
178.
LogFile.Close 
179.
 
180.
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)
Bitte warten ..
Mitglied: bastla
29.07.2008 um 18:18 Uhr
Hallo landuin!

Etwas begradigt und kommentiert:
01.
Option Explicit 
02.
Dim Dom, DomTLD, dc, DCPfad, ADPfad, BasisPfad, UserCSV, LogFile 
03.
Dim fso, f, lf, Zeile, Feld 
04.
Dim WshShell, ret 
05.
Dim objOU, objOU2, objGroup, objConnection, objCommand, objRecordSet 
06.
Dim Klasse, Organisationseinheit, Gruppe, ADPfadNeu 
07.
Dim Vpname, KursNR,VpVorname, Passwort, VertrEnde, Anmeldename 
08.
 
09.
'ab hier Pfade anpassen 
10.
Dom = "FIRMA1" 'NT-Domäne 
11.
DomTLD = "firma1.local" 'Domäne 
12.
DCPfad = "" 'DC-Pfad erzeugen 
13.
For Each dc In Split(DomTLD, ".") 
14.
	DCPfad = DCPfad & ",dc=" & dc 
15.
Next 
16.
DCPfad = Mid(DCPfad, 2) 
17.
ADPfad = "ou=schüler,ou=benutzer,ou=firma," & DCPfad 'Alle weiteren Objekte werden in oder unterhalb dieser OU erstellt 
18.
BasisPfad = "\\vmware\daten" 'Alle Ordner für User und Gruppen werden in oder unterhalb dieses Pfades erstellt 
19.
UserCSV = "C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\User.txt" 
20.
LogFile = "C:\Dokumente und Einstellungen\Administrator\Desktop\Gruppe+User\FehlerLog.txt" 
21.
'bis hier Pfade anpassen 
22.
 
23.
Set WshShell = WScript.CreateObject("WScript.Shell") 
24.
Set fso = CreateObject("Scripting.FileSystemObject") 
25.
Set f = fso.OpenTextFile (UserCSV,1,0) 
26.
Zeile = f.ReadLine 
27.
Feld = Split(Zeile,";") 
28.
Klasse = Feld(1) 
29.
f.Close 
30.
 
31.
Organisationseinheit = Klasse 
32.
Gruppe = Organisationseinheit 
33.
 
34.
Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2 
35.
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000 
36.
 
37.
Set objConnection = CreateObject("ADODB.Connection") 
38.
objConnection.Open "Provider=ADsDSOObject;" 
39.
Set objCommand = CreateObject("ADODB.Command") 
40.
objCommand.ActiveConnection = objConnection 
41.
 
42.
'Logfile erstellen und öffnen 
43.
Set lf = fso.CreateTextFile(LogFile, True) 
44.
 
45.
'Ist OU (Klasse) bereits vorhanden? 
46.
ADPfadNeu = "ou=" & Organisationseinheit & "," & ADPfad 
47.
objCommand.CommandText = _ 
48.
"<LDAP://" & ADPfad & ">;" & _ 
49.
"(distinguishedName=" & ADPfadNeu & ");distinguishedName" 
50.
   
51.
Set objRecordSet = objCommand.Execute 
52.
If objRecordset.RecordCount = 0 Then 
53.
	lf.WriteLine "Nicht Existent: OU: " & Organisationseinheit 
54.
	Set objOU = GetObject("LDAP://" & ADPfad) 
55.
	'OU (Klasse) erstellen 
56.
	Set objOU2 = objOU.Create("OrganizationalUnit", "OU=" & Organisationseinheit ) 
57.
	objOU2.SetInfo 
58.
Else 
59.
	lf.WriteLine "Existent: OU: " & Organisationseinheit 
60.
End If 
61.
 
62.
'Objekt für OU (Klasse) erzeugen 
63.
Set objOU2 = GetObject("LDAP://" & ADPfadNeu) 
64.
 
65.
'Ist Gruppe bereits vorhanden? 
66.
objCommand.CommandText = _ 
67.
"<LDAP://" & DCPfad & ">;" & _ 
68.
"(distinguishedName=cn=" & Gruppe & "," & ADPfadNeu & ");distinguishedName" 
69.
If objRecordset.RecordCount = 0 Then 
70.
	lf.WriteLine "Nicht Existent: Gruppe: " & Gruppe 
71.
	'Gruppe erstellen 
72.
	Set objGroup = objOU2.Create("Group", "cn=" & Gruppe) 
73.
	objGroup.Put "sAMAccountName", Gruppe 
74.
	objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _ 
75.
		ADS_GROUP_TYPE_SECURITY_ENABLED 
76.
	objGroup.SetInfo 
77.
Else 
78.
	lf.WriteLine "Existent: Gruppe: " & Gruppe 
79.
End If 
80.
 
81.
'Gruppenordner bei Bedarf erstellen und Rechte setzen 
82.
ret = WshShell.Run ("rechte.cmd " & BasisPfad & "\groups\ " & Dom & " " & Gruppe,0,1) 
83.
 
84.
'Gruppenobjekt erzeugen (für spätere Zuweisung der User) 
85.
Set objGroup = GetObject("LDAP://" & "cn=" & Gruppe & "," & ADPfadNeu) 
86.
 
87.
'Userdatei auslesen 
88.
Set f = fso.OpenTextFile (UserCSV,1,0) 
89.
Do While Not f.AtEndOfLine 
90.
	Zeile = f.ReadLine 
91.
	Feld = Split(Zeile,";") 
92.
	Vpname = Feld(0) 
93.
	KursNR = Feld(1) 
94.
	VpVorname = Feld(4) 
95.
	VertrEnde = Feld(8) 
96.
	Anmeldename = Feld(9) 
97.
	Passwort = "Neues#555" 
98.
	Call BenutzerAnlegen(Vpname,KursNR,VpVorname,Passwort,VertrEnde,Anmeldename,Klasse,objOU,objOU2,objGroup,BasisPfad) 
99.
Loop 
100.
f.Close 
101.
lf.Close 
102.
Wscript.Quit(0) 
103.
'------- Ende Hauptprogramm -------- 
104.
 
105.
Sub BenutzerAnlegen(Vpname,KursNR,VpVorname,Passwort,VertrEnde,Anmeldename,Klasse,objOU,objOU2,objGroup,BasisPfad) 
106.
Dim UserObj 
107.
 
108.
'Wurde ein User mit dem angegebenen Anmeldenamen bereits angelegt? 
109.
objCommand.CommandText = _ 
110.
    "<LDAP://" & DCPfad & ">;(&(objectCategory=User)" & _ 
111.
         "(samAccountName=" & Anmeldename & "));samAccountName;subtree" 
112.
Set objRecordSet = objCommand.Execute 
113.
If objRecordset.RecordCount = 0 Then 'neuer User 
114.
	lf.WriteLine "Nicht Existent: User: " & Anmeldename 
115.
		 
116.
	'User anlegen 
117.
	Set UserObj = objOU2.Create("user", "CN=" & VpVorname & " " & Vpname) 'User-Objekt erzeugen 
118.
	UserObj.Put "sAMAccountName", Anmeldename 
119.
	UserObj.Put "displayName", VpVorname & " " & Vpname 
120.
	UserObj.Put "givenName", VpVorname 
121.
	UserObj.Put "sn", Vpname 
122.
	UserObj.Put "userAccountControl", 66082 
123.
	UserObj.Put "userPrincipalName", Anmeldename & "@" & DomTLD 
124.
	UserObj.Put "profilePath", BasisPfad & "\profile\" & Anmeldename 
125.
	'UserObj.Put "homeDirectory", BasisPfad & "home\" & Anmeldename 
126.
	UserObj.Put "homeDrive", "q:" 
127.
	UserObj.SetInfo 
128.
 
129.
	'Password läuft nicht ab' 
130.
	UserObj.SetPassword Passwort 
131.
	UserObj.Put "userAccountControl", 66082 
132.
	UserObj.AccountDisabled = False 
133.
	UserObj.SetInfo 
134.
 
135.
	'Logincript 
136.
	UserObj.LoginScript = "datev.bat" 
137.
	UserObj.SetInfo 
138.
 
139.
	'User bereits Mitglied der Gruppe? 
140.
	 
141.
	'User in Gruppe aufnehmen 
142.
	objGroup.Add UserObj.AdsPath 
143.
	objGroup.SetInfo 
144.
 
145.
	WScript.Sleep(1000) 
146.
	'Userordner erstellen und Rechte setzen 
147.
	ret = WshShell.Run ("rechte.cmd " & BasisPfad & "\profile " & Dom & " " & Anmeldename,0,1) 
148.
	ret = WshShell.Run ("rechte.cmd " & BasisPfad & "\home " & Dom & " " & Anmeldename,0,1) 
149.
		 
150.
Else ' User bereits vorhanden 
151.
	lf.WriteLine "Existent: User: " & Anmeldename 
152.
 
153.
End If 
154.
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:
01.
@echo off & setlocal 
02.
::Parameter 1: Pfad 
03.
::Parameter 2: Domaene 
04.
::Parameter 3: Benutzername oder Gruppe 
05.
 
06.
set "Pfad=%~1\%~3" 
07.
if not exist "%Pfad%" md "%Pfad%" 
08.
echo J | cacls "%Pfad%" /C /E /G Administratoren:F 
09.
echo J | cacls "%Pfad%" /C /E /G "%~2\%~3":F 
10.
echo J | cacls "%Pfad%" /C /E /R Jeder
Grüße
bastla

P.S.: Viel Spaß beim Testen ...
Bitte warten ..
Mitglied: landuin
30.07.2008 um 08:49 Uhr
Vielen Herzlich Dank für deine Mühe ! Damit hatte ich nur wirklich nicht gerechnet! Nun ist auch das Programm endlich komplett fertig! XD
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Outlook & Mail
gelöst Email Anhänge speichern VB Script aber nur bestimmte Dateitypen (Outlook) (4)

Frage von LindeUnimog zum Thema Outlook & Mail ...

VB for Applications
gelöst VB Script rekursiv statt nur ein Ordner (4)

Frage von Saschaaaaa zum Thema VB for Applications ...

Windows Tools
Sysprep Auditmode: User anlegen via lusrmgr. VS Unattend.xml (1)

Frage von dankon7goo zum Thema Windows Tools ...

VB for Applications
gelöst VB Script nach gefundenem Wort die nächsten 4 Zeichen ersetzten (2)

Frage von deutsch73 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...