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

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
Online

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

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
 
#3

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
268 Beiträge
 
Delphi 11 Alexandria
 
#4

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
 
#5

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
 
#6

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 11:00 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