![]() |
Elevated Autostart trotz aktivierter UAC?
Hallo zusammen,
ich suche nach einer Möglichkeit ein Programm so in den Autostart einzutragen, dass es sich auch bei aktivierter UAC mit elevated Rechten startet. Hierzu sind mir bisher zwei Wege bekannt:
Ich denke mal beide Wege haben ihre Vor- und Nachteile, allerdings konnte ich mich noch nicht festlegen und hoffe deshalb von euch eine Entscheidungshilfe zu bekommen. Spontan stellen sich mir folgende Fragen:
Welchen Weg würdet ihr wählen? Viele Grüße Zacherl |
AW: Elevated Autostart trotz aktivierter UAC?
Es gibt noch eine weitere Möglichkeit: Programme wie
![]() ![]() Tja, bei manchen Dingen wünscht man sich eben doch ein SuperUser/SUID-Flag wie bei Linux ;). MfG Dalai |
AW: Elevated Autostart trotz aktivierter UAC?
Danke für den Tipp, aber ich möchte meinen Usern keine Fremdsoftware aufzwingen. In diesem Falle kann ich auch mit der Service Lösung arbeiten. Ich bin mir ziemlich sicher, dass die genannten Tools das ebenfalls so lösen.
Momentan schaue ich mir grade den Task Scheduler an. Habe mir die Typenbibliothek einfach über Delphi importieren können. Leider schaffe ich es bisher nicht, einen Task zu erstellen, der für alle Benutzer(gruppen) triggert und immer im Kontext des aktuell angemeldeten Users läuft. |
AW: Elevated Autostart trotz aktivierter UAC?
Zitat:
Zitat:
MfG Dalai |
AW: Elevated Autostart trotz aktivierter UAC?
Zitat:
![]() Ich spiele mal noch ein wenig mit der Task Scheduler API rum. Vielleicht bekomme ich es ja noch hin, ansonsten uppe ich mal meinen Ansatz und hoffe auf irgendjemanden, der sich mit sowas auskennt :-D |
AW: Elevated Autostart trotz aktivierter UAC?
Zitat:
Zitat:
MfG Dalai |
AW: Elevated Autostart trotz aktivierter UAC?
Zitat:
Habe es mit der Task Scheduler API endlich hinbekommen. Der Trick war, keine UserId anzugeben und dafür die SID der gewünschten Benutzergruppe im GroupId Feld des Principal Objektes einzutragen. Folgender Code ist nur ein Test Code und deshalb alles andere als schön, aber alle, die ein ähnliches Problem haben, können sich hier an der Vorgehensweise orientieren:
Delphi-Quellcode:
Der Code fügt einen neuen Task hinzu, der beim Login aller Benutzer des Computers triggert und die notepad.exe ausführt. Hierbei wird der Prozess UAC elevated, wenn es sich beim aktuellen Benutzer um einen Administrator User handelt. Lauffähig sollte das ganze ab Windows Vista sein.
procedure TForm10.Button1Click(Sender: TObject);
const RPC_C_AUTHN_LEVEL_PKT_PRIVACY = 6; const RPC_C_IMP_LEVEL_IMPERSONATE = 3; var Res: HRESULT; TaskService: ITaskService; RootFolder: ITaskFolder; TaskDefinition: ITaskDefinition; TaskTrigger: ITrigger; LogonTrigger: ILogonTrigger; TaskAction: IAction; ExecAction: IExecAction; RegisteredTask: IRegisteredTask; begin // Res := CoInitializeEx(nil, COINIT_MULTITHREADED); Res := CoInitialize(nil); if FAILED(Res) then begin raise Exception.CreateFmt('CoInitializeEx failed: 0x%x', [Res]); end; Res := CoInitializeSecurity(nil, -1, nil, nil, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE, nil, 0, nil); if FAILED(Res) then begin raise Exception.CreateFmt('CoInitializeSecurity failed: 0x%x', [Res]); end; Res := CoCreateInstance(CLASS_TaskScheduler_, nil, CLSCTX_INPROC_SERVER, IID_ITaskService, TaskService); if FAILED(Res) then begin raise Exception.CreateFmt('Failed to create an instance of ITaskService: 0x%x', [Res]); end; try TaskService.Connect(NULL, NULL, NULL, NULL); except on E: EOleException do raise Exception.CreateFmt('Failed to connect to task service: 0x%x', [E.ErrorCode]); end; try RootFolder := TaskService.GetFolder('\'); except on E: EOleException do raise Exception.CreateFmt('Could not get the root folder: 0x%x', [E.ErrorCode]); end; try TaskDefinition := TaskService.NewTask(0); except on E: EOleException do raise Exception.CreateFmt('Failed to create a task definition: 0x%x', [E.ErrorCode]); end; TaskDefinition.RegistrationInfo.Author := 'Zacherl'; TaskDefinition.Settings.AllowDemandStart := false; TaskDefinition.Settings.StartWhenAvailable := true; TaskDefinition.Settings.StopIfGoingOnBatteries := false; TaskDefinition.Settings.DisallowStartIfOnBatteries := false; TaskDefinition.Settings.AllowHardTerminate := false; TaskDefinition.Settings.RunOnlyIfNetworkAvailable := false; TaskDefinition.Settings.RunOnlyIfIdle := false; // No ExecutionTimeLimit TaskDefinition.Settings.ExecutionTimeLimit := 'PT0S'; // Allow multiple instances TaskDefinition.Settings.MultipleInstances := TASK_INSTANCES_PARALLEL; TaskDefinition.Principal.LogonType := TASK_LOGON_GROUP; // Trigger task for SID S-1-1-0 = All Users TaskDefinition.Principal.GroupId := 'S-1-1-0'; // UAC Elevation if possible (admin privileges) TaskDefinition.Principal.RunLevel := TASK_RUNLEVEL_HIGHEST; TaskTrigger := TaskDefinition.Triggers.Create(TASK_TRIGGER_LOGON); Res := TaskTrigger.QueryInterface(IID_ILogonTrigger, LogonTrigger); if FAILED(Res) then begin raise Exception.CreateFmt('QueryInterface call failed for ILogonTrigger: 0x%x', [Res]); end; LogonTrigger.Id := 'LoggonTriggerTestId'; TaskAction := TaskDefinition.Actions.Create(TASK_ACTION_EXEC); Res := TaskAction.QueryInterface(IID_IExecAction, ExecAction); if FAILED(Res) then begin raise Exception.CreateFmt('QueryInterface call failed for IExecAction: 0x%x', [Res]); end; ExecAction.Path := 'C:\Windows\notepad.exe'; RegisteredTask := RootFolder.RegisterTaskDefinition('LogonTaskTest', TaskDefinition, TASK_CREATE_OR_UPDATE, NULL, NULL, TASK_LOGON_GROUP, NULL) end; |
AW: Elevated Autostart trotz aktivierter UAC?
Vielleicht könnte auch das Microsoft Application Compatibility Toolkit helfen. Mit dem Compatibility Administrator ist es dann möglich anhand festgelegter Kriterien, Programm automatisch mit ausgewählten Rechten zu starten.
Nutze ich z.B. für SpeedFan etc. |
AW: Elevated Autostart trotz aktivierter UAC?
Mit der Funktion
Delphi-Quellcode:
kann du das Prüfen der HRESULTs vereinfachen.
OleCheck()
Delphi-Quellcode:
//
OleCheck(CoInitialize(nil)); OleCheck(CoInitializeSecurity(nil, -1, nil, nil, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE, nil, 0, nil)); |
AW: Elevated Autostart trotz aktivierter UAC?
Zitat:
Zitat:
Im Nachhinein habe ich allerdings bemerkt, dass der Task Scheduler auf eingeschränkten Konten natürlich trotz TASK_RUNLEVEL_HIGHEST keine Prozesse mit Adminrechten starten kann. Ich werde mir nun mal ein Testprogramm für die Service Lösung basteln. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz