koluschkib
Goto Top

Zugriff verweigert beim schreiben einer error.log mit vbs

Morgen Admins

hab da ein kleines Problem face-smile ...mal wieder!!!

Ich hab ein Script was im AD USer udn Gruppen anlegt, sowie Benutzerordner mit denn nötigen Netzwerkfreigaben.
Da alles in .log files dokumentiert werden soll, habe ich solche befehle in meinen Quelltext eingebaut.
Hab aber nun Folgendes Problem:

Wenn cih mein Script ausführe, läuft es einmal durch. Stellt fest dass der Ordner mit Namen XY bereist existiert, diesen Fehler soll er dann in der Error.log dokumentieren.
Beim Ersten User klappts Super, beim zweiten leider nicht.
Man sagte mri bereits, dass die Ursache darin besteht, dass diese error.log noch offen sei. Dabei wird sie nach dem ersten kompletten durchlauf geschlossen.
Häng also an diesem Blöden ding fest und weiss nicht weiter

Option Explicit

'Variablen des gesamten Scripts werden hier ind iesen 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")  
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

Der fehler befinet sich in der Zeile 73 ---> Zugriff Verweigert.

Hab schon alle Variablen überprüft aufschriebweise usw. aber dies führte es nicht zum gewünschtem erfolg face-sad

hoffe einer von euch sieht den Fehler und kann mir evtl nen Tipp geben

Gruß und Danke im vorraus

koluschkiB

Content-Key: 144547

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

Printed on: April 20, 2024 at 01:04 o'clock

Member: Snowman25
Snowman25 Jun 10, 2010 at 08:16:01 (UTC)
Goto Top
nach Zeile 64 musst du auch wieder schließen.
Member: TsukiSan
TsukiSan Jun 10, 2010 at 08:17:36 (UTC)
Goto Top
Hallo koluschiB

es fehlt in deinem Script das
f.close

dann klappt's auch beim nächsten Durchlauf.

Gruss
Tsuki
Member: koluschkiB
koluschkiB Jun 10, 2010 at 08:26:43 (UTC)
Goto Top
Morgen Snowman & TsukiSan

und danke für die schnelle Antwort.

Hab dort ein errText.Close reingesetzt und siehe da

ES KLAPPT face-smile

Vielen Dank, werde mich sicherlich nochmal bei euch melden face-wink denn das Script ist noch nicht ganz fertig

Gruß und Danke

koluschkiB