43344
Goto Top

BESCHREIBUNG des Drucker ports auslesen

Morgen zusammen,

nach toller Lösung des letzten Problems muss ich schon wieder eins anbringen face-sad

Wenn ein eingeschränkter Benutzer sich selber einen Drucker im Netzwerk verbindet, lautet die Beschreibung dieses Druckers: "Virtual printer port for USB/LPT". Wie kann ich per Skript darauf zugreifen? Ich dachte mir etwas wie:


if objItem.description <> "Virtual printer port for USB/LPT" then ......

Dummerweise ist objItem.description leer und ich habe keine Ahnung, wohin diese Information geschrieben wird ... kann mir da jemand auf die Sprünge helfen????

Content-Key: 53628

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

Printed on: April 23, 2024 at 21:04 o'clock

Member: bastla
bastla Mar 09, 2007 at 11:17:08 (UTC)
Goto Top
Hallo Stylewalker!

Vorläufig kann ich Dich nur einmal zur MS-eigenen Doku verweisen, wo Du alle Eigenschaften aufgelistet findest, bzw Dir folgendes Script aus dem gleichen Hause zur Anzeige dieser Eigenschaften anbieten - vielleicht findest Du ja was:
strComputer = "."   
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")   
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_Printer",,48)   
For Each objItem in colItems 
    Wscript.Echo "-----------------------------------"  
    Wscript.Echo "Win32_Printer instance"  
    Wscript.Echo "-----------------------------------"  
    Wscript.Echo "Attributes: " & objItem.Attributes  
    Wscript.Echo "Availability: " & objItem.Availability  
    Wscript.Echo "AveragePagesPerMinute: " & objItem.AveragePagesPerMinute  
    If isNull(objItem.Capabilities) Then
        Wscript.Echo "Capabilities: "  
    Else
        Wscript.Echo "Capabilities: " & Join(objItem.Capabilities, ",")  
    End If
    If isNull(objItem.CapabilityDescriptions) Then
        Wscript.Echo "CapabilityDescriptions: "  
    Else
        Wscript.Echo "CapabilityDescriptions: " & Join(objItem.CapabilityDescriptions, ",")  
    End If
    Wscript.Echo "Caption: " & objItem.Caption  
    Wscript.Echo "ConfigManagerErrorCode: " & objItem.ConfigManagerErrorCode  
    Wscript.Echo "ConfigManagerUserConfig: " & objItem.ConfigManagerUserConfig  
    Wscript.Echo "CreationClassName: " & objItem.CreationClassName  
    Wscript.Echo "DefaultPriority: " & objItem.DefaultPriority  
    Wscript.Echo "Description: " & objItem.Description  
    Wscript.Echo "DetectedErrorState: " & objItem.DetectedErrorState  
    Wscript.Echo "DeviceID: " & objItem.DeviceID  
    Wscript.Echo "DriverName: " & objItem.DriverName  
    Wscript.Echo "ErrorCleared: " & objItem.ErrorCleared  
    Wscript.Echo "ErrorDescription: " & objItem.ErrorDescription  
    Wscript.Echo "HorizontalResolution: " & objItem.HorizontalResolution  
    Wscript.Echo "InstallDate: " & objItem.InstallDate  
    Wscript.Echo "JobCountSinceLastReset: " & objItem.JobCountSinceLastReset  
    If isNull(objItem.LanguagesSupported) Then
        Wscript.Echo "LanguagesSupported: "  
    Else
        Wscript.Echo "LanguagesSupported: " & Join(objItem.LanguagesSupported, ",")  
    End If
    Wscript.Echo "LastErrorCode: " & objItem.LastErrorCode  
    Wscript.Echo "Location: " & objItem.Location  
    Wscript.Echo "Name: " & objItem.Name  
    If isNull(objItem.PaperSizesSupported) Then
        Wscript.Echo "PaperSizesSupported: "  
    Else
        Wscript.Echo "PaperSizesSupported: " & Join(objItem.PaperSizesSupported, ",")  
    End If
    Wscript.Echo "PNPDeviceID: " & objItem.PNPDeviceID  
    Wscript.Echo "PortName: " & objItem.PortName  
    If isNull(objItem.PowerManagementCapabilities) Then
        Wscript.Echo "PowerManagementCapabilities: "  
    Else
        Wscript.Echo "PowerManagementCapabilities: " & Join(objItem.PowerManagementCapabilities, ",")  
    End If
    Wscript.Echo "PowerManagementSupported: " & objItem.PowerManagementSupported  
    If isNull(objItem.PrinterPaperNames) Then
        Wscript.Echo "PrinterPaperNames: "  
    Else
        Wscript.Echo "PrinterPaperNames: " & Join(objItem.PrinterPaperNames, ",")  
    End If
    Wscript.Echo "PrinterState: " & objItem.PrinterState  
    Wscript.Echo "PrinterStatus: " & objItem.PrinterStatus  
    Wscript.Echo "PrintJobDataType: " & objItem.PrintJobDataType  
    Wscript.Echo "PrintProcessor: " & objItem.PrintProcessor  
    Wscript.Echo "SeparatorFile: " & objItem.SeparatorFile  
    Wscript.Echo "ServerName: " & objItem.ServerName  
    Wscript.Echo "ShareName: " & objItem.ShareName  
    Wscript.Echo "SpoolEnabled: " & objItem.SpoolEnabled  
    Wscript.Echo "StartTime: " & objItem.StartTime  
    Wscript.Echo "Status: " & objItem.Status  
    Wscript.Echo "StatusInfo: " & objItem.StatusInfo  
    Wscript.Echo "SystemCreationClassName: " & objItem.SystemCreationClassName  
    Wscript.Echo "SystemName: " & objItem.SystemName  
    Wscript.Echo "TimeOfLastReset: " & objItem.TimeOfLastReset  
    Wscript.Echo "UntilTime: " & objItem.UntilTime  
    Wscript.Echo "VerticalResolution: " & objItem.VerticalResolution  
Next

Grüße
bastla
Mitglied: 43344
43344 Mar 09, 2007 at 12:57:12 (UTC)
Goto Top
Danke erstmal, steht leider nicht drin was ich suche face-sad

Ich bin bisher soweit:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")

Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_Printer")
For Each objItem in colItems
If objItem.Workoffline = True Then
objItem.Workoffline = False
objItem.Put_
End If
Next

If CheckAndSet("LPT%:") Then WScript.Quit
If CheckAndSet("USB%") Then WScript.Quit
If CheckAndSet("%38PCX%") Then WScript.Quit
r = CheckAndSet("%")

Function CheckAndSet(sPort)
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_Printer WHERE PortName LIKE '" & sPort & "'",,48)
For Each objItem in colItems
if objItem.portname <> "Microsoft Document Imaging Writer Port:" & "FreePDFXP1:" then _
if objItem.Name <> "\\C38PCX%" then objItem.SetDefaultPrinter()


In der letzten Zeile liegt der Hase begraben: er frisst irgendwie das % Zeichen nicht und "NOT LIKE" als Vergleichsoperator haut auch nicht hin. Hast du ne Idee, wie ich aus der Nummer rauskomme?
Member: bastla
bastla Mar 09, 2007 at 13:57:06 (UTC)
Goto Top
Hallo Stylewalker!

Wenn's nur darum geht, den Anfang eines Strings zu vergleichen, kannst Du es ja etwa so versuchen:
If UCase(Left(objItem.Name, Len("\\C38PCX"))) <> UCase("\\C38PCX") Then objItem.SetDefaultPrinter()  
Die Längenermittlung ist für den Fall gedacht, dass "\\C38PCX" in eine Variable ausgelagert wird und daher nicht einfach davon ausgegeangen werden kann, dass die ersten 8 Stellen überprüft werden - kürzer, aber weniger flexibel wäre demnach:
If UCase(Left(objItem.Name, 8)) <> UCase("\\C38PCX") Then objItem.SetDefaultPrinter()  
Noch zum UCase(): Um bei Stringvergleichen das Problem Groß-/Kleinschreibung zu eliminieren, bringe ich beide Strings in einen definierten Zustand (in diesem Fall Großschreibung).
Was mir noch auffällt: Meinst Du mit
... <> "Microsoft Document Imaging Writer Port:" & "FreePDFXP1:" ...  
weder / noch? In diesem Fall müsstest Du schreiben:
if objItem.portname <> "Microsoft Document Imaging Writer Port:" And objItem.portname <> "FreePDFXP1:" Then  

Grüße
bastla
Mitglied: 43344
43344 Mar 09, 2007 at 14:12:39 (UTC)
Goto Top
Hmmm, sieht gut aus, geht aber auch nicht face-sad

Das % Zeichen (oder was auch immer ich da einsetzen muss) brauche ich als Platzhalter für mind. 5 immer unterschiedliche Zeichen.

Hintergrund:

Netzwerkdrucker, die sich ein Benutzer selbst verbinden kann werden auf dem Port erkannt, an dem sie am Host PC hängen. Wechselt der Benutzer den PC soll ein lokal vorhandener Drucker als Standard gewählt werden. Die Info was das für ein Drucker ist will teilweise über die Ports (Microsoft und PDF) teils über den Namen (\\C38PCX = Teil des PC-Namens) ziehen und dementsprechend aussortieren.


Gruß

ps.: ja, meinte weder/noch ... ;)
Member: bastla
bastla Mar 09, 2007 at 15:28:58 (UTC)
Goto Top
Hallo Stylewalker!

Das % Zeichen (oder was auch immer ich da einsetzen muss) brauche ich als Platzhalter für mind. 5 immer unterschiedliche Zeichen.
Du brauchst es nicht: Es soll ja symbolisieren, dass nach den ersten 8 Stellen beliebige weitere folgen können - genau das macht aber die von mir vorgeschlagene Änderung: es wird nur der Anfang verglichen (verbunden wird demnach, wenn der Druckername nicht mit "\\C38PCX" beginnt) ...

Zur Sicherheit nochmals die ganze Zeile:
If objItem.portname <> "Microsoft Document Imaging Writer Port:" And objItem.portname <> "FreePDFXP1:" Then If UCase(Left(objItem.Name, Len("\\C38PCX"))) <> UCase("\\C38PCX") Then objItem.SetDefaultPrinter()  

Grüße
bastla