Jeenne 10 Geschrieben 14. Oktober 2010 Melden Teilen Geschrieben 14. Oktober 2010 Hallo zusammen, ich habe folgendes Problem: Ich würde gerne auf Client Rechnern alte gegen neue Drucker austauschen, nachdem ich den neuen Printserver online habe. Auf deutschen Systemen funktioniert es ohne Probleme, aber auf Multilanguage Systemen bringt es leider die Fehlermeldung "Code:80040E10 Error:Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben" und zeigt auf die Zeile mit "set objRS = objConn.Execute("SELECT * FROM " & strTabelle & " WHERE DruckerAlt = '" & strDruckerAlt & "'")". Seht einer an dem Script das Problem? Script: ' Region Description ' ' Name: Druckerverbindung.vbs ' Author: Nils Kaczenski ' Version: 1.0 ' Description: Ersetzt Windows-Netzwerkdruckerverbindungen im aktuellen Benutzerprofil ' durch andere Verbindungen. Die alten und neuen Verbindungsdaten sind in einer Textdatei ' angegeben. Nützlich bei Drucker-Migrationen. ' Für die Fachzeitschrift IT-Administrator, 2006 ' Freie Weitergabe des Skriptcodes erlaubt. Keine Gewähr! ' ' EndRegion ' Pfad zur Druckerdatei strDBPfad = "<Mein Druckerpfad>" ' Druckerdatei temporär kopieren, um Sperrkonflikte zu umgehen Set objFSO = CreateObject("Scripting.FileSystemObject") Set objDBDatei = objFSO.GetFile(strDBPfad) strDBDateilokal = objFSO.GetTempName strTemppfad = objFSO.GetSpecialFolder(2) strDBPfadlokal = objFSO.BuildPath(strTemppfad, strDBDateilokal) objDBDatei.Copy strDBPfadlokal ' Tabelle hier: Name der Textdatei strTabelle = strDBDateilokal ' ADO-Objekte Set objConn = CreateObject("ADODB.Connection") ' weitere Objekte Set objNetwork = CreateObject("WScript.Network") Set objShell = CreateObject("Wscript.Shell") Set objWMI = GetObject("winmgmts:\\.\root\CIMV2") objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & strTemppfad & ";" & _ "Extended Properties=""text;HDR=YES;FMT=Delimited""" strText = "" ' Druckerverbindungen des Benutzers durchlaufen Set colDrucker = objNetwork.EnumPrinterConnections ' Im jeweils zweiten Wert steht der Druckername For i=0 To colDrucker.Count-1 Step 2 strDruckerAlt = colDrucker(i + 1) ' In Datenbank nach der aktuellen Verbindung suchen set objRS = objConn.Execute("SELECT * FROM " & strTabelle & " WHERE DruckerAlt = '" & strDruckerAlt & "'") ' Falls Drucker gefunden (objRS nicht leer) ... If Not objRS.EOF Then ' ... neuen Drucker herausfinden strDruckerNeu = objRS("DruckerNeu") ' ... und verbinden DruckerSetzen strDruckerAlt, strDruckerNeu End If Next ' Erfolg melden If strText <> "" Then objShell.Popup strText, 10, "Drucker wurden erfolgreich umbenannt." End If ' Lokale Textdatei schließen und löschen objRS.Close Set objDBDateilokal = objFSO.GetFile(strDBPfadlokal) objDBDateilokal.Delete Sub DruckerSetzen(strDruckerAlt, strDruckerNeu) ' ist der alte Drucker der Standarddrucker? strDruckerWQL = Replace(strDruckerAlt, "\", "\\") strWQL = "SELECT Default FROM Win32_Printer " _ & "WHERE Name = '" & strDruckerWQL & "'" Set colPrinters = objWMI.ExecQuery(strWQL) If colPrinters.Count > 0 Then For Each objPrinter In colPrinters If objPrinter.Default = vbTrue Then flgDefault = True Else flgDefault = False End If Next End If ' alte Verbindung entfernen objNetwork.RemovePrinterConnection strDruckerAlt, True, True strText = strText & strDruckerAlt & " entfernt." & VbCrLf ' neue Verbindung hinzufügen objNetwork.AddWindowsPrinterConnection strDruckerNeu strText = strText & strDruckerNeu & " hinzugefügt." & VbCrLf If flgDefault Then objNetwork.SetDefaultPrinter(strDruckerNeu) strText = strText & strDruckerNeu & " ist Standarddrucker." & VbCrLf End If End Sub Vergleichsdatei: DruckerAlt;DruckerNeu "\\AlterDruckserver\AlterName";"\\NeuerDruckserver\NeuerName" Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 14. Oktober 2010 Melden Teilen Geschrieben 14. Oktober 2010 Moin, unterscheiden sich die Multilanguage-Systeme noch anders von denen, auf denen es geht? Beispielsweise anderes OS, andere Bitversion? Die einzige Umgebung, in der das Skript getestet ist, ist Windows XP 32-Bit deutsch. Gruß, Nils Zitieren Link zu diesem Kommentar
Jeenne 10 Geschrieben 14. Oktober 2010 Autor Melden Teilen Geschrieben 14. Oktober 2010 Nein, hier ist leider kein Unterschied. Es wird Windows XP 32Bit verwendet, nur das die neuen Installationen mit einem Multilanuage System installiert werden, wo dann Deutsch ausgewählt wird. Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 14. Oktober 2010 Melden Teilen Geschrieben 14. Oktober 2010 Moin, dann bau mal eine Fehlerausgabe ein. Füge vor der Zeile mit dem Fehler diese Zeile ein: WScript.Echo "SELECT * FROM " & strTabelle & " WHERE DruckerAlt = '" & strDruckerAlt & "'" Dann starte das Skript auf einem Multi-PC im CMD-Fenster mit cscript Druckerverbindung.vbs Direkt vor dem Fehler sollte das Skript nun die SELECT-Anweisung ausgeben. Poste die mal bitte hier. Gruß, Nils Zitieren Link zu diesem Kommentar
Jeenne 10 Geschrieben 14. Oktober 2010 Autor Melden Teilen Geschrieben 14. Oktober 2010 Nicht wundern, ich habe es gerade unter einer Englischer Installation getestet. Die aber genau die gleiche Fehlermeldung erzeugt. Die Select-Ausgabe ist folgende: SELECT * FROM radE6201.tmp WHERE DruckerAlt = 'Microsoft XPS Document Writer' C:\Documents and Settings\testuser\Desktop\Druckerverbindung.vbs(47, 2) Microsoft JET Database Engine: No value given for one or more required parameters. Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 14. Oktober 2010 Melden Teilen Geschrieben 14. Oktober 2010 Moin, prüf nochmal, ob auch der Tempfad gefunden wird. Gib mal vor folgender Zeile: ' Tabelle hier: Name der Textdatei folgenden Code ein: WSCript.Echo "Temppfad ist: " & strTemppfad Dann wie oben ausführen und das Ergebnis hier posten. Dasselbe bitte mal auf einem der funktionierenden Clients ausführen und auch hier posten. Gruß, Nils Zitieren Link zu diesem Kommentar
Jeenne 10 Geschrieben 14. Oktober 2010 Autor Melden Teilen Geschrieben 14. Oktober 2010 Moin, wie folgt sind die Ergebnisse: Hier funktioniert es: Temppfad ist: C:\DOCUME~1\testuser\LOCALS~1\Temp C:\Documents and Settings\testuser\Desktop\Druckerverbindung.vbs(46, 2) Microsof t JET Database Engine: No value given for one or more required parameters. Hier funktioniert es nicht: Temppfad ist: C:\DOKUME~1\testuser\LOKALE~1\Temp Zitieren Link zu diesem Kommentar
Jeenne 10 Geschrieben 14. Oktober 2010 Autor Melden Teilen Geschrieben 14. Oktober 2010 Auf dem PC wo es nicht funktioniert, stehen auch noch jede Menge TMP File's, welche auf dem anderen, wie es aussieht danach gelöscht werden. Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 14. Oktober 2010 Melden Teilen Geschrieben 14. Oktober 2010 Moin, hm, dann weiß ich nicht recht, woran es liegt. :( Dass die Temp-Dateien nicht gelöscht werden, ist klar, das Skript bricht ja vorher ab. Gruß, Nils Zitieren Link zu diesem Kommentar
Jeenne 10 Geschrieben 14. Oktober 2010 Autor Melden Teilen Geschrieben 14. Oktober 2010 Hmm... schade... Zitieren Link zu diesem Kommentar
Jeenne 10 Geschrieben 14. Oktober 2010 Autor Melden Teilen Geschrieben 14. Oktober 2010 Ich habe das Gefüll es liegt in der Connecation, dass er damit nicht umgehen kann, ist das möglich? ' ADO-Objekte Set objConn = CreateObject("ADODB.Connection") ' weitere Objekte Set objNetwork = CreateObject("WScript.Network") Set objShell = CreateObject("Wscript.Shell") Set objWMI = GetObject("winmgmts:\\.\root\CIMV2") objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & strTemppfad & ";" & _ "Extended Properties=""text;HDR=YES;FMT=Delimited""" und... set objRS = objConn.Execute() Zitieren Link zu diesem Kommentar
Jeenne 10 Geschrieben 14. Oktober 2010 Autor Melden Teilen Geschrieben 14. Oktober 2010 Also die Connection funktioniert ohne Probleme... Habe jetzt mal ein wenig mit dem SQL Statement rumgespielt, jetzt sieht es ein wenig danach aus , dass er die txt Datei nicht richtig einliesst. Habe die txt. Datei auch einmal direkt angesprochen, doch hier hat er wieder Probleme... Weißt du wodran es liegen kann? Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 14. Oktober 2010 Melden Teilen Geschrieben 14. Oktober 2010 Moin, nein, eher nicht. Dann würde er den Fehler früher melden, nicht erst beim Versuch, die Abfrage auszuführen. (das bezog sich auf Post 11) Neu zu Post 12: Hast du die Datei evtl. als Unicode gespeichert? Damit gibt es bei ADO-Zugriffen gern mal Probleme. Leider habe ich ansonsten keine Möglichkeit, das weiter zu troubleshooten. Gruß, Nils Zitieren Link zu diesem Kommentar
Jeenne 10 Geschrieben 14. Oktober 2010 Autor Melden Teilen Geschrieben 14. Oktober 2010 Nein das ist immer noch ANSI. Habe wie gesagt die Textdatei jetzt direkt in dem Query um etwas zu testen (Also SELECT * FROM text.txt WHERE ....). Damit nimmt sich das Script die Datei aus dem Temp Ordner. Wenn ich jetzt z.B. mal komplett leer mache, sagt er mir nur "Query must have at least one destination field", aber er macht in dem Sinne den Fehler nicht mehr, daher denke ich dass der Fehler hier liegt, oder? Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 14. Oktober 2010 Melden Teilen Geschrieben 14. Oktober 2010 Hm. Lass doch mit dem ursprünglichen Skript nochmal die Temp-Datei erzeugen und schau sie dir an. Ist daran irgendwas Auffälliges? Unterscheidet sie dich von der Datei, die auf dem "funktionierenden" Rechner erzeugt wird? Gruß, Nils Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.