Определите, совпадает ли учетная запись администратора с запущенным установщиком 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
перечисление.)