chrrs83
Goto Top

Powershell Get-WMIObject

Hiho,

und die besten grüße aus Braunschweig.
Ich bastel mir imo ein kleines Tool (GUI), das folgendes können muss:
- alle installierten Drucker auslesen
- Druckerspooler starten/stoppen/restarten
- den Drucker Status auslesen kann und Fehler anzeigt

- und es soll die Möglichkeit geben die Druckaufträge für den ausgewählten Drucker zu löschen
HIER HABE ICH MEIN PROBLEM!

Und zwar:


$global:AllPrinter = Get-WmiObject Win32_Printer -ErrorAction SilentlyContinue

(Get-WmiObject -Class win32_printer -Filter "name=$allprinter[$LSTBox.SelectedIndex].name").CancelAllJobs()


In einer Listbox sind alle installierten Drucker eingetragen. Ich rufe den Index der ListBox ab, um den ausgewählten
Drucker herauszufinden. Beim ausführen kommt aber folgende Fehlermeldung


Get-WmiObject : Die Anfrage ist ungültig. "select * from win32_printer where name=\\PC12004\root\cimv2:Win32_Printer.DeviceID="Kyocera TASKalfa 3500i KX"
\\PC12004\root\cimv2:Win32_Printer.DeviceID="\\\\sv09004v02\\DR10016" \\PC12004\root\cimv2:Win32_Printer.DeviceID="\\\\sv09004v02\\Farblaser-Verwaltung"[System.Windows.Forms.ListBox,
Items.Count: 3, Items[0]: Kyocera TASKalfa 3500i KX.SelectedIndex].name"
In C:\print_device_mngr_gui.ps1:107 Zeichen:15

back-to-top$Test = (Get-WmiObject -Class win32_printer -Filter "name=$allprinter[$LSTB ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidArgument: (face-smile [Get-WmiObject], ManagementException
+ FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\print_device_mngr_gui.ps1:107 Zeichen:5

back-to-top$Test = (Get-WmiObject -Class win32_printer -Filter "name=$allprinter[$LSTB ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull


Hat jemand eine Lösung oder Denkanstoss für mich.

Danke schon mal im Voraus.


Gruß

Chris

Content-ID: 227956

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

Ausgedruckt am: 22.11.2024 um 07:11 Uhr

colinardo
colinardo 28.01.2014 aktualisiert um 15:23:08 Uhr
Goto Top
Hallo Chris, Wilkommen im Forum!
das kann ja wohl unmöglich der Name deines Druckers sein:
\\PC12004\root\cimv2:Win32_Printer.DeviceID="Kyocera TASKalfa 3500i KX"
der solltte wohl eher
Kyocera TASKalfa 3500i KX
lauten. Deswegen ist das Objekt Leer und hat keine Methode mit CancelJobs also musst du den korrekten Namen noch zurechtstutzen oder deine Listbox mit den richtigen Namen füllen wie hier:
gwmi "Win32_Printer" | %{$LSTBox.Items.Add($_.Name)}

Grüße Uwe
chrrs83
chrrs83 28.01.2014 aktualisiert um 15:30:02 Uhr
Goto Top
Hiho und danke für´s willkommen heißen face-smile

Das habe ich mir auch schon gedacht und mir mal die Variable ausgeben lassen:

Ergebniss:

$Auswahl = $AllPrinter[$LSTBox.SelectedIndex].name
Write-Host $Auswahl

Kyocera TASKalfa 3500i KX

Der Listbox Eintrag dient mir in erster Linie ja nur als Index für mein $AllPrinter Array. Ich lese ja die Namen direkt aus dem Array.

Hmm.... sollte ja dann passen.
colinardo
colinardo 28.01.2014 aktualisiert um 15:35:56 Uhr
Goto Top
sehe glaub ich deinen Fehler:
schreib die Zeile mal so:
(Get-WmiObject -Class win32_printer -Filter "Name='$($allprinter[$LSTBox.SelectedIndex].name)'").CancelAllJobs()
chrrs83
chrrs83 28.01.2014 um 15:35:59 Uhr
Goto Top
Danke schon mal für deine Bemühungen... wirklich.

Wenn ich das so änder kommt die folgende Fehlermeldung:

get-wmiobject : Die Anfrage ist ungültig. "select * from win32_printer where name=Kyocera TASKalfa 3500i KX"
In C:\Users\halasz\Documents\001. Powershell\print_device_mngr_gui.ps1:110 Zeichen:6

back-to-top(get-wmiobject -class win32_printer -Filter "name=$($AllPrinter[$LSTBox.Sele ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidArgument: (face-smile [Get-WmiObject], ManagementException
+ FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\Users\halasz\Documents\001. Powershell\print_device_mngr_gui.ps1:110 Zeichen:57

back-to-top(get-wmiobject -class win32_printer -Filter "name=$($AllPrinter[$LSTBox.Sele ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
colinardo
colinardo 28.01.2014 aktualisiert um 15:39:09 Uhr
Goto Top
hatte den Code nochmal nachträglich geändert, dir fehlen die einfachen Anführungszeichen um den Namen in der SQL Query
chrrs83
chrrs83 28.01.2014 aktualisiert um 15:45:03 Uhr
Goto Top
Hab ich bemerkt und dann auch richtig übertragen:

Jetzt erhalte ich den Fehler bei 2 von 3 Testdruckern...

Der Eintrag geht: Kyocera TASKalfa 3500i KX
Der Eintrag geht nicht: \\sv09004v02\DR10016

Zwei verschiedene Drucker... kann das sein das der Name wegen den "\\" nicht genommen wird bzw. genommen werden kann?

Leider ist das aber der Druckername wie er ihn durch Get-WMIObject ausliest!

Oder soll ich dort den Sharename nehmen?
colinardo
colinardo 28.01.2014 aktualisiert um 15:46:19 Uhr
Goto Top
Zitat von @chrrs83:

Hab ich bemerkt und dann auch richtig übertragen:

Jetzt erhalte ich den Fehler bei 2 von 3 Testdruckern...

Der Eintrag geht: Kyocera TASKalfa 3500i KX
Der Eintrag geht nicht: \\sv09004v02\DR10016
hast du bzw. dein Script denn überhaupt die entsprechenden Berechtigungen die Warteschlange des Netzwerkdruckers zu löschen ? Normale User dürfen das nämlich normalerweise nicht
chrrs83
chrrs83 28.01.2014 um 15:46:19 Uhr
Goto Top
Ich danke schon mal für alle Einträge... bin jetzt erstmal im Aussendienst und erst gg Abend oder morgen früh wieder da.
chrrs83
chrrs83 28.01.2014 um 15:49:26 Uhr
Goto Top
Die habe ich... mein Script prüft vorab sogar den Status:

$objIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$objSecPrinc = New-Object System.Security.Principal.WindowsPrincipal($objIdentity)

if(!$objSecPrinc.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
{
........
}

Oder meinst du das die Berechtigungen nicht ausreichen könnten? Du magst recht haben...

Was mich aber da noch stört, das beim ersten Eintrag alles wunderbar klappt (druch deine Hilfe)... nur bei den anderen beiden (noch) nicht.
colinardo
Lösung colinardo 28.01.2014, aktualisiert am 29.01.2014 um 07:58:42 Uhr
Goto Top
Schreib die Zeile besser so, dann bekommst du keine Probleme mit Backslashes im SQL-Filter
Get-WmiObject -Class win32_printer | ?{$_.Name -eq $allprinter[$LSTBox.SelectedIndex].name} | %{$_.CancelAllJobs()}
in SQL müssten die nämlich alle verdoppelt werden. Wenn dir obige Zeile nicht in den Kram passt face-wink dann mach sie so: die ersetzt eventuell vorhandene Backslashes durch doppelte:
(Get-WmiObject -Class win32_printer -Filter "Name='$($allprinter[$LSTBox.SelectedIndex].name.Replace("\","\\"))'").CancelAllJobs()
chrrs83
chrrs83 29.01.2014 um 07:40:37 Uhr
Goto Top
Hab deine Zeile mal übernommen... und siehe da es klappt face-smile
Vielen dank dafür!

Ich werde sicherlich, in meinem Projekt, die ein oder andere Frage haben. Also sehen wir uns in Zukunft sicherlich öfter .
Bis dahin alles gute und danke.


Gruß
145920
145920 03.09.2020 aktualisiert um 13:33:31 Uhr
Goto Top
hallo,

Get-WmiObject -Class win32_printer | ?{$_.Name -eq $allprinter[$LSTBox.SelectedIndex].name} | %{$_.CancelAllJobs()}


hab den Befehl nun bei mir ausprobiert, aber ich bekomme natürlich einen Fehler. Es hängt mit dem Array zusammen, da es bei mir natürlich leer ist. Denke ich zumindest. Fehlermeldung sieht wie folgt aus:

Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In Zeile:1 Zeichen:40

back-to-top... printer | ?{$_.Name -eq $allprinter[$LSTBox.SelectedIndex].name} | %{ ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile , RuntimeException
+ FullyQualifiedErrorId : NullArray

Ist meine Vermutung mit dem leeren Array richtig?

Gruß Saih
145916
145916 03.09.2020 aktualisiert um 14:13:59 Uhr
Goto Top
da es bei mir natürlich leer ist.
Dann ist die Fehlermeldung ja auch logisch face-smile.
Ist meine Vermutung mit dem leeren Array richtig?
Klar, wenn ein Objekt leer($null) ist gibt es auch keine gültigen Indexe.
Also vorher einfach mit ner IF prüfen ob überhaupt was gewählt wurde.
145920
145920 03.09.2020 aktualisiert um 14:15:47 Uhr
Goto Top
Kann man diese IF-Abfrage in den Befehl einbauen? Ist das möglich?
145916
145916 03.09.2020 aktualisiert um 14:16:54 Uhr
Goto Top
Zitat von @145920:

Kann man diese IF-Abfrage in den Befehl einbauen? Ist das möglich?
Klar, einfach drum rum bauen
if($allprinter){
    # ........
}

Btw. RTFM !
https://www.windowspro.de/script/if-else-switch-bedingte-anweisungen-pow ...