VBScript - Problem beim Auslesen einer CSV-Datei
Guten Morgen
Ich habe ein kleines Problem mit meinem Loginscript (VBScript). Und zwar folgendes:
Ich habe eine CSV-Datei, wo drinsteht welcher Benutzer welche Netzlaufwerke erhält. Diese heisst "Laufwerke.csv" und ist nach folgendem Muster aufgebaut:
Nun habe ich ein VBScript, welches folgende Funktion enthält:
Das VBScript wird mittels einer Batch-Datei gestartet, die folgendermassen aussieht:
Das VBScript selber und die CSV-Datei wird also in den temporären Ordner kopiert und von dort aus ausgeführt. Beim nächsten Login werden diese beiden Dateien wieder gelöscht und frisch kopiert.
Mein Problem ist nun folgendes:
Unter x64-Systemen (XP x64 und Windows 7 x64) funktioniert die obere Funktion nicht zum Auslesen der CSV-Dateien nicht (bei Windows XP 32 Bit ohne Probleme). Ich starte unter x64-Systemen das VBScript mittels der CScript.exe aus dem SysWOW64 Ordner, dann läuft die Funktion zwar durch, es kommt allerdings nicht an die Werte in der CSV, d.h. die Variablen "LWB" und "PATH" bleiben leer. Er ackert zwar die CSV-Datei einmal durch, füllt die Variablen allerdings nicht ab und verbindet kein einziges Laufwerk.
Wenn ich bei x64-Systemen nicht die CScript.exe aus dem SysWOW64-Ordner nehme, sondern einfach nur folgende Zeile in der Batchdatei angebe....
...dann gibt es eine Endlosschleife. Er ackert dann die CSV-Datei immer und immer wieder durch, bis man den Prozess cscript.exe über den Taskmanager abschiesst.
Ich bin mit meinem Latein am Ende. Wieso um Gates Willen will diese Funktion nicht sauber arbeiten auf x64-Systemen?
Habt ihr eine Ahnung?
Das Projekt liegt mir schon ca. ein halbes Jahr auf dem Magen und ich kann beim besten Willen keine Lösung finden.
Ich danke euch
Gruss
TuXHunT3R
Ich habe ein kleines Problem mit meinem Loginscript (VBScript). Und zwar folgendes:
Ich habe eine CSV-Datei, wo drinsteht welcher Benutzer welche Netzlaufwerke erhält. Diese heisst "Laufwerke.csv" und ist nach folgendem Muster aufgebaut:
USER;LWB;PATH
User1;G:;\\server1\share1
user1;L:;\\server1\share2
user1;M:;\\server2\share3
user2;O:;\\server3\share4
Nun habe ich ein VBScript, welches folgende Funktion enthält:
Set wshNetwork = CreateObject("WScript.Network")
Set wshShell = CreateObject("Wscript.Shell")
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
temp_path = wshShell.ExpandEnvironmentStrings("%temp%")
LWFilePath = temp_path & "\login"
wscript.echo "Öffne CSV-Datei zum Auslesen der Laufwerke..."
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & LWFilepath & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
objRecordset.Open "SELECT * FROM Laufwerke.csv", _
objConnection, adOpenStatic, adLockOptimistic, adCmdText
if objRecordset.Recordcount <> 0 Then
Do Until objRecordset.EOF
if lcase(objRecordset.Fields.Item("USER")) = lcase(Username) Then
LWB = objRecordset.Fields.Item("LWB")
PATH = objRecordset.Fields.Item("PATH")
wscript.echo "Verbinde Laufwerk " & LWB & " ---- " & PATH & "..."
wshNetwork.MapNetworkDrive LWB, PATH, false
End if
objRecordset.MoveNext
Loop
Else
wscript.echo "Kein Eintrag für Laufwerke gefunden. Loginscript wird fortgesetzt."
End if
Das VBScript wird mittels einer Batch-Datei gestartet, die folgendermassen aussieht:
@echo off
echo #################################
echo Login FIRMA AG
echo #################################
echo.
echo.
echo.
echo Loesche lokal gespeichertes Loginscript...
if exist %temp%\login rmdir /s /q %temp%\login
mkdir %temp%\login
echo Kopiere aktuelles Loginscript...
copy \\ksdc01\netlogon\login.vbs %temp%\login
echo Kopiere aktuelle Laufwerksliste...
copy \\ksdc01\netlogon\laufwerke.csv %temp%\login
echo Ueberpruefe Betriebssystem-Architektur...
if exist %windir%\SysWOW64 goto :x64
echo x86-Betriebssytem erkannt.
echo Starte eigentliches Loginscript...
ping -n 3 localhost >nul
cscript.exe %temp%\login\login.vbs //nologo
goto :end
:x64
echo x64-Betriebssystem erkannt.
echo Starte eigentliches Loginscript...
ping -n 3 localhost >nul
%windir%\SysWOW64\cscript.exe %temp%\login\login.vbs //nologo
goto :end
:end
Das VBScript selber und die CSV-Datei wird also in den temporären Ordner kopiert und von dort aus ausgeführt. Beim nächsten Login werden diese beiden Dateien wieder gelöscht und frisch kopiert.
Mein Problem ist nun folgendes:
Unter x64-Systemen (XP x64 und Windows 7 x64) funktioniert die obere Funktion nicht zum Auslesen der CSV-Dateien nicht (bei Windows XP 32 Bit ohne Probleme). Ich starte unter x64-Systemen das VBScript mittels der CScript.exe aus dem SysWOW64 Ordner, dann läuft die Funktion zwar durch, es kommt allerdings nicht an die Werte in der CSV, d.h. die Variablen "LWB" und "PATH" bleiben leer. Er ackert zwar die CSV-Datei einmal durch, füllt die Variablen allerdings nicht ab und verbindet kein einziges Laufwerk.
Wenn ich bei x64-Systemen nicht die CScript.exe aus dem SysWOW64-Ordner nehme, sondern einfach nur folgende Zeile in der Batchdatei angebe....
cscript.exe %temp%\login\login.vbs //nologo
...dann gibt es eine Endlosschleife. Er ackert dann die CSV-Datei immer und immer wieder durch, bis man den Prozess cscript.exe über den Taskmanager abschiesst.
Ich bin mit meinem Latein am Ende. Wieso um Gates Willen will diese Funktion nicht sauber arbeiten auf x64-Systemen?
Habt ihr eine Ahnung?
Das Projekt liegt mir schon ca. ein halbes Jahr auf dem Magen und ich kann beim besten Willen keine Lösung finden.
Ich danke euch
Gruss
TuXHunT3R
Please also mark the comments that contributed to the solution of the article
Content-Key: 205273
Url: https://administrator.de/contentid/205273
Printed on: April 19, 2024 at 11:04 o'clock
4 Comments
Latest comment
Hi TuXHunT3R,
wie wäre es wenn du anstatt des Datenbankobjektes zum extrahieren der Daten aus der CSV-Datei einfach ein universelles Auslesen(LineByLine) verwendest und die Zeilen in ein Array aufsplittest. So umgehst du das Problem wenn der Jet-Datenbanktreiber nicht in der richtigen Version auf dem jeweiligen Betriebssystem vorliegt.
wenn du aus welchen Gründen auch immer, jedoch bei der Datenbankmethode bleiben musst, könnte Dir folgender Artikel weiterhelfen. Dort ist in Lösung 4 die Rede davon das man die Jet-Datenbank-DLLs erneut auf dem 64-Bit System registrieren sollte.
Grüße Uwe
wie wäre es wenn du anstatt des Datenbankobjektes zum extrahieren der Daten aus der CSV-Datei einfach ein universelles Auslesen(LineByLine) verwendest und die Zeilen in ein Array aufsplittest. So umgehst du das Problem wenn der Jet-Datenbanktreiber nicht in der richtigen Version auf dem jeweiligen Betriebssystem vorliegt.
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(LWFilepath, ForReading)
Do Until objTextFile.AtEndOfStream
strNextLine = objTextFile.Readline
If strNextLine <> "" Then
arrMapping = Split(strNextLine , ";")
If LCase(arrMapping(0)) = LCase(Username) Then
LWB = arrMapping(1)
PATH = arrMapping(2)
wscript.echo "Verbinde Laufwerk " & LWB & " ---- " & PATH & "..."
wshNetwork.MapNetworkDrive LWB, PATH, False
End If
End If
Loop
wenn du aus welchen Gründen auch immer, jedoch bei der Datenbankmethode bleiben musst, könnte Dir folgender Artikel weiterhelfen. Dort ist in Lösung 4 die Rede davon das man die Jet-Datenbank-DLLs erneut auf dem 64-Bit System registrieren sollte.
Grüße Uwe
Hallo TuXHunt3R!
Wo kommt im VBScript in Codezeile 24 der Username her?
Finde kein:
Gruß Dieter
Wo kommt im VBScript in Codezeile 24 der Username her?
Finde kein:
Username = wshNetwork.UserName
Gruß Dieter