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 Bei Programstart Adminrechte einholen? (https://www.delphipraxis.net/161885-bei-programstart-adminrechte-einholen.html)

Memnarch 26. Jul 2011 09:27

Bei Programstart Adminrechte einholen?
 
Tag allerseits.
Was mich mal interressieren würde:

Wenn eine Setup gestartet wird, popt oft das UAC fenster auf mit der Frage ob ich es dem programm gestatten soll änderungen durchzuführen. Wenn ich mich recht erinnere gab es auch mal einen Dialog vonwegen "Dieses Programm benötigt Adminrechte" (Glaube das war JavaUpdaten)

Wie kann ich so einen Dialog aufrufen, über den der User dem Programm solche rechte geben kann? Es ist nunmal etwas "umständlich" immer zu sagen "muss mit adminrechten gestartet werden", was der User manuel durchführen muss. Schöner wäre es halt wen der User beim start ne Meldung bekommen würde, über die er die rechte zulassen kann.

Gibts da ne möglichkeit?

MFG
Memnarch

nh. 26. Jul 2011 10:01

AW: Bei Programstart Adminrechte einholen?
 
Du darfst jetzt netterweise noch eine Exe mitliefern:
Delphi-Quellcode:
program GanzTollesStartProgramm;

uses
  Windows,
  sysutils,
  ShellAPI;
     
const
  EchseName = 'DirSync.exe';

  SEE_MASK_NOCLOSEPROCESS = $00000040;

  function Run(aFile, Params: string; const ShowCmd: DWORD; const AsAdmin: Boolean): Boolean;
  var
    ShExecInfoA: SHELLEXECUTEINFOA;
  begin
    Result := false;
    if (aFile = '') or not FileExists(aFile) then
      Exit;

    ShExecInfoA.Wnd         := GetForegroundWindow;
    ShExecInfoA.cbSize      := SizeOf(SHELLEXECUTEINFOA);  
    ShExecInfoA.fMask       := SEE_MASK_NOCLOSEPROCESS;
    if AsAdmin then
      ShExecInfoA.lpVerb    := 'runas'
    else
      ShExecInfoA.lpVerb    := 'open';
    ShExecInfoA.lpFile      := PAnsiChar(AnsiString(aFile));
    ShExecInfoA.lpParameters := PAnsiChar(AnsiString(Params));
    ShExecInfoA.lpDirectory := PAnsiChar(AnsiString(ExtractFileDir(aFile)));
    ShExecInfoA.nShow       := ShowCmd;
    Result := ShellExecuteExA(@ShExecInfoA);

    CloseHandle(ShExecInfoA.hProcess);
  end;

var
  Params, OrigEchse: string;
  i: Integer;
begin
  OrigEchse := IncludeTrailingPathDelimiter(ExtractFileDir(ParamStr(0)))+EchseName;
  Params := '';
  for i := 1 to ParamCount do
    Params := Params + ' ' + ParamStr(i);
  Delete(Params, 1, 1);
  case MessageBox(0, 'Soll '+EchseName+' mit Adminrechten gestartet werden?', 'Adminrechte?', MB_ICONQUESTION or MB_YESNOCANCEL or MB_DEFBUTTON1) of
    idYes: Run(OrigEchse, Params, SW_SHOWNORMAL, true);
    idNo: Run(OrigEchse, Params, SW_SHOWNORMAL, false);
    idCancel: MessageBox(0, 'Keine Sorge, bei dem ganzen Rechtekauderwelsch weiß keiner mehr was er will, geschweige denn was Richtig wäre. -,,,-', '', MB_ICONERROR or MB_OK or MB_DEFBUTTON1);
  end;
end.
Oder tricksen und sich selbst neustarten.
Nur Vorsicht, vieles funzt immernoch nicht, zB mit einem Adminprozess einen 'normalen' Prozess starten....
:roll::roll::roll::roll:

Memnarch 26. Jul 2011 10:07

AW: Bei Programstart Adminrechte einholen?
 
Moment... du startest ein normales programm, dass dan ein anderes als admin startet?
Bin mir nicht sicher ob das funktioniert. Hab irgendwo was vonnem app.manifest gelesen. Aber diesbezüglich noch nicht schlauer geworden.


MFG
Memnarch

nh. 26. Jul 2011 10:09

AW: Bei Programstart Adminrechte einholen?
 
Jo, genau so.
Lass das undynamische Manifestinterpretationsgedöns weg, will eh keiner.

Stevie 26. Jul 2011 10:39

AW: Bei Programstart Adminrechte einholen?
 
Irgendwie vermisse ich gerade den "Daumen runter" Button...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 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