Ich verwende diesen Code, um eine PDF-Datei auf einem lokalen Drucker mit C # innerhalb eines Windows-Dienstes zu drucken.
Process process = new Process();
PrinterSettings printerSettings = new PrinterSettings();
if (!string.IsNullOrWhiteSpace(basePrint))
printerSettings.PrinterName = basePrint;
process.StartInfo.FileName = fileName;
process.StartInfo.Verb = "printto";
process.StartInfo.Arguments = "\"" + printerSettings.PrinterName + "\"";
process.Start();
process.WaitForInputIdle();
Alles funktioniert einwandfrei, wenn ich einen Benutzer so einstelle, dass er den Windows-Dienst ausführt.
Immer wenn ich diesen Code unter dem LocalSystem-Berechtigungsnachweis ausführe, erhalte ich die Fehlermeldung "Es ist keine Anwendung mit diesem Vorgang verknüpft", die normalerweise anzeigt, dass ich kein Programm habe, das für einen Druckvorgang einer Datei mit der Erweiterung .pdf bereit ist .
Mein Problem ist, dass ich das Programm (Foxit Reader) habe, um diesen Vorgang zu verarbeiten. Dies wird durch die Tatsache bestätigt, dass dieser Code mit einem bestimmten Benutzer funktioniert, der für den Dienst festgelegt wurde, und dass ich Dateien an den Drucker senden kann, indem ich mit der rechten Maustaste darauf klicke und Wählen Sie die Druckoption.
Kann ich etwas ändern, um innerhalb eines Dienstes ohne einen bestimmten Benutzer auf einem lokalen Drucker drucken zu können?
quelle
Antworten:
Am Ende habe ich pdfium verwendet, um die Arbeit zu erledigen. Mit diesem Code wird die PDF-Datei auch dann korrekt an den Drucker gesendet, wenn der Windows-Dienst unter dem LocalService-Benutzer ausgeführt wird.
Danke für die Antworten Jungs.
quelle
Das Problem kann sein, dass das SYSTEM-Konto (LocalSystem) nur über eingeschränkte Benutzeroberflächenfunktionen verfügt und möglicherweise Shell oder Shell-Erweiterungen entfernt oder deaktiviert werden. Und Verben sind eine Fähigkeit des Shell-Subsystems, insbesondere des Explorers.
Sie können das Programm manuell aufrufen, um festzustellen, ob dies der Fall ist oder ob es sich um ein Sicherheitsproblem oder einen Mangel an Benutzerprofildetails handelt.
Dazu müssen Sie in der Registrierung graben und Sie werden feststellen, dass viele Shell-Ausführungserweiterungsverben eine Befehlszeile haben.
Suchen Sie beispielsweise den Befehl HKEY_CLASSES_ROOT.pdf \ shell \ printto \ und verwenden Sie diesen Befehl.
Sie können auch überprüfen, ob das SYSTEM-Konto Zugriff auf diesen und den übergeordneten Schlüssel hat. (Selten der Fall, aber eine Überprüfung wert)
quelle
Sie können möglicherweise Ihren Arbeitscode ausführen, aber ein aktuell aktives Sitzungsbenutzertoken verwenden (aber ohne aktive Sitzung sollte dies nicht funktionieren).
Sie müssen die aktive Sitzungs-ID finden. Verwenden Sie für eine lokal geöffnete Sitzung Folgendes:
Suchen Sie dann nach einer geöffneten Sitzungs-ID:
Wenn nicht gefunden, suchen Sie eine RDP-Sitzung mit:
Damit bekommst du einen Token
Damit können Sie in einer geöffneten Benutzersitzung eine Exe vom lokalen Systemdienst ausführen.
Überprüfen Sie nun, ob Sie Ihren Code anpassen können
CreateProcessAsUSer(...)
In der Hoffnung, dass dieser Code Ihnen oder jemand anderem dient!
quelle
Könnte es sein, dass sich die PDF-Anwendung nicht in der systemweiten PATH-Variablen befindet, sondern nur unter Ihrem spezifischen Benutzer?
Ich denke, Ihr Problem tritt auf, weil der Benutzer des "lokalen Systems" keine richtige Anwendung findet, sodass Sie sie für ihn registrieren müssten. Da Sie bereits eine andere Antwort akzeptiert haben, werde ich nicht mehr Zeit darauf verwenden, aber wenn es weitere Fragen dazu gibt, fragen Sie bitte.
quelle