Как прочитать реестр HKCU для вошедшего в систему пользователя из программы установки Inno Setup, работающей от имени администратора
Моя установка настроена на работу с самыми низкими привилегиями
PrivilegesRequired=lowest
Но я выполняю настройку от имени администратора (щелкните правой кнопкой мыши -> запустить от имени администратора, введите учетные данные администратора в UAC) и хочу проверить реестр вошедшего в систему пользователя в InitializeSetup()
function InitializeSetup(): boolean;
begin
if RegQueryStringValue(HKCU,'SOFTWARE\{some path}','Version', {some value}) then
begin
{ do something here }
end
end
Но это проверяет значение реестра для учетной записи администратора, а не для учетной записи пользователя, вошедшего в систему
Есть ли способ проверить реестр пользователей в данный момент?
1 ответ
Во-первых, вы не должны пытаться получить доступ к пользовательской среде из установщика, работающего с правами администратора. Это просто неправильно.
Для общего обсуждения по этой теме см.:
Установка приложения для текущего пользователя, вошедшего в систему, из программы установки Inno Setup, работающей от имени администратора.
В любом случае, вы можете использовать функцию ниже.
Код объединяет эти решения:
- Inno Setup Создание раздела реестра для вошедшего в систему пользователя (не администратора)
- Inno Setup всегда устанавливается в папку администратора AppData
function ReqQueryValueOfOriginalUser(var ResultStr: String): Boolean;
var
Uniq: string;
TempFileName: string;
Cmd: string;
Key: string;
Value: string;
Params: string;
Lines: TArrayOfString;
Buf: string;
ResultCode: Integer;
P: Integer;
begin
Log('Querying registry value of original user');
Uniq := ExtractFileName(ExpandConstant('{tmp}'));
TempFileName :=
ExpandConstant(Format('{commondocs}\appdata-%s.txt', [Uniq]));
Cmd := ExpandConstant('{cmd}');
Key := 'HKEY_CURRENT_USER\Software\{some path}';
Value := 'Version';
Params := Format('/C reg.exe QUERY "%s" /v "%s" > "%s"', [Key, Value, TempFileName]);
Result := False;
if ExecAsOriginalUser(Cmd, Params, '', SW_HIDE, ewWaitUntilTerminated, ResultCode)
and (ResultCode = 0) then
begin
if LoadStringsFromFile(TempFileName, Lines) then
begin
if (Length(Lines[0]) > 0) or
(Lines[1] <> Key) then
begin
Log(Format('Unexpected output of reg.exe QUERY: "%s" - "%s"', [
Lines[0], Lines[1]]));
end
else
begin
Buf := Trim(Lines[2]);
if Copy(Buf, 1, Length(Value)) <> Value then
begin
Log(Format('Unexpected output of value query: "%s"', [Buf]));
end
else
begin
Buf := Trim(Copy(Buf, Length(Value) + 1, Length(Buf) - Length(Value)));
P := Pos(' ', Buf);
if P = 0 then
begin
Log(Format('Cannot find type and value separator in "%s"', [Buf]));
end
else
begin
ResultStr := Trim(Copy(Buf, P + 1, Length(Buf) - P));
Log(Format('Value is "%s"', [ResultStr]));
Result := True;
end;
end;
end;
end
else
begin
Log(Format('Error reading %s', [TempFileName]));
end;
DeleteFile(TempFileName);
end
else
begin
Log('Error querying registry key of original user');
end;
Result := True;
end;