Добавить комментарий

Delphi

Проверить наличие прав администратора

Embarcadero советует так(пунктуация и орфография автора сохранена):

procedure isAdmin();
var
  reg: TRegistry;
  openResult: Boolean;
begin
  reg := TRegistry.Create(KEY_READ);
  reg.RootKey := HKEY_LOCAL_MACHINE;
  reg.Access := KEY_WRITE;
  openResult := reg.OpenKey('Software\MyCompanyName\MyApplication\',True);
  if not openResult = True then
    begin
    MessageDlg('Unable to write to registry. '+
               'Your application does NOT have Administrator level privileges.',
                TMsgDlgType.mtError, mbOKCancel, 0);
    end
  else
    begin
    MessageDlg('Write to registry permitted. Your application has Administrator level privileges.',
                TMsgDlgType.mtInformation, mbOKCancel, 0);
    end;
  reg.CloseKey();
  reg.Free;
end;

Странноватый способ...
На ветки реестра права можно выдавать. И если кто-то разрешил вашему приложению писать в HKEY_LOCAL_MACHINE\Software, оно от этого не стало администратором.

Более разумным подходом выглядит запросить наличие какой-то привилегии. Можно запросить что-то суровое, что явно доступно только администратору, а можно и точно выяснять, доступны ли вам привилегии на то, что вы собираетесь делать, и ради чего, собственно, затеяли выяснение "а можно ли вашей программе вообще всё администраторское".

Функция проверки наличия привилегии:

function PrivilegeEnabled(const PrivilegeName : string; Attr: Cardinal = SE_PRIVILEGE_ENABLED): Boolean;
var
  token : THandle;
  tp    : TOKEN_PRIVILEGES;
  rl    : Cardinal;

begin
  Result := False;
  if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, token) then
  begin
    tp.PrivilegeCount := 1;
    LookupPrivilegeValue(nil, pchar(privilegename), tp.Privileges[0].Luid);
    tp.Privileges[0].Attributes := Attr;
    AdjustTokenPrivileges(token, False, tp, SizeOf(TOKEN_PRIVILEGES), nil, rl);
    Result := (GetLastError = ERROR_SUCCESS);
    CloseHandle(token);
  end;
end;

Например, чтобы убедиться, может ли моя программа обратиться к памяти другого процесса:

// Стандартный вариант
  if PrivilegeEnabled('SeDebugPrivilege') then
    ...

// Для тех, кто чувствует тонкую разницу между "разрешено" и "используется"
  if PrivilegeEnabled('SeDebugPrivilege', SE_PRIVILEGE_USED_FOR_ACCESS) then
    ...

Актуальный список поддерживаемых идентификаторов привилегий можно посмотреть на сайте microsoft.

Метки:

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Допустимые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.
  • Вы можете цитировать другие сообщения, используя тэг [quote]

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и абзацы переносятся автоматически.