Win32_Printer

  • Hi,


    ich lese schon lange in eurem Forum und konnte viele Anregungen holen und Probleme lösen, aber momentan habe ich eines, was hier noch nicht besprochen wurde. Es geht um das leidige Thema der Druckerinstallation. Ich habe ein Tool geschrieben was von mehreren Servern per WMI die Installierten Netzwerkdrucker holt und dem Benutzer zur Auswahl stellt.

    Der Aufruf des Namens, des Kommentares, des Ortes etc. funltioniert wunderbar. Aber sobald ich den ServerName wert Auslesen möchte, kriege ich NULL zurück.


    Hier ist der Quellcode des Aufrufes:

    [autoit]


    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $objWMIService = ObjGet("winmgmts:\\server1\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Printer", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) then

    [/autoit][autoit][/autoit][autoit]

    For $objItem In $colItems
    $Output = $Output & "\\server1\" & $objItem.Name & " "
    ;~ if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
    ;~ $Output=""
    Next
    GUICtrlSetData($List1,$Output)
    Else

    [/autoit][autoit][/autoit][autoit]

    Endif

    [/autoit]

    Das Funktioniert auch wunderbar. Ich kriege die Namen des Druckers aufgelistet. Wenn ich aber den wert "ServerName" auslesen möchte:

    [autoit]

    $objWMIService.ExecQuery("Select servername FROM Win32_Printer")

    [/autoit]


    passiert gar nichts, bzw. ich kriege keine ausgabe. Im Internet gibt es einige Scripte (Auch in anderen Scriptsprachen) wie man die ServerName ausliest, aber hier in meinem Fall scheint es nicht zu funktionieren. Mein Rechner läuft mit Windows Xp, der Server mit Windows 2003


    Für jede Hilfe wäre ich sehr dankbar, ich kann auch das komplette Script posten, aber es ist stark durcheinander und kaum Dokumentiert:

    [autoit]

    #include <GUIConstants.au3>
    #Include <GuiListView.au3>
    #include <ListboxConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    #Region ### START Koda GUI section ### Form=C:\Dokumente und Einstellungen\user\Eigene Dateien\Form1.kxf
    $Form1_1 = GUICreate("Form1", 633, 447, 369, 337)
    $List1 = GUICtrlCreateList("", 0, 56, 177, 383)
    $Label1 = GUICtrlCreateLabel("Druckerinstaller", 264, 8, 208, 28)
    GUICtrlSetFont(-1, 15, 400, 0, "MS Sans Serif")
    ;$Icon1 = GUICtrlCreateIcon("C:\WINDOWS\system32\shell32.dll", -17, 560, 8, 32, 32,, )
    $Label2 = GUICtrlCreateLabel("Verfügbare Drucker:", 8, 24, 100, 17)
    ;$Label3 = GUICtrlCreateLabel("", 376, 104, 4, 4)
    ;$Edit1 = GUICtrlCreateEdit("", 312, 80, 73, 49, $ES_WANTRETURN)
    GUICtrlSetData(-1, "verfügbare Drucker:")
    ;$Progress1 = GUICtrlCreateProgress(192, 416, 161, 25)
    ;$Label4 = GUICtrlCreateLabel("Label4", 440, 80, 36, 17)
    $Button1 = GUICtrlCreateButton("Installieren", 184, 72, 113, 57, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    AutoItSetOption("GUIDataSeparatorChar", " ")

    [/autoit][autoit][/autoit][autoit]

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItem = ""
    $Output=""
    $colItem2 = ""
    $Output2=""
    $strComputer = "wupper"

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Printer", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit][autoit][/autoit][autoit]

    If IsObj($colItems) then

    [/autoit][autoit][/autoit][autoit]

    For $objItem In $colItems
    $Output = $Output & "\\wupper\" & $objItem.Name & " "
    ;~ if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
    ;~ $Output=""
    Next
    GUICtrlSetData($List1,$Output)
    Else

    [/autoit][autoit][/autoit][autoit]

    Endif

    [/autoit][autoit][/autoit][autoit]

    $objWMIService2 = ObjGet("winmgmts:\\" & "spree" & "\root\CIMV2")
    $colItems2 = $objWMIService2.ExecQuery("SELECT * FROM Win32_Printer", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit][autoit][/autoit][autoit]

    If IsObj($colItems2) then

    [/autoit][autoit][/autoit][autoit]

    For $objItem2 In $colItems2
    $Output2 = $Output2 & $objItem2.Name & " "
    ;~ if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
    ;~ $Output=""
    Next
    GUICtrlSetData($List1,$Output2)
    Else

    [/autoit][autoit][/autoit][autoit]

    Endif
    $auswahl = 0
    $fArray = 0
    $auswahl = GUICtrlRead($List1)
    If $auswahl > 0 then
    MsgBox(1,"",$auswahl)
    EndIf
    $test = 0
    $test = $objWMIService.ExecQuery("Select servername FROM Win32_Printer where name='S6_Flur'")
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $auswahl = GUICtrlRead($List1)
    ;MsgBox(1,"",$objWMIService.ExecQuery("SELECT Status FROM Win32_Printer WHERE Name = S6_Flur", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly))
    MsgBox(1,"",$test)
    ;Run("rundll32 printui.dll,PrintUIEntry /q /in /n "& $auswahl,"",@SW_HIDE )
    EndSwitch
    WEnd

    [/autoit][autoit][/autoit][autoit][/autoit]

    4 Mal editiert, zuletzt von lordrobe (5. Mai 2008 um 10:12)

  • Das geht doch?

    [autoit]

    $test = $objWMIService.ExecQuery("Select ServerName FROM Win32_Printer")
    For $item In $test
    MsgBox(0, '', $item.ServerName)
    Next

    [/autoit]
    • Offizieller Beitrag

    Hallo,

    der ServerName kann nur bei Druckern ausgelesen werden die mit einem Printserver verbunden sind und nicht bei den Freigaben des Printservers. Wenn ich z.B. lokal eine Verbindung zu einem Drucker auf einem Printserver habe und von dem Drucker den zugehörigen Servernamen wissen will kann ich das über ServerName auslesen (select ServerName From Win32_Printer where Sharename = 'Druckerfreigabe').

    Was Du aulesen willst ist wahrscheinlich der SystemName (select SystemName FROM Win32_Printer).

  • Hallo Bernd, SystemName gibt genau den Wert aus den ich benötige! Da diese API nicht genau dokumentiert ist, habe ich einfach vermutet dass ServerName den Namen des Servers ausgibt, an dem der Drucker "freigegeben" ist. Scheint aber Systemname zu sein ;)


    Vielen Dank für Eure Hilfe, wenn das Script fertig ist, werde ich es hier zur Verfügung stellen.

  • Hmn, jetzt ergibt sich aber ein neues Problem, in der Abfrage kriege ich zwar den Systemnamen heraus, wenn ich das aber als Variable versuche, klappts nicht:


    [autoit]

    $objWMIService3 = ObjGet("winmgmts:\\" & "wupper" & "\root\CIMV2")
    $datenabfrage=$objWMIService3.ExecQuery("SELECT SystemName FROM Win32_Printer WHERE ShareName=$auswahl" , "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    If IsObj($datenabfrage) then
    For $wert In $datenabfrage
    $nachricht = $nachricht & $wert.SystemName & " "

    [/autoit]


    Wichtig ist halt die Variable $auswahl

    ich habe es auch so versucht:


    [autoit]

    $datenabfrage=$objWMIService3.ExecQuery("SELECT SystemName FROM Win32_Printer WHERE ShareName='$auswahl'" , "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit]

    klappt nicht (keine Ausgabe, auch im Debug nicht. Wenn ich die Variable Als festen Wert vergebe klappts:

    [autoit]

    $datenabfrage=$objWMIService3.ExecQuery("SELECT SystemName FROM Win32_Printer WHERE ShareName='Drucker_1'" , "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit]

    Wo liegt da der Denkfehler?

    Vielleicht wir die Variable wegen den "" nicht geparsed?