AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Elevated Autostart trotz aktivierter UAC?
Thema durchsuchen
Ansicht
Themen-Optionen

Elevated Autostart trotz aktivierter UAC?

Ein Thema von Zacherl · begonnen am 16. Apr 2013 · letzter Beitrag vom 17. Apr 2013
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Elevated Autostart trotz aktivierter UAC?

  Alt 16. Apr 2013, 19:34
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:
  1. System Service, der bei Benutzeranmeldung den Prozess im jeweiligen Kontext startet
  2. Autostart über den Windows Task Scheduler

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:
  1. Service: Ist es möglich aus dem Service heraus festzustellen, wenn sich ein (neuer) Benutzer am Computer anmeldet? Optimalerweise über ein Event oder irgendwelche Messages, so dass ich nich pollen müsste. Periodisches Prüfen der active session id würde ich aus mehreren Gründen gerne vermeiden.
  2. Scheduler: Wenn ich "per Hand" über die Systemsteuerung ein Event im Scheduler eintrage, werde ich gefragt, welcher Benutzerkontext verwendet werden soll. Kann ich dies auch dynamisch einstellen, sodass immer der Kontext des aktuell angemeldeten Benutzers verwendet wird?
  3. Scheduler: Gibt es irgendwo eine gute Delphi Dokumentation oder ein Beispiel, was zeigt, wie ich per API einen neuen Task beim Scheduler eintragen kann? Im MSDN finde ich zwar eine ganze Menge, aber ich würde die zahlreichen Interfaces ungerne per Hand übersetzen.

Welchen Weg würdet ihr wählen?

Viele Grüße
Zacherl
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (16. Apr 2013 um 23:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#2

AW: Elevated Autostart trotz aktivierter UAC?

  Alt 16. Apr 2013, 20:42
Es gibt noch eine weitere Möglichkeit: Programme wie RunAs Professional (Shareware) oder RunAsSpc (Freeware). Bei ersterem bin ich mir sicher, dass es funktioniert, weil ich es gerade getestet habe.

Tja, bei manchen Dingen wünscht man sich eben doch ein SuperUser/SUID-Flag wie bei Linux .

MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Elevated Autostart trotz aktivierter UAC?

  Alt 16. Apr 2013, 21:49
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#4

AW: Elevated Autostart trotz aktivierter UAC?

  Alt 16. Apr 2013, 22:00
Danke für den Tipp, aber ich möchte meinen Usern keine Fremdsoftware aufzwingen.
OK, verstehe. Ich hab den Tip nur aus Sicht eines Admins gegeben .

Zitat:
Ich bin mir ziemlich sicher, dass die genannten Tools das ebenfalls so lösen.
RunAs Professional hat keinen Service (ist eh nur ein ganz kleines in Visual Basic geschriebenes Programm). Wie die das machen: *noahnung*.

MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Elevated Autostart trotz aktivierter UAC?

  Alt 16. Apr 2013, 22:04
Zitat:
Ich bin mir ziemlich sicher, dass die genannten Tools das ebenfalls so lösen.
RunAs Professional hat keinen Service (ist eh nur ein ganz kleines in Visual Basic geschriebenes Programm). Wie die das machen: *noahnung*.
Es gäbe noch eine dritte Möglichkeit, die dein Tool vermutlich dann auch benutzt. Wenn man einen Benutzernamen und ein Kennwort hinterlegt, kann ja einfach MSDN-Library durchsuchenCreateProcessAsUser verwendet werden. Meine Software wollte ich allerdings so flexibel und einfach wie möglich halten.

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
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (16. Apr 2013 um 23:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#6

AW: Elevated Autostart trotz aktivierter UAC?

  Alt 16. Apr 2013, 22:09
[...] die dein Tool vermutlich dann auch benutzt.
Mein Tool? Nein, das stammt nicht von mir, aber ich habe es gekauft, weil es überall gebraucht wird, um Software wie Motherboard Monitor, SpeedFan, Active SMART (in einer alten Version) usw. mit Adminrechten zu starten, weil der Zugriff auf Sensoren und Festplatten nur so möglich ist.

Zitat:
Wenn man einen Benutzernamen und ein Kennwort hinterlegt, kann ja einfach MSDN-Library durchsuchenCreateProcessAsUser verwendet werden.
Ja, ein Passwort wird hinterlegt, also werden die das wohl so machen.

MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: Elevated Autostart trotz aktivierter UAC?

  Alt 16. Apr 2013, 23:09
[...] die dein Tool vermutlich dann auch benutzt.
Mein Tool? Nein, das stammt nicht von mir
Sorry, da hätte ich mich besser ausdrücken sollen. "Das Tool, das du verwendest", umschreibt es vermutlich besser.

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:
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;
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von pustekuchen
pustekuchen

Registriert seit: 27. Aug 2010
265 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Elevated Autostart trotz aktivierter UAC?

  Alt 17. Apr 2013, 10:36
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.
Delphi programming is awesome.

Geändert von pustekuchen (17. Apr 2013 um 10:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Elevated Autostart trotz aktivierter UAC?

  Alt 17. Apr 2013, 10:52
Mit der Funktion OleCheck() kann du das Prüfen der HRESULTs vereinfachen.
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));
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

AW: Elevated Autostart trotz aktivierter UAC?

  Alt 17. Apr 2013, 18:50
Vielleicht könnte auch das Microsoft Application Compatibility Toolkit helfen.
Wäre dann halt wieder eine zusätzliche Abhängigkeit.

Mit der Funktion OleCheck() kann du das Prüfen der HRESULTs vereinfachen.
Ah, sehr schön. Das ist sicher hilfreich.

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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:42 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