koluschkib
Goto Top

Check ob user im AD existiert mit vbs

Hallo Adminanhänger

früher oder später kommen sie alle wieder face-smile

Hab da ein Problem beim Umsetzen einer Idee in meinem Script was User und Gruppen im AD anlegt.

Da es vorkommt, das evtl. beim Anlegen eines User mit VBS ein fehler rausgehauen wird, dass das Objekt (user) bereist existiert. Will ich eine If abfrage basteln, die dies vorher Checkt.
Leider habe ich das Problem, dass ich eine´Eigenschaft oder Methode verwenden will die nicht existiert...

If UserExists (Feld(0),Feld(1),objOU) Then
errtext.WriteLine("Der Benutzer " &Vorname & " " & Nachname& " existiert bereits und kann nicht angelegt werden")  
On Error Resume Next
Else
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 "userPrincipalName", left(Vorname,3) & left(nachname,2) & "@testAD.int"  
objUser.SetInfo
objUser.SetPassword Passwort
objUser.Put "userAccountControl", 544  
objUser.Put "pwdLastSet", 0  
objUser.SetInfo
'Log-Datei mit Text füllen  
logtext.WriteLine("Der Benutzer " &Vorname &" " &Nachname& " wurde im AD angelegt")  
End If

Der Fehler liegt direkt ind er 1. zeile ---> UserExists
Hab schon verschieden ansätze versucht, mit fso. usw. aber nichts hat geholfen. Hab natürlich auch andere angehensweise getestet und probiert aber leider ebenfalls ohne erfolg
http://www.computerperformance.co.uk/Logon/code/code_80071392.htm
http://blogs.technet.com/b/heyscriptingguy/archive/2005/09/07/how-can-i ...
leider scheitert es an der umsetzung des ganzen...

Dabei wäre es ratsam diesen Fehler abzufangen.
hat einer von euch ne Idee was ich da am besten nutzen könnte um dieses Problem zu lösen?

gruß

koluschkiB

Content-ID: 144555

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

Ausgedruckt am: 15.11.2024 um 15:11 Uhr

60730
60730 10.06.2010 um 11:34:52 Uhr
Goto Top
Moin,

die Frage ist doch - woher kommt der Datensatzsalat, mit dem du die User anlegen willst.
Und deine Zeile 1 ist nicht der Anfang des ganzen.

Du kennst doch mittlerweile den Scripting Guy...
da steht doch fast alles schwarz auf weiss...
We’re just searching for all the user accounts (objectCategory = ‘user’) that have a samAccountName equal to .....
das bisschen umstricken schaffst du doch face-wink

If UserExists
- so macht der Guy das aber in deinem verlinkten link nicht - denn das geht auch nicht...
Einfach "wild" irgendwelche Befehle erfinden...
koluschkiB
koluschkiB 10.06.2010 um 12:10:12 Uhr
Goto Top
Du kennst doch mittlerweile den
[http://blogs.technet.com/b/heyscriptingguy/archive/2006/05/16/how-can-i-use-a-script-to-create-a-sequential-series-of-user-accounts.aspx

Ich will keinen Zahl die hinten dran gehangen wird... zb Maulwurf666 oder sowas, das war auch nicht das wonach ich gefragt habe.
Ich suche einfach nen Befehl, der Überprüft ob der User existiert

Das
If UserExists
nicht geht ist mir klar, um das festzustellen erfordert es auch keine großen Programmierküsnte face-wink
---> Script straten und zack kommt auch die Fehlermeldung

Es muss doch ne Möglichkeit geben es einfach und unkompliziert in wenigen Zeilen zu realisieren?!

Gruß und Danke

koluschkiB
60730
60730 10.06.2010 um 12:55:57 Uhr
Goto Top
Zitat von @koluschkiB:
Ich will keinen Zahl die hinten dran gehangen wird... zb Maulwurf666 oder sowas, das war auch nicht das wonach ich gefragt habe.
Ich suche einfach nen Befehl, der Überprüft ob der User existiert..

Woran denkst du erkennt man, ob es einen User gibt?

Rischdisch - der samAccountName ist bereits vergeben...

Gruß
Edi.Pfisterer
Edi.Pfisterer 10.06.2010 um 13:37:47 Uhr
Goto Top
Hallo kolouschki!

Was TimoBeil damit meint:
Du brauchst ein Skript, das innerhalb Deiner User überprüft, obs jemanden gibt, der so heisst wie der, den Du anlegen möchtest...

der entsprechende Code im von ihm angeführten Link ist:

objCommand.CommandText = _
    "SELECT AdsPath FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _  
        "AND samAccountName = '" & strSearchName & "'"  
Set objRecordSet = objCommand.Execute

If objRecordset.RecordCount = 0 then
' User ist noch nicht vorhanden  
end if
strSearchName ist der von dir neuanzulegende User, eh klar face-wink

Hoffe, Dir etwas auf die Sprünge geholfen zu haben...
lg
Markus68
Markus68 10.06.2010 um 13:57:42 Uhr
Goto Top
Hy

die untenstehende Funktion sollte dir weiterhelfen.

gruss

Function GetCurrentRootDse()
	Dim objRootDse
	Set objRootDse = GetObject("LDAP://RootDSE")  
	GetCurrentRootDse = "LDAP://" & objRootDSE.Get("defaultNamingContext")  
	Set objRootDse = Nothing
End Function

Function QueryAD(strRootDse,strSamAccount,strScope) 
	Dim objConnection,objCommand,objRecordSet
	Set objConnection = CreateObject("ADODB.Connection")  
	objConnection.Open "Provider=ADsDSOObject;"  
	Set objCommand = CreateObject("ADODB.Command")  
	objCommand.ActiveConnection = objConnection
	objCommand.CommandText="<"&strRootDse&">;"&"(&(objectClass=user)(samAccountname=" & strSamAccount & "))"&";samAccountName;"&strScope  
	Set objRecordSet = objCommand.Execute
	If objRecordSet.RecordCount > 0 Then
		QueryAD=True
	Else 
		QueryAD=False
	End If
	objRecordSet.Close
	objConnection.Close
	Set objConnection = Nothing
	Set objCommand = Nothing
	Set objRecordSet = Nothing 
End Function


If QueryAD(GetCurrentRootDse,"JohnDoe","subtree") = True Then  
								'+-------> JohnDoe mit LoginName ersetzen  
	WScript.Echo "Benutzer existiert bereits"  
Else 
	WScript.Echo "Benutzer existert nicht"  
End If
koluschkiB
koluschkiB 10.06.2010 um 14:00:16 Uhr
Goto Top
Hey Timo & Edi,

ich hab nicht dran gedacht, dass er den samAccountName checkt. woher auch?!

nun ja:

hab denn code denn Edi mir gab, so um gebastelt, aber es klappt nicht face-sad

objCommand.CommandText = _
	"SELECT AdsPath FROM 'LDAP://dc=testAD,dc=int' WHERE objectCategory='user' " & _  
	"AND samAccountName = '" & Nachname & "'"  
Set objRecordSet = objCommand.Execute

If objRecordset.RecordCount = 0 then
' User ist noch nicht vorhanden  
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 "userPrincipalName", left(Vorname,3) & left(nachname,2) & "@testAD.int"  
objUser.SetInfo
objUser.SetPassword Passwort
objUser.Put "userAccountControl", 544  
objUser.Put "pwdLastSet", 0  
objUser.SetInfo
'Log-Datei mit Text füllen  
logtext.WriteLine("Der Benutzer " &Vorname &" " &Nachname& " wurde im AD angelegt")  
End If

Ich hab das objekt in den variablen angelgt "objCommand" und wenn ich das script ausführe kriege die Fehlermeldung

Hier direkt in Zeile 1 ----> Objekt erforderlich: "

ich werde nicht schlau draus, wieso. es sind doch alle Zeichen da. Wieso macht das Ding so Doof?!

Gruß und Danke für eure Hilfe

KoluschkiB
koluschkiB
koluschkiB 10.06.2010 um 14:08:31 Uhr
Goto Top
Hey Markus

die untenstehende Funktion sollte dir weiterhelfen.

Ja ne Funktion, wenn ich das jetzt richtg verstanden habe. einfach Diese Funktion in meinen Quellcode kopieren/ die Zeilen die bei mir den User anlegen überschrieben? richtig?

Hab ich gemacht und gleich in der 1. Zeile der Function haut er mir nen Syntaxfehler raus.

mach ich irgendwas falsch?

gruß und danke

koluschkiB
Biber
Biber 10.06.2010 um 14:18:16 Uhr
Goto Top
[OT]

Zitat von @koluschkiB:----
Hab ich gemacht und gleich in der 1. Zeile der Function haut er mir nen Syntaxfehler raus.
mach ich irgendwas falsch?

Ach was...
Liegt bestimmt an der Wärme heute.
[/OT]
koluschkiB
koluschkiB 10.06.2010 um 14:33:26 Uhr
Goto Top
Zitat von @Biber:
[OT]

>
Zitat von @koluschkiB:> ----
> Hab ich gemacht und gleich in der 1. Zeile der Function haut er mir nen Syntaxfehler raus.
> mach ich irgendwas falsch?

Ach was...
Liegt bestimmt an der Wärme heute.
[/OT]


JAJA bestimmt face-wink
Markus68
Markus68 10.06.2010 um 14:54:08 Uhr
Goto Top
Hoi koluschkiB

Kannst du bitte den ganzen Code raufstellen? Ich denke du liest von irgendeiner Quelle
die daten der Bentuzer ein welche erstellt werden sollen.

Gruss
Markus
koluschkiB
koluschkiB 10.06.2010 um 15:07:07 Uhr
Goto Top
Hey Markus

hier der gesamte Quellcode:

Option Explicit

'Variablen des gesamten Scripts werden hier in diesen 3 Zeilen Deklariert  
Dim OU, objDomain, objOU, objUser, objGroup, WsHShell, CMD
Dim fso, f, Zeile, Feld, Vorname, Nachname, Abteilung, i, Passwort, Abfall, objFile, logfile, errfile, logText, errtext
Dim objFolder, strComputer, objWMIService, objNewShare, errReturn, PermL1
Const ForAppending = 8


'Organisationseinheit im AD wird gesetzt (benutzer)  
OU = "cn=users,dc=testad,dc=int"  
Set objOU = GetObject("LDAP://" & OU)  

'Werte für die Freigegebenen Ordner, gesharte Dateien sowie Maximal Anzahl gleichzeitiger Zugriffe  
Dim File_Share
File_Share = 0
Dim MAXIMUM_CONNECTIONS
MAXIMUM_CONNECTIONS = 25


'Verbidnung zum WMI wird hergestellt (Root-Verzeichnis)  
strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
Set objNewShare = objWMIService.Get("Win32_Share")  

'Die Datei mit allen Benutzerangaben wird geladen  
Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.OpenTextFile("c:\user.csv",1,0)  

IF fso.FolderExists("C:\Helpdesk") then  
		Set objFolder = fso.GetFolder("C:\Helpdesk")  
ELSE
Set objFolder = fso.CreateFolder("C:\Helpdesk")  
Wscript.Echo "Helpdeskordner wurde auf c:\ angelegt, in Ihm befindet sich die gesamte Doku!"  
End if

'1.Zeile der .csv Datei wird Übersprungen  
Abfall = f.Readline   ' also die 1. Zeile    
Do while not f.AtEndOfStream       'statt AtEndOfLine  

'Die Einzelnen Felder der .csv Datei werden gesetzt und zugeordnet  
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)  


'Variable zu Erstellung des Anmeldepassworts für die 1. Anmeldung   
Passwort = left(Vorname,3)&left(Nachname,2)&"1234%"  
Passwort = LCase(passwort)

Set logfile = fso.CreateTextFile("C:\Helpdesk\" &Nachname&".log")  
logfile.Close

IF fso.FileExists("C:\Helpdesk\error.log") then  
		Set objFile = fso.GetFile("C:\Helpdesk\error.log")  
errtext.Close
ELSE
Set errfile = fso.CreateTextFile("C:\Helpdesk\Error.log")  
errfile.Close
End if


Set logtext = fso.OpenTextFile _
("C:\Helpdesk\"&Nachname&".log", ForAppending, True)  
Set errtext = fso.OpenTextFile _
("C:\Helpdesk\error.log", ForAppending, True)  

'Infos für das AD, die dem User in den AD Eigenschaften zugeordnet werden  
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 "userPrincipalName", left(Vorname,3) & left(nachname,2) & "@testAD.int"  
objUser.SetInfo
objUser.SetPassword Passwort
objUser.Put "userAccountControl", 544  
objUser.Put "pwdLastSet", 0  
objUser.SetInfo
'Log-Datei mit Text füllen  
logtext.WriteLine("Der Benutzer " &Vorname &" " &Nachname& " wurde im AD angelegt")  

'Die Function zur Erstellung der Gruppen aus Feld 3-7 wird aufgerufen und die Richtigen benutzer werden Zugeordnet  
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

logtext.WriteLine("und ist Mitglied folgender Gruppen: 1." &Feld(3) &" 2. " &Feld(4) &" 3. " &Feld(5) &" 4. " &Feld(6) &" 5. " &Feld(7))  
logtext.WriteLine("Der Loginname des Benutzers lautet: " &Nachname)  
logtext.WriteLine("Der Benutzer hat folgendes Passwort: " &Passwort)  

'Oberordner wird auf c:\ angelegt  
IF fso.FolderExists("C:\Freigaben") then  
         Set objFolder = fso.GetFolder("C:\Freigaben")  
ELSE
Set objFolder = fso.CreateFolder("C:\Freigaben")  
Wscript.Echo "Der Oberordner C:\Freigaben wurde angelegt! In Ihm befinden sich die Benutzerordner!"  
END IF


'Benutzer spezifischer Ordner wird angelegt  
IF fso.FolderExists("C:\Freigaben\" & Nachname) then  
         'Msgbox ("Der Ordner mit dem Namen "&Nachname&" existiert bereits!")  
		 errtext.WriteLine("Der Ordner " &Nachname& " existiert bereits und kann nicht angelegt werden")  
         Set objFolder = fso.GetFolder("C:\Freigaben\" & Nachname)  
	
ELSE
Set objFolder = fso.CreateFolder("C:\Freigaben\" & Nachname)  
END IF

errReturn = objNewShare.Create _
    ("C:\Freigaben\" & Nachname, ""&Nachname, File_Share, _  
    MAXIMUM_CONNECTIONS, "Benutzerordner")  

	'WSH Shell für die Erstellung der Zugriffsrechte wird Erstellt  
Set WshShell = WScript.CreateObject("WScript.Shell")     

'Ordnerzugriffe werden gesetzt (Admin= Voll, Inhaber= Voll)  
PermL1 = "Administratoren:F " & Nachname & ":F"    
CMD = "cmd /c echo j|cacls C:\Freigaben\" & Nachname & " /G " & PermL1  
WshShell.Run CMD, 0, 1
Loop

'Function für die Erstellung der Gruppen  
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

logtext.Close
errtext.Close

Danke für die hilfe

koluschkiB
koluschkiB
koluschkiB 10.06.2010 um 15:16:38 Uhr
Goto Top
Hab noch ne andere Idee gehabt,
schaut euch die mal an ob das evtl. gehen würde...

If err.Number = 80071392 Then
errtext.WriteLine("Der Benutzer " &Nachname& " existiert bereits und kann nicht angelegt werden")  
On Error Resume Next
Else
'Infos für das AD, die dem User in den AD Eigenschaften zugeordnet werden  
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 "userPrincipalName", left(Vorname,3) & left(nachname,2) & "@testAD.int"  
objUser.SetInfo
objUser.SetPassword Passwort
objUser.Put "userAccountControl", 544  
objUser.Put "pwdLastSet", 0  
objUser.SetInfo
'Log-Datei mit Text füllen  
logtext.WriteLine("Der Benutzer " &Vorname &" " &Nachname& " wurde im AD angelegt")  
End if

80071392 ist der Fehlercode der ir angezeigt wird, wenn das Objekt (Benutzer) vorhanden ist.

Danke für alle Tipps

koluschkiB
Markus68
Markus68 10.06.2010 um 16:04:50 Uhr
Goto Top
Sorry hat etwas gedauert....Bei mir lief das Script ohne Probleme durch

Cu

Option Explicit

'Variablen des gesamten Scripts werden hier in diesen 3 Zeilen Deklariert  
Dim OU, objDomain, objOU, objUser, objGroup, WsHShell, CMD
Dim fso, f, Zeile, Feld, Vorname, Nachname, Abteilung, i, Passwort, Abfall, objFile, logfile, errfile, logText, errtext
Dim objFolder, strComputer, objWMIService, objNewShare, errReturn, PermL1
Const ForAppending = 8


'Organisationseinheit im AD wird gesetzt (benutzer)  
OU = "cn=users,dc=testad,dc=int"  
Set objOU = GetObject("LDAP://" & OU)  

'Werte für die Freigegebenen Ordner, gesharte Dateien sowie Maximal Anzahl gleichzeitiger Zugriffe  
Dim File_Share
File_Share = 0
Dim MAXIMUM_CONNECTIONS
MAXIMUM_CONNECTIONS = 25


'Verbidnung zum WMI wird hergestellt (Root-Verzeichnis)  
strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
Set objNewShare = objWMIService.Get("Win32_Share")  

'Die Datei mit allen Benutzerangaben wird geladen  
Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.OpenTextFile("c:\user.csv",1,0)  

IF fso.FolderExists("C:\Helpdesk") then  
		Set objFolder = fso.GetFolder("C:\Helpdesk")  
ELSE
Set objFolder = fso.CreateFolder("C:\Helpdesk")  
Wscript.Echo "Helpdeskordner wurde auf c:\ angelegt, in Ihm befindet sich die gesamte Doku!"  
End if

'1.Zeile der .csv Datei wird Übersprungen  
Abfall = f.Readline   ' also die 1. Zeile    
Do while not f.AtEndOfStream       'statt AtEndOfLine  

'Die Einzelnen Felder der .csv Datei werden gesetzt und zugeordnet  
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)  





'Variable zu Erstellung des Anmeldepassworts für die 1. Anmeldung   
Passwort = left(Vorname,3)&left(Nachname,2)&"1234%"  
Passwort = LCase(passwort)








If QueryAD(GetCurrentRootDse,Nachname,"subtree") = True Then  
								'+-------> JohnDoe mit LoginName ersetzen  
	WScript.Echo "Benutzer existiert bereits"  
Else 
	Set logfile = fso.CreateTextFile("C:\Helpdesk\" &Nachname&".log")  
	logfile.Close

	IF fso.FileExists("C:\Helpdesk\error.log") then  
		Set objFile = fso.GetFile("C:\Helpdesk\error.log")  
		'errtext.Close  
	Else
		Set errfile = fso.CreateTextFile("C:\Helpdesk\Error.log")  
		'errfile.Close  
	End If


	Set logtext = fso.OpenTextFile _
	("C:\Helpdesk\"&Nachname&".log", ForAppending, True)  
	Set errtext = fso.OpenTextFile _
	("C:\Helpdesk\error.log", ForAppending, True)  
	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 "userPrincipalName", left(Vorname,3) & left(nachname,2) & "@testAD.int"  
	objUser.SetInfo
	objUser.SetPassword Passwort
	objUser.Put "userAccountControl", 544  
	objUser.Put "pwdLastSet", 0  
	objUser.SetInfo
	'Log-Datei mit Text füllen  
	logtext.WriteLine("Der Benutzer " &Vorname &" " &Nachname& " wurde im AD angelegt")  

	'Die Function zur Erstellung der Gruppen aus Feld 3-7 wird aufgerufen und die Richtigen benutzer werden Zugeordnet  
	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

	logtext.WriteLine("und ist Mitglied folgender Gruppen: 1." &Feld(3) &" 2. " &Feld(4) &" 3. " &Feld(5) &" 4. " &Feld(6) &" 5. " &Feld(7))  
	logtext.WriteLine("Der Loginname des Benutzers lautet: " &Nachname)  
	logtext.WriteLine("Der Benutzer hat folgendes Passwort: " &Passwort)  

	'Oberordner wird auf c:\ angelegt  
	If fso.FolderExists("C:\Freigaben") Then  
    	Set objFolder = fso.GetFolder("C:\Freigaben")  
	Else
		Set objFolder = fso.CreateFolder("C:\Freigaben")  
		Wscript.Echo "Der Oberordner C:\Freigaben wurde angelegt! In Ihm befinden sich die Benutzerordner!"  
	END If


	'Benutzer spezifischer Ordner wird angelegt  
	IF fso.FolderExists("C:\Freigaben\" & Nachname) Then  
    	'Msgbox ("Der Ordner mit dem Namen "&Nachname&" existiert bereits!")  
		 errtext.WriteLine("Der Ordner " &Nachname& " existiert bereits und kann nicht angelegt werden")  
         Set objFolder = fso.GetFolder("C:\Freigaben\" & Nachname)  
	
	Else
	Set objFolder = fso.CreateFolder("C:\Freigaben\" & Nachname)  
	END If

	errReturn = objNewShare.Create _
    ("C:\Freigaben\" & Nachname, ""&Nachname, File_Share, _  
    MAXIMUM_CONNECTIONS, "Benutzerordner")  

	'WSH Shell für die Erstellung der Zugriffsrechte wird Erstellt  
	Set WshShell = WScript.CreateObject("WScript.Shell")     

	'Ordnerzugriffe werden gesetzt (Admin= Voll, Inhaber= Voll)  
	PermL1 = "Administratoren:F " & Nachname & ":F"    
	CMD = "cmd /c echo j|cacls C:\Freigaben\" & Nachname & " /G " & PermL1  
	WshShell.Run CMD, 0, 1
	logtext.Close
	errtext.Close
End If
Loop

'Function für die Erstellung der Gruppen  
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

Function GetCurrentRootDse()
	Dim objRootDse
	Set objRootDse = GetObject("LDAP://RootDSE")  
	GetCurrentRootDse = "LDAP://" & objRootDSE.Get("defaultNamingContext")  
	Set objRootDse = Nothing
End Function

Function QueryAD(strRootDse,strSamAccount,strScope) 
	Dim objConnection,objCommand,objRecordSet
	Set objConnection = CreateObject("ADODB.Connection")  
	objConnection.Open "Provider=ADsDSOObject;"  
	Set objCommand = CreateObject("ADODB.Command")  
	objCommand.ActiveConnection = objConnection
	objCommand.CommandText="<"&strRootDse&">;"&"(&(objectClass=user)(samAccountname=" & strSamAccount & "))"&";samAccountName;"&strScope  
	Set objRecordSet = objCommand.Execute
	If objRecordSet.RecordCount > 0 Then
		QueryAD=True
	Else 
		QueryAD=False
	End If
	objRecordSet.Close
	objConnection.Close
	Set objConnection = Nothing
	Set objCommand = Nothing
	Set objRecordSet = Nothing 
End Function
koluschkiB
koluschkiB 10.06.2010 um 16:57:54 Uhr
Goto Top
Hey Markus,

kein problem wegen der zeit bin für jede hilfe dankbar die mir geboten wird.
Mit den Paar zeilen die du mir geschikct hast, war es abe nicht getan, sind doch viel mehr zeilen als in meinem aber egal.

Ja es läuft problemlos durch. zumindest wenn der Helpdeskordner mit den .log files nicht existiert, ansonsten kommt die bekannte Meldung
Objekt Erforderlich: " und das bei dem befehl errtext.Close
Also ich wüsste nict warum dort "" sein sollten

was ich auch gesehen habe ist, dass wenn er es check das der User bereits existiert, schreibt er es nicht in die Error.log rein. das sie unter else erst erstellt wird?!

habs wie folgt jetzt umgebaut. die .lof files sollen so oder so erstellt werden, also habe ich sie aus der Schelife rausgenommen.

Option Explicit

'Variablen des gesamten Scripts werden hier in diesen 3 Zeilen Deklariert  
Dim OU, objDomain, objOU, objUser, objGroup, WsHShell, CMD
Dim fso, f, Zeile, Feld, Vorname, Nachname, Abteilung, i, Passwort, Abfall, objFile, logfile, errfile, logText, errtext
Dim objFolder, strComputer, objWMIService, objNewShare, errReturn, PermL1
Const ForAppending = 8


'Organisationseinheit im AD wird gesetzt (benutzer)  
OU = "cn=users,dc=testad,dc=int"  
Set objOU = GetObject("LDAP://" & OU)  

'Werte für die Freigegebenen Ordner, gesharte Dateien sowie Maximal Anzahl gleichzeitiger Zugriffe  
Dim File_Share
File_Share = 0
Dim MAXIMUM_CONNECTIONS
MAXIMUM_CONNECTIONS = 25


'Verbidnung zum WMI wird hergestellt (Root-Verzeichnis)  
strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
Set objNewShare = objWMIService.Get("Win32_Share")  

'Die Datei mit allen Benutzerangaben wird geladen  
Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.OpenTextFile("c:\user.csv",1,0)  

IF fso.FolderExists("C:\Helpdesk") then  
		Set objFolder = fso.GetFolder("C:\Helpdesk")  
ELSE
Set objFolder = fso.CreateFolder("C:\Helpdesk")  
Wscript.Echo "Helpdeskordner wurde auf c:\ angelegt, in Ihm befindet sich die gesamte Doku!"  
End if

'1.Zeile der .csv Datei wird Übersprungen  
Abfall = f.Readline   ' also die 1. Zeile    
Do while not f.AtEndOfStream       'statt AtEndOfLine  

'Die Einzelnen Felder der .csv Datei werden gesetzt und zugeordnet  
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)  


'Variable zu Erstellung des Anmeldepassworts für die 1. Anmeldung   
Passwort = left(Vorname,3)&left(Nachname,2)&"1234%"  
Passwort = LCase(passwort)

if fso.FileExists("C:\Helpdesk\" &Nachname&".log") Then  
	Set objFile = fso.GetFile("C:\Helpdesk\" &Nachname&".log")  
	'logtext.Close  
	ELSE
	Set logfile = fso.CreateTextFile("C:\Helpdesk\" &Nachname&".log")  
	'logfile.Close  
End If	

IF fso.FileExists("C:\Helpdesk\error.log") then  
	Set objFile = fso.GetFile("C:\Helpdesk\error.log")  
	'errtext.Close  
	Else
	Set errfile = fso.CreateTextFile("C:\Helpdesk\Error.log")  
	'errfile.Close  
End If

If QueryAD(GetCurrentRootDse,Nachname,"subtree") = True Then  
	WScript.Echo "Benutzer existiert bereits"  
Else
	Set logtext = fso.OpenTextFile _
	("C:\Helpdesk\"&Nachname&".log", ForAppending, True)  
	Set errtext = fso.OpenTextFile _
	("C:\Helpdesk\error.log", ForAppending, True)  
	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 "userPrincipalName", left(Vorname,3) & left(nachname,2) & "@testAD.int"  
	objUser.SetInfo
	objUser.SetPassword Passwort
	objUser.Put "userAccountControl", 544  
	objUser.Put "pwdLastSet", 0  
	objUser.SetInfo
	'Log-Datei mit Text füllen  
	logtext.WriteLine("Der Benutzer " &Vorname &" " &Nachname& " wurde im AD angelegt")  

	'Die Function zur Erstellung der Gruppen aus Feld 3-7 wird aufgerufen und die Richtigen benutzer werden Zugeordnet  
	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

	logtext.WriteLine("und ist Mitglied folgender Gruppen: 1." &Feld(3) &" 2. " &Feld(4) &" 3. " &Feld(5) &" 4. " &Feld(6) &" 5. " &Feld(7))  
	logtext.WriteLine("Der Loginname des Benutzers lautet: " &Nachname)  
	logtext.WriteLine("Der Benutzer hat folgendes Passwort: " &Passwort)  

	'Oberordner wird auf c:\ angelegt  
	If fso.FolderExists("C:\Freigaben") Then  
    	Set objFolder = fso.GetFolder("C:\Freigaben")  
	Else
		Set objFolder = fso.CreateFolder("C:\Freigaben")  
		Wscript.Echo "Der Oberordner C:\Freigaben wurde angelegt! In Ihm befinden sich die Benutzerordner!"  
	END If


	'Benutzer spezifischer Ordner wird angelegt  
	IF fso.FolderExists("C:\Freigaben\" & Nachname) Then  
    	'Msgbox ("Der Ordner mit dem Namen "&Nachname&" existiert bereits!")  
		 errtext.WriteLine("Der Ordner " &Nachname& " existiert bereits und kann nicht angelegt werden")  
         Set objFolder = fso.GetFolder("C:\Freigaben\" & Nachname)  
	
	Else
	Set objFolder = fso.CreateFolder("C:\Freigaben\" & Nachname)  
	END If

	errReturn = objNewShare.Create _
    ("C:\Freigaben\" & Nachname, ""&Nachname, File_Share, _  
    MAXIMUM_CONNECTIONS, "Benutzerordner")  

	'WSH Shell für die Erstellung der Zugriffsrechte wird Erstellt  
	Set WshShell = WScript.CreateObject("WScript.Shell")     

	'Ordnerzugriffe werden gesetzt (Admin= Voll, Inhaber= Voll)  
	PermL1 = "Administratoren:F " & Nachname & ":F"    
	CMD = "cmd /c echo j|cacls C:\Freigaben\" & Nachname & " /G " & PermL1  
	WshShell.Run CMD, 0, 1
	logtext.Close
	errtext.Close
End If
Loop

'Function für die Erstellung der Gruppen  
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

Function GetCurrentRootDse()
	Dim objRootDse
	Set objRootDse = GetObject("LDAP://RootDSE")  
	GetCurrentRootDse = "LDAP://" & objRootDSE.Get("defaultNamingContext")  
	Set objRootDse = Nothing
End Function

Function QueryAD(strRootDse,strSamAccount,strScope) 
	Dim objConnection,objCommand,objRecordSet
	Set objConnection = CreateObject("ADODB.Connection")  
	objConnection.Open "Provider=ADsDSOObject;"  
	Set objCommand = CreateObject("ADODB.Command")  
	objCommand.ActiveConnection = objConnection
	objCommand.CommandText="<"&strRootDse&">;"&"(&(objectClass=user)(samAccountname=" & strSamAccount & "))"&";samAccountName;"&strScope  
	Set objRecordSet = objCommand.Execute
	If objRecordSet.RecordCount > 0 Then
		QueryAD=True
	Else 
		QueryAD=False
	End If
	objRecordSet.Close
	objConnection.Close
	Set objConnection = Nothing
	Set objCommand = Nothing
	Set objRecordSet = Nothing 
End Function

leider kommt n fehler
in Zeile 65
Objekt fehlt: "

es nervt schon langsam. am liebsten würde ich einfach On Error Resume Next rein hauen und dann solls auch gewesen sein. Aber in der Aufgabe heisst es. Fehler sollen Dokumentiert werden...

kannst Bitte mal drüber schauen?
vielleicht siehst du den Fehler, wieso er ausgrechnet so einen Fehler mit "" raushaut

gruß und Danke

koluschkiB
bastla
bastla 10.06.2010 um 20:24:31 Uhr
Goto Top
Hallo koluschkiB!

Das ganze Herumgekaspere mit "FileExists" für die Logs ist doch unnötig - wenn Du einfach (am Beispiel des Errorlogs)
Set errtext = fso.OpenTextFile("C:\Helpdesk\error.log", ForAppending, True)
verwendest, wird die gewünschte Datei im Anfüge-Modus ("ForAppending") geöffnet - egal, ob bereits vorhanden, oder (wegen des "True") erst nach (automatischer) Erstellung ...

Falls Du nicht anfügen willst, genügt ein "CreateTextFile", um die Datei neu zu erstellen (unabhängig davon, ob es schon eine gleichnamige Datei gibt).

Grüße
bastla

P.S.: Freut mich, dass Du "Option Explicit" verwendest ... face-smile
Biber
Biber 10.06.2010 um 22:14:01 Uhr
Goto Top
Moin koluschkiB,

wie bastla schon sagte...
Zitat von @bastla:
Das ganze Herumgekaspere mit "FileExists" für die Logs ist doch unnötig -
Wenn du das mal wegschmelzen würdest, sind auch die Fehler weg.
P.S.: Freut mich, dass Du "Option Explicit" verwendest ... face-smile
Da würde ich noch einen Schritt weiter gehen mit der Erklärung.

"Option Explicit" stellt zumindest sicher, dass alle verwendeten Variablen auch deklariert sein müssen.
Können natürlich auch mehr deklariert worden sein, als verwendet werden... aber hey! Kostet ja das Gleiche.
Aber: wenn es so ist, dass alle Variablen, die evtl mal im Programmfluss "leer" bleiben oder "kein Object enthalten" wider Erwarten...
--> dann müsstest du doch jede einzelne gatesverdammte Variable mit einem normalen Strg-F-Such-Handgriff finden können... jeweils vom ersten Auftreten (der Deklaration) angefangen.

Mach das doch mal... insbesondere verfolge mal die beiden Variablen "objFile" und "logfile".
Und was diese beiden in kurzen Existenz zugewiesen bekommen beziehungsweise öffnen und ob sie es jemals wieder schliessen.

... und stelle dir danach die selbstkritischen Fragen:
  • WhyTF sind einige objFile-Variablen "objFile" benamst und andere "logfile"? Und nicht z.B. "oFileErrorLog" und "oFileUserLog"?
  • WhyTF ist ausgerechnet an den Stellen, wo mal die, mal die andere Datei mal neu angelegt, mal zum weiterschreiben geöffnet wird und es durch die Copy&Pasterei ohnehin total tippfehlerträchtig ist keinerlei Kommentare?? Weil es da sofort lesbar und offensichtlich ist OHNE Kommentare??
  • WhatTHF reitet einen Coder, Variablennamen wie "CMD" zu verwenden ? Oder eine Variable MAXIMUM_CONNECTIONS gross zu schreiben (was eigentlich nur Const/Konstanten auszeichnet) ??
  • WhoTF hat die Einrückungen vorgenommen und nach welchen ästhetischen Gesichtspunkten? Stevie Wonder?

Der Tag wird kommen, an dem dein erstes Skript mal "produktiv" läuft.... über die Daten von 2000 Usern...
Rein statistisch sind da immer ein paar Prozent dabei, die wissen, wo du wohnst UND die schneller laufen können als du...

Grüße
Biber
bastla
bastla 10.06.2010 um 22:31:01 Uhr
Goto Top
... nur eine kurze Anmerkung zu
dann müsstest du doch jede einzelne gatesverdammte Variable mit einem normalen Strg-F-Such-Handgriff finden können
Noch besser: Verwende Notepad++ und mach einen Doppelklick auf die Variable ...

Grüße
bastla
koluschkiB
koluschkiB 11.06.2010 um 08:22:49 Uhr
Goto Top
Der Tag wird kommen, an dem dein erstes Skript mal "produktiv" läuft.... über die Daten von 2000 Usern...
Rein statistisch sind da immer ein paar Prozent dabei, die wissen, wo du wohnst UND die schneller laufen können als du...


Ist nicht mein erstes Script face-wink
Rein statistisch und auch allgemein gehen mir die paar Prozent der User, voll am Arsch vorbei und es ist mir egal ob die wissen wo ich wohne und schnelle laufen können face-smile
Ach so, mir ist es egal ob die Codes eingerückt sind oder nicht, da bricht mir schon kein Zacken aus der Krone.


Aber nichts für ungut, werde mir mal die ganzen Sachen die ihr hier momentan bemängelt anschauen und versuchen das beste draus zu machen.

Danke und Gruß

koluschkiB
koluschkiB
koluschkiB 11.06.2010 um 08:23:45 Uhr
Goto Top
Noch besser: Verwende Notepad++ und mach einen Doppelklick auf die Variable ...

Hab ich und nutze ich auch
Edi.Pfisterer
Edi.Pfisterer 11.06.2010, aktualisiert am 18.10.2012 um 18:42:29 Uhr
Goto Top
Hallo Biber!
Bin begeistert von Deinen WTF-Fragen, und möchte folgendes beitragen:

WhatTHF reitet einen Coder, Variablennamen wie "CMD" zu verwenden ?

frag am besten bastla, er ist der Coder, der geritten wurde face-wink
Der Teil stammt aus einer Anregung von mir, die ich hier gecopypastete, und dieser Baustein stammt wiederum aus einer Verbesserung von bastla...

face-wink
schönes Tagerl noch
60730
60730 11.06.2010 um 08:59:52 Uhr
Goto Top
Moin,

Zitat von @koluschkiB:

Der Tag wird kommen, an dem dein erstes Skript mal "produktiv" läuft.... über die Daten von 2000 Usern...
Rein statistisch sind da immer ein paar Prozent dabei, die wissen, wo du wohnst UND die schneller laufen können als du...

Ist nicht mein erstes Script face-wink

Yupp ist das vom Guy und anderen anderen....

Rein statistisch und auch allgemein gehen mir die paar Prozent der User, voll am Arsch vorbei und es ist mir egal ob die wissen wo ich wohne und schnelle laufen können face-smile

Vielen dank für die Informative Zeile - egal wieviele Smilies dran kleben.

Damit sind deine Probleme für mich nie wieder welche.
Denk mal drüber nach, welch "alte" x mal vorexerzierte Hüte du da aus dem Karton zauberst und wieviel "hin & her der ganze Larifarisalmon bis jetzt schon gebraucht hat.

Gruß
koluschkiB
koluschkiB 11.06.2010 um 09:15:19 Uhr
Goto Top
Hallo Freunde, hab ein paar Sachen befolgt und es geht auch.
Aber denoch hab ich ein Problem und keiner hier in emienr Nähe kann mir erklären warum das so ist

Wenn ich das script laufen lassen, zeigt es mir brav die MSGBOX an "Benutzer XY existiert"
Ich möchte dies aber auch in der Error.log festhalten, dass funktioniert auch so weit.
Es gibt aber ein Problem dabei, er überschriebt mir den Inhalt der Datei.

Ich hab 10 User die angelegt werden sollen, alle 10 sind natürlich schon im AD vorhanden. Kriege die MSGBOX er schreibt es in die .log datei.
Beim zweiten durchlauf, kommt die MSGbox erneut ABER er überschriebt die err.log.
Ich sehe also immer nur den letzten User der nicht angelegt werden konnte, die anderen 9 Writelines sind weg...
Ich weiss jetzt natürlich nicht, ob er die ganze datei Überschreibt oder einfach nur die Erste zeile der Error.log

Option Explicit

'Variablen des gesamten Scripts werden hier in diesen 3 Zeilen Deklariert  
Dim OU, objDomain, objOU, objUser, objGroup, WsHShell, CMD
Dim fso, f, Zeile, Feld, Vorname, Nachname, Abteilung, i, Passwort, Abfall, objFile, logfile, errfile, logText, errtext
Dim objFolder, strComputer, objWMIService, objNewShare, errReturn, PermL1
Const ForAppending = 8


'Organisationseinheit im AD wird gesetzt (benutzer)  
OU = "cn=users,dc=testad,dc=int"  
Set objOU = GetObject("LDAP://" & OU)  

'Werte für die Freigegebenen Ordner, gesharte Dateien sowie Maximal Anzahl gleichzeitiger Zugriffe  
Dim File_Share
File_Share = 0
Dim MAXIMUM_CONNECTIONS
MAXIMUM_CONNECTIONS = 25


'Verbidnung zum WMI wird hergestellt (Root-Verzeichnis)  
strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
Set objNewShare = objWMIService.Get("Win32_Share")  

'Die Datei mit allen Benutzerangaben wird geladen  
Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.OpenTextFile("c:\user.csv",1,0)  

IF fso.FolderExists("C:\Helpdesk") then  
		Set objFolder = fso.GetFolder("C:\Helpdesk")  
ELSE
Set objFolder = fso.CreateFolder("C:\Helpdesk")  
Wscript.Echo "Helpdeskordner wurde auf c:\ angelegt, in Ihm befindet sich die gesamte Doku!"  
End if

'1.Zeile der .csv Datei wird Übersprungen  
Abfall = f.Readline   ' also die 1. Zeile    
Do while not f.AtEndOfStream       'statt AtEndOfLine  

'Die Einzelnen Felder der .csv Datei werden gesetzt und zugeordnet  
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)  


'Variable zu Erstellung des Anmeldepassworts für die 1. Anmeldung   
Passwort = left(Vorname,3)&left(Nachname,2)&"1234%"  
Passwort = LCase(passwort)


Set logfile = fso.CreateTextFile("C:\Helpdesk\" &Nachname&".log")  
logfile.Close

Set errfile = fso.CreateTextFile("C:\Helpdesk\Error.log")  
errfile.Close


If QueryAD(GetCurrentRootDse,Nachname,"subtree") = True Then  
	Set errtext = fso.OpenTextFile _
	("C:\Helpdesk\error.log", ForAppending, True)  
	errtext.WriteLine("Der Benutzer " &Nachname & " existiert bereits und kann nicht angelegt werden")  
	errtext.Close
	WScript.Echo "Benutzer " &Vorname & " " & Nachname & " existiert bereits"  

Else
	Set logtext = fso.OpenTextFile _
	("C:\Helpdesk\"&Nachname&".log", ForAppending, True)  
	Set errtext = fso.OpenTextFile _
	("C:\Helpdesk\error.log", ForAppending, True)  
	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 "userPrincipalName", left(Vorname,3) & left(nachname,2) & "@testAD.int"  
	objUser.SetInfo
	objUser.SetPassword Passwort
	objUser.Put "userAccountControl", 544  
	objUser.Put "pwdLastSet", 0  
	objUser.SetInfo
	'Log-Datei mit Text füllen  
	logtext.WriteLine("Der Benutzer " &Vorname &" " &Nachname& " wurde im AD angelegt")  

	'Die Function zur Erstellung der Gruppen aus Feld 3-7 wird aufgerufen und die Richtigen benutzer werden Zugeordnet  
	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

	logtext.WriteLine("und ist Mitglied folgender Gruppen: 1." &Feld(3) &" 2. " &Feld(4) &" 3. " &Feld(5) &" 4. " &Feld(6) &" 5. " &Feld(7))  
	logtext.WriteLine("Der Loginname des Benutzers lautet: " &Nachname)  
	logtext.WriteLine("Der Benutzer hat folgendes Passwort: " &Passwort)  

	'Oberordner wird auf c:\ angelegt  
	If fso.FolderExists("C:\Freigaben") Then  
    	Set objFolder = fso.GetFolder("C:\Freigaben")  
	Else
		Set objFolder = fso.CreateFolder("C:\Freigaben")  
		Wscript.Echo "Der Oberordner C:\Freigaben wurde angelegt! In Ihm befinden sich die Benutzerordner!"  
	END If


	'Benutzer spezifischer Ordner wird angelegt  
	IF fso.FolderExists("C:\Freigaben\" & Nachname) Then  
    	'Msgbox ("Der Ordner mit dem Namen "&Nachname&" existiert bereits!")  
		 errtext.WriteLine("Der Ordner " &Nachname& " existiert bereits und kann nicht angelegt werden")  
         Set objFolder = fso.GetFolder("C:\Freigaben\" & Nachname)  
	
	Else
	Set objFolder = fso.CreateFolder("C:\Freigaben\" & Nachname)  
	END If

	errReturn = objNewShare.Create _
    ("C:\Freigaben\" & Nachname, ""&Nachname, File_Share, _  
    MAXIMUM_CONNECTIONS, "Benutzerordner")  

	'WSH Shell für die Erstellung der Zugriffsrechte wird Erstellt  
	Set WshShell = WScript.CreateObject("WScript.Shell")     

	'Ordnerzugriffe werden gesetzt (Admin= Voll, Inhaber= Voll)  
	PermL1 = "Administratoren:F " & Nachname & ":F"    
	CMD = "cmd /c echo j|cacls C:\Freigaben\" & Nachname & " /G " & PermL1  
	WshShell.Run CMD, 0, 1
	logtext.Close
	errtext.Close
End If
Loop

'Function für die Erstellung der Gruppen  
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

Function GetCurrentRootDse()
	Dim objRootDse
	Set objRootDse = GetObject("LDAP://RootDSE")  
	GetCurrentRootDse = "LDAP://" & objRootDSE.Get("defaultNamingContext")  
	Set objRootDse = Nothing
End Function

Function QueryAD(strRootDse,strSamAccount,strScope) 
	Dim objConnection,objCommand,objRecordSet
	Set objConnection = CreateObject("ADODB.Connection")  
	objConnection.Open "Provider=ADsDSOObject;"  
	Set objCommand = CreateObject("ADODB.Command")  
	objCommand.ActiveConnection = objConnection
	objCommand.CommandText="<"&strRootDse&">;"&"(&(objectClass=user)(samAccountname=" & strSamAccount & "))"&";samAccountName;"&strScope  
	Set objRecordSet = objCommand.Execute
	If objRecordSet.RecordCount > 0 Then
		QueryAD=True
	Else 
		QueryAD=False
	End If
	objRecordSet.Close
	objConnection.Close
	Set objConnection = Nothing
	Set objCommand = Nothing
	Set objRecordSet = Nothing 
End Function

kann mir einer evtl. sagen woran es liegt? bzw. woruaf ich achten muss?

gruß und danke

koluschkiB
koluschkiB
koluschkiB 11.06.2010 um 09:23:07 Uhr
Goto Top
Damit sind deine Probleme für mich nie wieder welche.

??? Die Standard Antwort zu meinen Fragen war doch eh " Hast du schon die Scipt56.* geschaut? dort findest du alles"
Wenn es doch so einfach ist und alles in dieser heiligen Datei drin steht, da kann man sich doch das Forum hier schenken und einfach direkt auf der Start Seite eine riesen DOWNLOAD BUTTON setzen um diese Datei runter zu laden, spart Ressourcen, eure Nerven und weiss der Teufel was noch...
koluschkiB
koluschkiB 11.06.2010 um 09:53:48 Uhr
Goto Top
Problem gelöst!!!

Set errfile = fso.CreateTextFile("C:\Helpdesk\Error.log")  
errfile.Close

stand an der falschen stellen!

Danke an alle Hilfen und Mitwirkende

koluschkiB
Edi.Pfisterer
Edi.Pfisterer 11.06.2010 um 10:10:06 Uhr
Goto Top
Hallo koluschkiB!
Du weisst, ich bin einer der Dir gut gesinnten, aber, in aller Ehrlichkeit:

Rein statistisch und auch allgemein gehen mir die paar Prozent der User, voll am Arsch vorbei
hättest Du dir sparen können und eine entsprechende Entschuldigung hätte so manches Gemüt besänftigt...
Cholerik ist das Eine, Pöbelei etwas Anderes...

und: Wenn einem Admin die User am Axxxxx vorbei gehen, dann sollter er sich ohnehin besser einen Job als Versicherungsmathematiker im BackBackBackoffice suchen...
Ist zumindest meine bescheidene Meinung. Das Wort Dienstleistung hat eine tiefere Bedeutung...

lg
koluschkiB
koluschkiB 11.06.2010 um 10:36:55 Uhr
Goto Top
Hey Edi,

hast ja nicht unrecht damit. Aber es nervt immer zu lesen, schau doch in die Hilfedatei rein, dort findest die lösung... Ich schaue doch da rein finde aber nichts brauchbares oder es ist einfach so blöd umschrieben, dass es für mich eben absolut nicht nachvollziehbar ist, es ist toll zu lesen, wie man Ordner usw anlegt. dort steht aber nicht geschrieben wo man in einem bestimmten Script einen befehl setzen muss damit es auch Funktioniert. Das Checken einige eben nicht.
Die denken, ahh er schreibt Scripte, er muss es können... So ist es aber nicht, ich kann mich Null damit anfreunden und wenn ich mich für den Beruf Anwendungsentwickler entschieden hätte. hätte ich schon längst gekündigt und wäre Versicherungsmathematiker geworden. Da gibt es keinen Fehlermeldungen die keinen Sinn für einen ergeben. wie zb "Objekt Erforderlich: " " verdammt in einem befehl errtext.Close, wo soll ich bitte dort ein " reinsetzen?!
Wenn man sich den ganzen Tag mit dieser Materie beschäftigt, weiss man eben worauf es ankommt. Bei mir ist es eben nicht der fall und es wird einem dann vorgehalten... Wir geben keine lösungen nur Hilfe, ja nur das ich die Hilfe nicht umsetzen kann, dass Interessiert niemanden

aber denoch danke ich euch für alle eure Hilfen, die mir zur lösung meiner Aufgabe begetragen haben

koluschkiB
bastla
bastla 11.06.2010 um 10:57:10 Uhr
Goto Top
Hallo koluschkiB!
Die denken, ahh er schreibt Scripte, er muss es können...
Die meisten in Deinen Threads Helfenden wissen, dass Du Dich in Ausbildung befindest und sehen es gerades deshalb nicht als sinnvoll an, Dir (sofort) eine fertige Lösung zu servieren.
dort steht aber nicht geschrieben wo man in einem bestimmten Script einen befehl setzen muss damit es auch Funktioniert.
Es uns zum Vorwurf zu machen, dass Du (durch Deinen Ausbilder) überfordert bist, kann ich aber nicht akzeptieren: Den Kurs "Grundlagen der Programmierung" wirst Du nicht im Fernstudium bei "administrator.de" absolvieren können.
Wir geben keine lösungen nur Hilfe, ja nur das ich die Hilfe nicht umsetzen kann, dass Interessiert niemanden
Dass Dir im Gegensatz zu Deiner Behauptung eine Umsetzung doch gelingen kann, hat sich ja gezeigt ... face-smile

Grüße
bastla

P.S.: Ganz unabhängig vom Thema, und sogar wenn Du tatsächlich im "backesten" Office landen solltest: Die Formulierungen in manchen Deiner Wortmeldungen würde ich nicht einmal im Selbstgespräch, geschweige denn in geschriebener und (hier) veröffentlichter Form verwenden ...
koluschkiB
koluschkiB 11.06.2010 um 12:02:03 Uhr
Goto Top
Hey Bastla,

Es uns zum Vorwurf zu machen, dass Du (durch Deinen Ausbilder) überfordert bist, kann ich aber nicht akzeptieren: Den Kurs
"Grundlagen der Programmierung" wirst Du nicht im Fernstudium bei "administrator.de" absolvieren können.

Ich mache euch keinen Vorwurf und ich will auch keine Super lösungen, hilfestellungen sind Hilfreicher und bringe einen Effekt mit sich, aber durch eure Hilfestellungen war ich oft immer noch am selben Punkt wie am anfang.
Die Grundlage ist auch in dieser 3 Monaten ausbildung nicht absolviert. Ich weiss einen bruchteil und wenn ich eines Tages vor solch einer Programmier aufgabe

Dass Dir im Gegensatz zu Deiner Behauptung eine Umsetzung doch gelingen kann, hat sich ja gezeigt ... face-smile

Die Umsetzung gelingt mri einfach durch rum probieren und nich dadurch das ich weiss ich tu. 999 versuche schlagen fehl, ich äörger mich und plötzlichohne wissen, habe ich es dann doch geschafft da s Fragment an die richtige stelle zu setzen und siehe da, es funktioniert...

P.S.: Ganz unabhängig vom Thema, und sogar wenn Du tatsächlich im "backesten" Office landen solltest: Die
Formulierungen in manchen Deiner Wortmeldungen würde ich nicht einmal im Selbstgespräch, geschweige denn in
geschriebener und (hier) veröffentlichter Form verwenden ...

ja manchmal gehe denn Pferde mit mir durch, ich war schon immer so Impulsiv...

gruß

koluschkiB
60730
60730 11.06.2010 um 12:50:26 Uhr
Goto Top
Zitat von @koluschkiB:
ja manchmal gehe denn Pferde mit mir durch, ich war schon immer so Impulsiv...

gruß

koluschkiB

Ich schreib mal - Das erkennen des Problems ist der erste Weg zur Besserung - und auch - das ist aber nur weil freitags ist grade nochmal so etwas, das deine div. Zeilen "entfernt" entschuldigt.

Und jetzt liesst du dir bitte das fett markierte nochmal durch und sagst diese Zeile auf während du meine allererste Antwort zu deiner Frage nochmal durchließt.

die Frage ist doch - woher kommt der Datensatzsalat, mit dem du die User anlegen willst.

Darauf gabs ja keine Antwort und daher hab ich da auch nicht noch weiter nachgebohrt.
Und jetzt bitte - diese beiden Zeilen zusammen lesen.

Und mit etwas Kaffe im Kopf wirst du erkennen - es macht manchmal mehr Sinn sich vorher Gedanken zu machen, als nachher.

Wie bekomme ich denn ganz schnell - ohne vbs heraus ob ein User existiert?

net user /domain

Soweit "helfe ich dir mal - und die weiteren Schritte machst du allein.

  • Wie kann ich eine Ausgabe vom Prompt in eine Datei ausgeben?
  • Wenn diese Datei mehrere Spalten oder eine andere "Trennung" der einzelnen Datensätze hat - wie kann ich einzelne Werte aus der Datei auslesen?
  • Wenn ich zwei Listen hätte - eine mit der den anzulegenden Benutzern und eine mit den vorhandenen - wie könnte ich die Liste der anzulegenden bereits vorm anlegen bereinigen?

Und dann merkst du - es ist alles so einfach, wenn der erste Weg das aussortieren der unnötigen Schritte ist.

Gruß
koluschkiB
koluschkiB 11.06.2010 um 13:07:55 Uhr
Goto Top
Hey Bastla,

Ich schreib mal - Das erkennen des Problems ist der erste Weg zur Besserung - und auch - das ist aber nur
weil freitags ist
grade nochmal so etwas, das deine div. Zeilen "entfernt" entschuldigt.

Das problem kenne ich, die Lösung ist eher schweriger. Ist so als würde man versuchen nem Pferd skatspielen beizubringen face-smile


> die Frage ist doch - woher kommt der Datensatzsalat, mit dem du die User anlegen willst.

Muss diese Frage überlesen haben, die user sind natürlich in einer user.csv datei abgelegt


Wie bekomme ich denn ganz schnell - ohne vbs heraus ob ein User existiert?

> net user /domain

Ja denn Befehl kenne ich, noch vom letzten Jahr Programmieren. Ich versuche aber das ganze mit vbs zu lösen, auch wenn es manchmal nicht klappt

* Wie kann ich eine Ausgabe vom Prompt in eine Datei ausgeben?

Ich würde die Daten in eine .csv Datei exportieren

* Wenn diese Datei mehrere Spalten oder eine andere "Trennung" der einzelnen Datensätze hat - wie kann ich einzelne
Werte aus der Datei auslesen?
  • Wenn ich zwei Listen hätte - eine mit der den anzulegenden Benutzern und eine mit den vorhandenen - wie könnte ich die
Liste der anzulegenden bereits vorm anlegen bereinigen?

Beide Files miteinander vergleichen lassen und (ich weiss nicht obs möglich ist) Wenn einträge zwischen File 1 und 2 identisch sind, löschen lassen. das wäre jetzt ne idee von mir

Und dann merkst du - es ist alles so einfach, wenn der erste Weg das aussortieren der unnötigen Schritte ist.

Ja es ist einfach, wenn man es kann und da auch denn druchblick hat.
Man muss auch die Möglichkeiten kennen die einem VBS PowerShell oder die CMD bietet, sonst sucht man sich dumm und dämlich, so wie ich es meistens tu.

gruß
Biber
Biber 11.06.2010, aktualisiert am 18.10.2012 um 18:42:30 Uhr
Goto Top
Moin,

ich habe meine Sicht zu diesen Beiträgen der letzten Tage hier in einem der ParallelThreads zusammengefasst.

Grüße
Biber