koluschkib
Goto Top

Abfangen eines Fehler beim Anlegen eines Users im AD

Morgen Admin-Genossen face-smile

hab da ein Problem und weiss nicht so recht wie ich es lösen soll. Vielleicht hat einer von euch ne Idee die mich weiterbringt

Ich hab ein script was User im AD anlegt, hab aber folgendes Problem:
Wenn man das Script 1.mal ausführt wird alles wunderbar angelegt, Ordner Gruppen Benutzer usw.
Führt man das Script ein 2. mal aus, so kommt die

"Das Objekt ist bereits Vorhanden"

Ja klar, der Benutzer wurde ja auch schon beim ersten Mal angelegt.

Gibt es irgendeine Möglichkeit diesen fehler abzufangen und Quasi das zu Überspringen und zum Nächsten User zu gehen und Ihn anzulegen?
desweitern Wird ja auch noch der ordner für denn benutzer angelegt, dort ist das selbe Problem, zwar wird der bestehende Ordner nicht gelöscht (soll auch nicht gelöscht werden) aber das Script haut dort auch ne Fehlermeldung raus, dass das Objekt bereits Existiert.

so sieht mein Script aus:

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
Dim objFolder, strComputer, objWMIService, objNewShare, errReturn, PermL1

'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)  

'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)

'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

'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

'Ordner werden für denn Benutzer angelegt, dabei wird der Nachname als Ordnername verwendet  
Set objFolder = fso.CreateFolder("C:\Freigaben\" & Nachname)  

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

	'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

meine überlegung war es einfach das Mit ON ERROR RESUME NEXT abzufangen, aber das klappt leider nicht so. Desweiter wollte ich ne MSGBOX blabla sagen lassen um denn Script benutzer mitzuteilen, dass der User/ Ordner bereits existiert.

so in etwa dachte ich es mir bei dem Ordner Fehler
Set objFolder = fso.CreateFolder("C:\Freigaben\" & Nachname)  
If ObjFolderExists Then 
Msgbox ("Der Ordner mit dem Namen "&Nachname&" existiert bereits!")  
AND
On Error Resume Next
end if

hat einer vone uch vielleicht ne Idee oder nen Vorschlag der mich weiter bringen würde?
für hilfe wäre ich Dankbar

gruß

koluschkiB

Content-ID: 144284

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

Ausgedruckt am: 15.11.2024 um 15:11 Uhr

90776
90776 07.06.2010 um 11:56:58 Uhr
Goto Top
Hallo

Möglichkeit 1
hinter jedem ein 1>nul 2>nul

Möglichkeit 2
Script 2 das Script 1 aufruft mit 1>nul 2>nul

Möglichkeit 3
Script 2 das Script 1 aufruft mit >> text.txt

Bei Möglichkeit 2 und 3 werden keine echos, rems oder ähnliches Ausgegeben

Gruss
Switcher
Edi.Pfisterer
Edi.Pfisterer 07.06.2010 um 12:17:42 Uhr
Goto Top
Hallo koluschki!
so in etwa muss es aussehen, damit du die Sache mit bestehendem Ordner in den Griff bekommst...
Set fso = CreateObject("Scripting.FileSystemObject")   'das steht bei dir schon irgendwo, also nicht miteinbaun!!!  

IF fso.FolderExists("C:\Freigaben\" & Nachname) then  
         Msgbox ("Der Ordner mit dem Namen "&Nachname&" existiert bereits!")  
         Set objFolder = fso.GetFolder("C:\Freigaben\" & Nachname)  
ELSE
Set objFolder = fso.CreateFolder("C:\Freigaben\" & Nachname)  
END IF

btw: was switcher94 betrifft bezieht sich auf den implementierten batch-Teil
lg
koluschkiB
koluschkiB 07.06.2010 um 13:10:28 Uhr
Goto Top
Hey Edi,

super es hat geklappt, wenn der Ordner mit dem Namen existiert kommt die MSGbox und das ding läuft dann weiter face-smile

hab das script noch einwenig umgebastelt, da ich vorher einen festdefiniertem Ordner C.\freigaben hatte. wenn er nicht vorhanden ist, gabs ne fehlermeldung. Hab dieses Script fragment auch dort eingebaut, da der Ordner jetzt mit erstellt wird, die Msgbox einfach weggelassen und alles dementsprechend angepasst und es ist genau nach meiner vorstellung face-smile

könnte ich dieses Fragment (nach bearbeitung) auch problemlos beim User anlegen nutzen? also wenn User XY bereits existiert usw...

gruß und danke für die hilfe

koluschkiB
koluschkiB
koluschkiB 07.06.2010 um 13:47:10 Uhr
Goto Top
dachte evtl an sowas hier

if objOU.UserExists Then
        Msgbox = ("Der User "&Nachname&" existiert bereits!")  
             Set objUser = GetobjUser("user", "CN=" & Vorname & " " & Nachname)  
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
end if

leider hat mir das script nen fehler raus. dass das Objekt "USerExists" nicht unterstützt wird

hmm blöd n bisschen
Edi.Pfisterer
Edi.Pfisterer 07.06.2010 um 14:11:18 Uhr
Goto Top
Hallo!
Probier mal (ungetestet):
set objUser = GetobjUser("user", "CN=" & Vorname & " " & Nachname)   
If exists objUser Then
       Msgbox = ("Der User "&Nachname&" existiert bereits!")   
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
end if

PS: ich bin begeistert!!! Du hast Deinen Code eingerückt!!! Weltklasse face-wink
Alles Gute weiterhin!!!
Falls Du mal an Deinen Kenntnissen zweifeln solltest:
Schau einfach mal Deinen ersten Beitrag an...
Die Differenz Deiner Kenntnisse und Deiner Herangehensweise an das Problem ist atemraubend!
lg
Edi
koluschkiB
koluschkiB 07.06.2010 um 14:20:38 Uhr
Goto Top
Hey Edi,

klappt leider nicht so ganz wie erwartet:

> set objUser = GetobjUser("user", "CN=" & Vorname & " " & Nachname)   
> If exists objUser Then
>        Msgbox = ("Der User "&Nachname&" existiert bereits!")   
> 

Laut Fehlermeldung fehlt zwischen "exists" und "objUser" ein "Then"
verstehe nicht so ganz, warum er da nen fehler reinknallt, da das Then ja ein paar stellen weiter aufgeführt ist.
Hab schon einige möglichkeiten versucht, zusammenschrieben oder mit "." versehen leider hat nichts geholfen, kriege immer andere Fehlermeldungen. Variable nicht deklariert usw.


Schau einfach mal Deinen ersten Beitrag an...
Die Differenz Deiner Kenntnisse und Deiner Herangehensweise an das Problem ist atemraubend!

Hey Danke face-smile ich versuche natürlich das beste zu geben und euch zeigen, dass ist doch flexibler bin als ne Bahnschiene.
Kurz gesagt, ich lerne dazu face-wink

gruß und danke koluschkiB
Edi.Pfisterer
Edi.Pfisterer 07.06.2010 um 15:33:01 Uhr
Goto Top
Hallo!
hier gibts einen anderen Ansatz, der erfolgversprechend zu sein scheint...

und hier ist noch ein anderer Ansatz...

imho könntest du aber hier aber mit on Error Resume next einfach drübersteigen...

hmmm...

bin grad im Stress, daher heute meine Hilfe nur fragmentarisch...

lg
koluschkiB
koluschkiB 07.06.2010 um 16:02:42 Uhr
Goto Top
Hey Edi,

bin für jde Hilfe dankbar auch wenn sie nur kurz und knapp ist.
Hab das mit On Error Resume Next genommen, funktioniert wunderbar.

Aber da ist wiederum ein anderes problem, was sie daraus kristallisiert.
Wenn man das script los laufen lässt, überspringt er brav die Errors, soweit so gut. Aber woher weiss man das am ende der User XYz nicht angelegt wurde, weil er schon existiert?!

Da fällt mir ein, ich muss eh Erfolg und Misserfolg in einer .log datei festhalten, somit kann man nach dem Durchlaufen lassen nachlesen, obs geklappt hat oder nicht face-smile
Es gibt also für alles ne lösung ^^

Danke und Gruß

koluschkiB