Определите, совпадает ли учетная запись администратора с запущенным установщиком Inno Setup с учетной записью текущего сеанса входа в Windows

Я использую PrivilegesRequired=lowest в моем сценарии установки Inno. Если установка запущена с повышенными правами, т.е. IsAdminLoggedOn or IsPowerUserLoggedOn сообщает TRUE, как я могу определить, является ли учетная запись с повышенными правами той же учетной записью, с которой была запущена установка?

Мой скрипт может делать разные вещи соответственно.

2 ответа

Решение

Ты можешь использовать WTSQuerySessionInformation чтобы получить имя пользователя учетной записи для текущего сеанса входа в Windows.

function WTSQuerySessionInformation(
  hServer: THandle; SessionId: Cardinal; WTSInfoClass: Integer; var pBuffer: DWord;
  var BytesReturned: DWord): Boolean;
  external 'WTSQuerySessionInformationW@wtsapi32.dll stdcall';

procedure WTSFreeMemory(pMemory: DWord);
  external 'WTSFreeMemory@wtsapi32.dll stdcall';

procedure RtlMoveMemoryAsString(Dest: string; Source: DWord; Len: Integer);
  external 'RtlMoveMemory@kernel32.dll stdcall';

const
  WTS_CURRENT_SERVER_HANDLE = 0;
  WTS_CURRENT_SESSION = -1;
  WTSUserName = 5;

function GetCurrentSessionUserName: string;
var
  Buffer: DWord;
  BytesReturned: DWord;
  QueryResult: Boolean;
begin
  QueryResult :=
    WTSQuerySessionInformation(
      WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSUserName, Buffer,
      BytesReturned);

  if not QueryResult then
  begin
    Log('Failed to retrieve username');
    Result := '';
  end
    else
  begin
    SetLength(Result, (BytesReturned div 2) - 1);
    RtlMoveMemoryAsString(Result, Buffer, BytesReturned);
    WTSFreeMemory(Buffer);
    Log(Format('Retrieved username "%s"', [Result]));
  end;
end;

(Код для версии Inno Setup для Unicode).


Затем вы можете сравнить результат с GetUserNameString,


Возможно, вам придется добавить доменное имя в сравнение.

Если вам нужно полное имя учетной записи текущего пользователя (например, полномочия \формат имени пользователя ), вы можете использовать функцию Windows API GetUserNameExW . В приведенном ниже фрагменте показано, как вызвать эту функцию из Inno Setup:

      const
  ERROR_MORE_DATA = 234;

function GetUserNameExW(NameFormat: Integer; lpNameBuffer: string; var nSize: DWORD): Boolean;
  external 'GetUserNameExW@secur32.dll stdcall';

function GetFullUserName(): string;
var
  NumChars: DWORD;
  OutStr: string;
begin
  result := '';
  NumChars := 0;
  if (not GetUserNameExW(2, '', NumChars)) and (DLLGetLastError() = ERROR_MORE_DATA) then
  begin
    SetLength(OutStr, NumChars);
    if GetUserNameExW(2, OutStr, NumChars) then
      result := Copy(OutStr, 1, NumChars);
  end;
end;

(Значение 2передается в первый параметр ( NameFormat) в функции GetUserNameExW соответствует NameSamCompatibleв EXTENDED_NAME_FORMATперечисление.)

Другие вопросы по тегам