Die hier im Forum genannte Lösung mit „Sys_GetSpooler“ funktioniert nur auf den ersten Blick.
Ist der Drucker nämlich bereits angeschaltet weil kurz vorher gedruckt wurde, bleibt der Auftrag nicht lange genug im Spooler um durch Polling erkannt zu werden. Das hat zur Folge, dass mitten im Druck ausgeschaltet wird. Der Druckauftrag ist weg, und man darf meist auch noch einen Papierstau beseitigen.
Nachdem ich mich nun fast ein Jahr immer wieder darüber geärgert habe, habe ich eine deutlich zuverlässigere Lösung gefunden, bei der das Einschalten ereignisabhängig erfolgt.
Zunächst muss das Überwachen von Objekten per lokaler Sicherheitsrichtlinie ermöglicht werden.
Unter Windows XP also ‚Verwaltung‘ -> ‚lokale Sicherheitsrichtlinie‘ -> ‚lokale Richtlinien‘ -> ‚Überwachungsrichtlinien‘ -> ‚Objektzugriffsversuche überwachen‘. Dort das Häkchen bei erfolgreichen Zugriffen setzen.
Anschliessend in den Sicherheitseinstellungen des Druckers die Überwachung aktivieren:
‚Druckereigenschaften‘ -> ‚Sicherheit‘ -> ‚Erweitert‘ -> ‚Überwachung‘ -> ‚Benutzer‘ hinzufügen und den erfolgreichen Zugriff auf das Drucken markieren. Das Lesen der Berechtigung wird automatisch mitüberwacht.
Dann erstellt man per CMD einen Eventtrigger, der bei dem entsprechenden Ereignis ausgelöst wird. Dieser startet ein VB-Script, das wiederum eine URL in IPS aufruft. Etwas kompliziert, aber so funktioniert es.
Das Script heisst bei mir ‚Drucker_einschalten.vbs‘ und liegt in C:. Daraus ergibt sich folgender Befehl zum Einrichten des Eventtriggers:
eventtriggers /create /l Security /eid 560 /tr „Drucker einschalten“ /tk C:\Drucker_einschalten.vbs
Das Script hat folgenden Inhalt:
Dim objWMIService
Dim colLoggedEvents
Dim objEvent
Dim http 'As New MSXML2.XMLHTTP
Set http = CreateObject("MSXML2.ServerXMLHTTP")
Set objWMIService = GetObject("winmgmts:{(Security)}\\.\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery("Select * from Win32_NTLogEvent Where Logfile = 'security' AND EventCode = 560")
For Each objEvent In colLoggedEvents
URL = "http://127.0.0.1/user/DruckerEinschalten.php"
FormData = "p=" & objEvent.Message
http.Open "POST", URL, False
http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
http.send FormData
exit for
Next
Jetzt fehlt lediglich noch das Script im IPS, bei mir hat den Namen ‚DruckerEinschalten.php‘ und liegt im user-Verzeichnis des Webfronts.
<?
if (!isset($_POST['p'])) {
return;
}
if (strpos($_POST['p'], "Drucker") === false) {
} else {
FS20_SwitchDuration(#####,true,180);
}
?>
Unter Windows Vista und 7 ist die Sache etwas einfacher, aber vom Prinzip her identisch.