tuxhunt3r
Goto Top

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:


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

Content-Key: 205273

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

Printed on: April 19, 2024 at 11:04 o'clock

Member: colinardo
colinardo Apr 19, 2013 updated at 09:04:31 (UTC)
Goto Top
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.

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
Mitglied: 76109
76109 Apr 19, 2013 at 18:10:09 (UTC)
Goto Top
Hallo TuXHunt3R!

Wo kommt im VBScript in Codezeile 24 der Username her?

Finde kein:
Username = wshNetwork.UserName

Gruß Dieter
Member: TuXHunt3R
TuXHunt3R Apr 21, 2013 at 20:50:15 (UTC)
Goto Top
@colinardo:

Ich muss nicht bei der Datenbankmethode bleiben, das war einfach die schnellste Lösung, als ich das Script angefangen habe. Eine Funktion zum Einlesen der CSV in ein Array habe ich anno dazumals aus irgendeinem Grund, an den ich mich gerade nicht mehr erinnere, nicht zum Laufen gebracht. Ich habe mir aber so etwas gedacht (Jet-DB DLLs). Ich danke dir für den Vorschlag und werde es morgen früh gleich testen.


@76109:
Das ist in meinem Script schon drin, hier habe ich nur einen Schnipsel gepostet. Wenn das das Problem wäre, würde mein Script auf 32-Bit-Maschinen auch nicht laufen. Aber danke trotzdem.
Member: TuXHunt3R
TuXHunt3R May 01, 2013 at 05:12:13 (UTC)
Goto Top
Soooooooo..........

Ich habe es nun mittels der Array-Methode gemacht. Mein Code sieht nun so aus und funktioniert einwandfrei auf Windows XP x86, XP x64 und 7 x64:

Set wshFso = CreateObject("Scripting.FileSystemObject")  
Const ForReading = 1
temp_path = wshShell.ExpandEnvironmentStrings("%temp%")  
Username = lcase(wshNetwork.UserName)
LWFilePath = temp_path & "\login\Laufwerke.csv"  
Set objLWFile = wshFso.OpenTextFile(LWFilepath, ForReading)

Do Until objLWFile.AtEndOfStream
    strNextLine = objLWFile.Readline
    If strNextLine <> "" Then  
    	arrMapping = Split(strNextLine, ";")  
    	If LCase(arrMapping(0)) = Username Then
    		LWB = arrMapping(1) 
			PATH = arrMapping(2)
			wscript.echo "Verbinde Laufwerk " & LWB & " ---- " & PATH & "..."   
			wshNetwork.MapNetworkDrive LWB, PATH, False
		End If	
    End If
Loop

Herzlichen Dank für eure Hilfe.

Gruss
TuXHunT3R