Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

WSH WMI Druckauftrag löschen "access denied"

nimmermann / 2 Antworten / Baumansicht Nickles

Hallo,
ich möchte über ein VBS-Script unter bestimmten Bedingungen Druckaufträge aus der printer queue löschen. Wenn ich bei dem gewünschten Objekt vom Typ Win32_Printer die Methode CancelAllJobs aufrufe, erhalte ich den Rückgabewert 5 (=access denied). Was muss ich tun, um den Druckauftrag löschen zu können? Hatte den Druckauftrag schließlich unter demselben Benutzerkonto erteilt...

Auch wenn ich die Aufträge über das Script PRNQCTL.vbs (standardmäßig bei WinXP dabei) zu löschen versuche, misslingt das:
--schnipp--
I:\\>cscript %windir%/system32/PRNQCTL.vbs -x -p "EPSON Stylus COLOR 760"
Microsoft (R) Windows Script Host, Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. Alle Rechte vorbehalten.
Fehlgeschlagen Löschen Win32-Fehlercode 5
--schnapp--

Hier der Quellcode meines Scripts:
--schnipp--
Option Explicit

Dim objWmi
Dim objW32Printr
Dim objPrintr
Dim rc

Set objWmi = GetObject("WinMgmts:")
Set objW32Printr = objWmi.InstancesOf("Win32_Printer")

For each objPrintr in objW32Printr
If (MsgBox( "Name: " & objPrintr.Name & vbCRLF &_
"Default: " & objPrintr.Default & vbCRLF &_
"Description: " & objPrintr.Description & vbCRLF &_
"Status: " & objPrintr.Status & vbCRLF &_
"StatusInfo: " & objPrintr.StatusInfo & vbCRLF &_
"PrinterStatus: " & objPrintr.PrinterStatus & vbCRLF &_
"ConfigManagerErrorCode: " & objPrintr.ConfigManagerErrorCode & vbCRLF &_
"DetectedErrorState: " & objPrintr.DetectedErrorState & vbCRLF &_
"ErrorDescription: " & objPrintr.ErrorDescription & vbCRLF &_
"ErrorInformation: " & objPrintr.ErrorInformation & vbCRLF &_
"ExtendedDetectedErrorState: " & objPrintr.ExtendedDetectedErrorState & vbCRLF &_
"ExtendedPrinterStatus: " & objPrintr.ExtendedPrinterStatus & vbCRLF &_
"LastErrorCode: " & objPrintr.LastErrorCode & vbCRLF &_
"Availability: " & objPrintr.Availability & vbCRLF & vbCRLF &_
"Alle Jobs beibehalten?" , vbYesNo + vbQuestion, "Drucker") = vbNo) Then
rc = objPrintr.CancelAllJobs()
Wscript.Echo "returnCode: " & rc
End If
Next
--schnapp--

Danke für eure Hilfe!

bei Antwort benachrichtigen
REPI nimmermann „WSH WMI Druckauftrag löschen "access denied"“
Optionen
rc = objPrintr.CancelAllJobs()

Hast Du oben nicht ein objW32Printr definiert und arbeitest dann beim Cancel-Befehl ohne W32?
Es empfiehlt sich immer, etwas Linux im Hause zu haben.
bei Antwort benachrichtigen
nimmermann Nachtrag zu: „WSH WMI Druckauftrag löschen "access denied"“
Optionen

Hallo repi,

objW32Printr enthält eine Sammlung von Objekten des Typs Win32_Printer. In der For-Schleife gehe ich die Sammlung durch. Das aktuelle Element in der Schleife, auf das ich schaue und mit dem ich arbeite, ist dann objPrintr.

Ich habe bereits ausprobiert: Wenn ich das Script über runas als Admin starte, bekomme ich keine Probleme. Nur kann ich das so nicht umsetzen, weil das Script automatisch ablaufen muss, ohne Kommunikation mit dem Benutzer (runas fragt schließlich nach dem Admin-Kennwort).
Ich vermute, dass man als eingeschränkter User nur die eigenen Druckaufträge und nicht alle löschen darf und deswegen CancelAllJobs() bei einem eingeschränkten User defaultmäßig "access denied" zurückmeldet.
Eigentlich würde es mir reichen, wenn der eingeschränkte Nutzer mit dem Script nur seine eigenen Druckaufträge löschen könnte. Zwar gibt es die Klasse Win32_PrintJob, aber damit kann man Druckaufträge nur anhalten und fortsetzen. Die Klasse enthält keine Methode zum Löschen des Auftrags. Gibt es irgendwo eine solche Methode, vielleicht in einer anderen Klasse??? Oder wie geht das???

Gruß
Daniel

bei Antwort benachrichtigen