Перезапустить приложение в режиме без повышенных прав из приложения в режиме повышенных прав? - PullRequest
0 голосов
/ 02 мая 2018

Мне нужно перезапустить само приложение АЛЬТЕРНАТИВНО от имени администратора и от имени администратора.

Проблема в том, что когда приложение находится в режиме повышенных прав, то перезапущенное приложение автоматически также перейдет в режим повышенных прав!

См. Этот пример:

var
  ThisIsElevated: Boolean;

procedure TForm3.btnRestartClick(Sender: TObject);
begin
  if ThisIsElevated then
    ShellExecute(Handle, 'open', PChar(Application.ExeName), nil, nil, SW_SHOWNORMAL)
  else
    ShellExecute(Handle, 'runas', PChar(Application.ExeName), nil, nil, SW_SHOWNORMAL);
  Close;
end;

procedure TForm3.CheckIsElevated;
const
  TokenElevationType = 18;
  TokenElevation = 20;
  TokenElevationTypeDefault = 1;
  TokenElevationTypeFull = 2;
  TokenElevationTypeLimited = 3;

const
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));

const
  SECURITY_BUILTIN_DOMAIN_RID = $00000020;
  DOMAIN_ALIAS_RID_ADMINS = $00000220;

var
  token: NativeUInt;
  Elevation: DWord;
  dwSize: Cardinal;
begin
  if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, token) then
    try
      if GetTokenInformation(token, TTokenInformationClass(TokenElevation), @Elevation, SizeOf(Elevation), dwSize) then
      begin
        if Elevation = 0 then
        begin
          Self.Caption := 'NOT ELEVATED';
          ThisIsElevated := False;
        end
        else
        begin
          Self.Caption := 'ELEVATED!';
          ThisIsElevated := True;
        end;
      end
      else
        ShowMessage(SysErrorMessage(GetLastError));
    finally
      CloseHandle(token);
    end
  else
    ShowMessage(SysErrorMessage(GetLastError));
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  CheckIsElevated;
end;

Так как я могу перезапустить приложение в режиме без повышенных прав из приложения в режиме повышенных прав?

...