Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SetDefaultPrinterA mit SYSTEM-Rechten unter Vista (https://www.delphipraxis.net/124158-setdefaultprintera-mit-system-rechten-unter-vista.html)

CodeX 15. Nov 2008 22:20


SetDefaultPrinterA mit SYSTEM-Rechten unter Vista
 
Ich habe das Problem, dass die Funktion SetDefaultPrinterA mit 1801 (Unbekannter Drucker) fehlschlägt, wenn das aktive Programm unter Vista mit SYSTEM-Rechten läuft (durch Service gestartet).

Unter XP funktioniert das gleiche Szenario problemlos. Unter Vista geht es auch, wenn das Programm mit normalen Rechten läuft.

Dem ganzen liegt die Funktion zu Grunde, die ich hier mit großer Hilfe von Dezipaitor erarbeitet habe. Das gestartete Programm hat damit also auch die Umgebung des angemeldeten Benutzers. Trotzdem werden die vorhandenen Drucker nicht erkannt. Der einzige Druckername, der als Fehlercode 0 liefert, ist "Microsoft XPS Document Writer". Da sich das aber dennoch nicht auf den Standarddrucker auswirkt, nehme ich an, dass hier eine andere Druckerliste angesprochen wird, als die des aktuellen Benutzers.
Woran könnte das liegen? Was kann man da machen?

Wenn jemand das Problem rekonstruieren will, bitte beispielsweise diese Funktion in ein Testprogramm packen und dieses mit diesem Tool von Dezipaitor mit SYSTEM-Rechten unter Vista starten.

(edit: Link korrigiert)

Dezipaitor 16. Nov 2008 07:50

Re: SetDefaultPrinterA mit SYSTEM-Rechten unter Vista
 
Zitat:

Das gestartete Programm hat damit also auch die Umgebung des angemeldeten Benutzers.
Das sieht nur so aus. Die Session ID ist dieselbe, aber sonst nutzt das Programm die Registrierungseinträge von SYSTEM.
Wenn ich notepad starte und drucken will, dann bekomme ich die im System installierten Drucker. Drucker von meinem Benutzer sind da nicht drin. Zudem darf man nicht erwarten, dass mit SYSTEM alles funktioniert. Da hat man soviel Macht, dass andere Komponenten mit diesem Account erst garnicht kommunizieren können - so funktioniert bei mir kein einziger Drucker. Hmm...

Aber warum willst du ein Prog mit SYSTEM Rechten standardmäßig laufen lassen? So ein Programm sollte wirklich nur zum Entwickeln und "ausprobieren" sein.


PS.
Der Link zur DelphiLibrary funkz nicht.

PPS.
Hast du den benutzer personifiziert?? (Impersonate)

CodeX 16. Nov 2008 14:13

Re: SetDefaultPrinterA mit SYSTEM-Rechten unter Vista
 
Zitat:

Zitat von Dezipaitor
Aber warum willst du ein Prog mit SYSTEM Rechten standardmäßig laufen lassen? So ein Programm sollte wirklich nur zum Entwickeln und "ausprobieren" sein.

Darüber hatten wirs ja nun schon ein paar Mal. ;) Das Programm ermöglicht dem Benutzer das Ändern diverser System-Einstellungen, ohne dass er dabei mit höheren Rechten eingeloggt sein muss oder irgendwelche Administrator-Passwörter für RunAs o.ä. kennen muss. Die Lösung mit dem Service funktioniert auch recht gut so weit und bis auf die Sache mit dem Drucker habe ich auch alles soweit anpassen können, dass es funktioniert.

Zitat:

Zitat von Dezipaitor
PS. Der Link zur DelphiLibrary funkz nicht.

Sorry, hab ich korrigiert.

Zitat:

Zitat von Dezipaitor
Hast du den benutzer personifiziert?? (Impersonate)

Ähm, nein, die Funktion ist so wie die verlinkte aus dem damaligen Thread. Naja, drum herum sind schon noch ein paar Sachen, wie z.B. zum Prüfen der Signatur etc.
Hast Du denn bei Deinem RunAsSYS gemacht? Das Resultat (ob durch meinen Service oder durch das Tool) ist ja wie gesagt das gleiche.

Edit: Ach nein, Du meinst im Programm selbst, oder? Nein, habe ich auch nicht. Ich werde das mal testen...

CodeX 16. Nov 2008 16:27

Re: SetDefaultPrinterA mit SYSTEM-Rechten unter Vista
 
Mit ImpersonateLoggedOnUser geht das. Vielen Dank für den Hinweis!
Ich dachte, dass das Mitgeben des EnvironmentBlocks im Prinzip das gleiche tut...

Dezipaitor 16. Nov 2008 17:34

Re: SetDefaultPrinterA mit SYSTEM-Rechten unter Vista
 
CreateProcessAsUser lässt einen neuen Prozess mit dem Token laufen.
Willst du Funktionen unter diesem Benutzer laufen lassen, dann muss es mit ImpersonateLoggedonUser gemacht werden. Dann bekommt der Thread das Token zugeteilt, welches die Funktionen verwenden - aber nicht alle! Damit nutzten die Funktionen auch die Registry-Einträge dieses Benutzers und damit alle seine Einstellungen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz