Portierung 2003 / 2008 ADODB.Connection

  • VBScript

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Portierung 2003 / 2008 ADODB.Connection

    Hallo zusammen,
    ich versuche jetzt seit 8 Stunden das Script auf einem 2008 Server zum laufen zu bekommen.

    Unter 2003 kein ding, da läuft es sauber!
    Unter 2008 stoße ich auf mehrere Fehler.

    Das Script habe ich im ersten Lehrjahr vor 4 Jahren geschrieben und jetzt möchte ich es erneut anwenden ...
    Ich habe es jetzt soweit das er mir unter XP 32bit normal läuft, wenn ich diese Datei auf den Server koppiere und ausführe kommt der Hinweis:
    ADODB.Fields: Item cannot be found in the collection corresponding to the requested name or odinal.

    Ich führe das Script über die shell mittels 32bit cscript.exe aus. Um sicherzustellen das es auch auf dem 64bit Server 2008 r2 in der Version 32bit ausgeführt wird.
    Der Fehler erscheint mir bei:     Leistungsklasse = objRecordset.Fields.Item("Klasse")

    Die bisher versuchten dinge, ich habe die JetODB.DLL überprüft das sie auf dem Aktuellsten Stand ist, ist sie.
    Ich habe es in 64bit sowie in 32bit ausgeführt.
    Ich habe begonnen es auf dieses ACE ding umzuschreiben, es aber aufgegeben weil ich den selben Fehler bekam. (Treiber selbstver. installiert.)

    Da ich mit dem googeln nicht mehr weiter komme und gerade anfange graue Haare zu entwickeln bitte ich euch um Hilfe,
    evtl. hatte einer von euch so ein Problem, oder kann mir den lösenden Tipp geben.

    PS: Ja ich weiß das Script ist nicht gerade elegant geschrieben, heute würde ich es auch anders Schreiben :) Azubi arbeit in der ersten Woche ;)


    Visual Basic-Quellcode

    1. Version:0.9
    2. StartHTML:00000107
    3. EndHTML:00038107
    4. EndFragment:00038067
    5. EndFragment:00000000
    6. Option Explicit
    7. Dim i, k, kontrolle, check, checker
    8. Dim strPathToTextfile, strFile, strComputer, Leistungsklasse, Namen, LK, Location
    9. Dim objConnection, objRecordSet, objWMIService, objNewPort, objPrinter, objPort
    10. Dim colInstalledPrinters, colInstalledPorts
    11. Dim fso, tFile, WshShell
    12. Dim port
    13. msgbox "Stellen Sie sicher das die CSV datei geschlossen ist!"
    14. port = inputbox("Geben sie den Drucker port ein!Standart 9100",vbok)
    15. Const adOpenStatic = 3
    16. Const adLockOptimistic = 3
    17. Const adCmdText = &H0001
    18. i =0
    19. k =0
    20. strPathtoTextFile ="."
    21. strFile ="liste.csv"
    22. strComputer ="."
    23. Set objConnection = CreateObject("ADODB.Connection")
    24. Set objRecordSet = CreateObject("ADODB.Recordset")
    25. Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    26. Set colInstalledPrinters =  objWMIService.ExecQuery("Select * from Win32_PrinterDriver")
    27. Set colInstalledPorts =  objWMIService.ExecQuery("Select * from Win32_TCPIPPrinterPort")
    28. objWMIService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege", True
    29. objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strPathtoTextFile & ";" & "Extended Properties=""text;HDR=YES;FMT=Delimited"""
    30. objRecordset.Open "SELECT * FROM " & strFile , objConnection, adOpenStatic, adLockOptimistic, adCmdText
    31. Do Until objRecordset.EOF
    32.     check = 0
    33.     checker = 0
    34.     kontrolle = 0
    35.     Leistungsklasse = objRecordset.Fields.Item("Klasse")
    36.     Namen = objRecordset.Fields.Item("Name")
    37.     Location = objRecordset.Fields.Item("Location")
    38.     
    39.     If Leistungsklasse ="LK1"            then 
    40.     LK ="RICOH Aficio SP 4210N PCL 6"
    41.     ElseIf Leistungsklasse ="LK1a"        then
    42.     LK ="RICOH Aficio SP C420DN PCL 6"
    43.     ElseIf Leistungsklasse ="LK2"        then
    44.     LK ="RICOH Aficio MP 161 PCL 6"
    45.     ElseIf Leistungsklasse ="LK2a"    then 
    46.     LK ="RICOH Aficio MP C2050 PCL 6"
    47.     ElseIf Leistungsklasse ="LK3"        then 
    48.     LK ="RICOH Aficio MP 4000 PCL 6"
    49.     ElseIf Leistungsklasse ="LK4"        then 
    50.     LK ="RICOH Aficio MP C3300 PCL 6"
    51.     ElseIf Leistungsklasse ="LK5"        then 
    52.     LK ="RICOH Aficio MP 4000 PCL 6"
    53.     ElseIf Leistungsklasse ="LK6"        then 
    54.     LK ="RICOH Aficio MP 5001 PCL 6"
    55.     ElseIf Leistungsklasse ="LK7" then
    56.     LK ="RICHO Aficio MP C3500 PCL 6"
    57.     Else
    58.     LK = Leistungsklasse
    59.     End If
    60.     
    61.     For each objPrinter in colInstalledPrinters 
    62.         If  InStr(objPrinter.Name, LK) = 1 Then  
    63.             check = 1
    64.             kontrolle = 1
    65.         Else
    66.         End If
    67.     Next
    68.     
    69.     For Each objPort in colInstalledPorts 
    70.             If objPort.Name = Namen Then
    71.                 checker = 1
    72.                 kontrolle = 0
    73.             Else
    74.             End If
    75.     Next
    76.     
    77.     
    78.     
    79.     
    80.     If  kontrolle = 1 then 
    81.     
    82.         If Leistungsklasse ="LK5" or Leistungsklasse ="LK6" or Leistungsklasse ="LK7" then
    83.     
    84.             Set objNewPort = objWMIService.Get("Win32_TCPIPPrinterPort").SpawnInstance_
    85.             objNewPort.Name = Namen
    86.             objNewPort.Protocol = 2
    87.             objNewPort.Queue ="lp"
    88.             objNewPort.HostAddress = Namen
    89.             objNewPort.SNMPEnabled = False
    90.             objNewPort.ByteCount = True
    91.             objNewPort.Put_
    92.         
    93.         Else 
    94.             Set objNewPort = objWMIService.Get("Win32_TCPIPPrinterPort").SpawnInstance_
    95.                     
    96.             objNewPort.Name = Namen
    97.             objNewPort.Protocol = 1
    98.             objNewPort.HostAddress = Namen
    99.             objNewPort.PortNumber = port
    100.             objNewPort.SNMPEnabled = False
    101.             objNewPort.Put_
    102.                 
    103.         End If
    104.         
    105.         Set objPrinter = objWMIService.Get("Win32_Printer").SpawnInstance_
    106.         objPrinter.DriverName = LK
    107.         objPrinter.PortName   = Namen
    108.         objPrinter.DeviceID   = Namen
    109.         objPrinter.Location = Location
    110.         objPrinter.Network = FALSE
    111.         objPrinter.Shared = True
    112.         objPrinter.ShareName = Namen
    113.         objPrinter.Comment = Namen & " / DHCP"
    114.         objPrinter.EnableBIDI = True
    115.         objPrinter.Put_ 
    116.     
    117.         check = 3
    118.         checker = 3
    119.     i = i+1
    120.     End If
    121.     
    122.     If check = 0 and checker = 0 Then 
    123.         Set fso = CreateObject("Scripting.FileSystemObject")
    124.         Set tFile = fso.OpenTextFile("Fehler.txt",8,true)
    125.         tFile.WriteLine "Treiber _________ Drucker: -" & Namen & "- konnte nicht Installiert werden, weil der Treiber nicht vorhanden ist!"
    126.         tFile.close
    127.         k = k +1
    128.     ElseIf checker = 1 and check = 1 Then
    129.         Set fso = CreateObject("Scripting.FileSystemObject")
    130.         Set tFile = fso.OpenTextFile("Fehler.txt",8,true)
    131.         tFile.WriteLine "Port ____________ Drucker: -" & Namen & "- konnte nicht Installiert werden, weil der Port bereits vergeben war!"
    132.         tFile.close
    133.         k = k +1
    134.     ElseIf checker = 1 and check = 0 Then
    135.         Set fso = CreateObject("Scripting.FileSystemObject")
    136.         Set tFile = fso.OpenTextFile("Fehler.txt",8,true)
    137.         tFile.WriteLine "PORT & Treiber __ Drucker: -" & Namen & "- konnte nicht Installiert werden."
    138.         tFile.close
    139.         k = k +1
    140.     End If
    141.         
    142.      check = 0
    143.      checker = 0
    144.      err.Clear
    145.      
    146.      
    147.     
    148.   kontrolle = 0
    149.   objRecordset.MoveNext
    150.   
    151.   
    152.   
    153.   
    154.   
    155.   
    156.   Set WshShell = WScript.CreateObject("WScript.Shell") 
    157.   Set fso = CreateObject("Scripting.FileSystemObject") 
    158.   
    159.   
    160.   WshShell.Popup "In Bearbeitung", 1, "Working....."
    161. Loop
    162. msgbox "DONE - es wurden " & i & " Drucker inklusiv Portsangelegt."
    163. msgbox "Es wurden " & k & " Drucker nicht angelegt. Eine genaue Auflistung finden Sie in der Fehler.txt!"

    Krehk schrieb:

    Der Fehler erscheint mir bei:     Leistungsklasse = objRecordset.Fields.Item("Klasse")
    Wenn's auf den anderen Systemen läuft, kann's ja eigentlich nur ein Naming.Problem sein.

    Vielleicht musst du "[Klasse]" angeben.
    (wobei ich mir dieses Verhalten eher bei Name vorstellen könnte).

    Schau doch einfach mal nach, welche Fields sich in der Collection befinden.

    Visual Basic-Quellcode

    1. For each item in objRecordset.Fields
    2. MsgBox item.Name
    3. Next
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,

    meine Test csv sieht wie folgt aus:

    Name;Klasse;Location
    GP-DEZ1-001; LK6; Köln-Deutz Bereich 11 EG A E01
    GP-DEZ1-001; LK6; Köln-Deutz Bereich 11 EG A E01

    Wenn ich mir den String ausgeben lasse bekomme ich alls angezeigt ausser Name; Klasse; Location;.
    Ich denke das ist auch korrekt, da ich das als DB anspreche und die erste Zeile der Header also der Bezeichenr ist.

    :) wie gesagt das problem kommt erst wenn ich es vom 2003 auf den 2008 Server ziehe :)
    Wenn ich es mit "[]" mache, sagt er mir das selbe, er findet es nicht.
    Wenn ich es mit [] mache, also ohne "", sagt er mir Variable nicht definiert.

    Das problem liegt irgendwie in der portierung nach 2008 und dem dort nicht mehr so einfachen Oledb.4.0 treiber...
    Aber ich habe das VBS schon als win32.exe kompiliert und es erzeugt den selben fehler ... :-/