Installation 如何从以管理员身份运行的Inno安装程序中读取登录用户的注册表HKCU

Installation 如何从以管理员身份运行的Inno安装程序中读取登录用户的注册表HKCU,installation,inno-setup,pascalscript,Installation,Inno Setup,Pascalscript,我的安装程序设置为以最低权限运行 PrivilegesRequired=lowest 但我正在以管理员身份执行安装程序(右键单击->以管理员身份运行,在UAC中输入管理员凭据),并希望在InitializeSetup()中检查登录用户的注册表 函数InitializeSetup():布尔值; 开始 如果RegQueryStringValue(HKCU、'SOFTWARE\{some path}、'Version',{some value}),则 开始 {在这里做点什么} 结束 结束 但这会检

我的安装程序设置为以最低权限运行

PrivilegesRequired=lowest
但我正在以管理员身份执行安装程序(右键单击->以管理员身份运行,在UAC中输入管理员凭据),并希望在
InitializeSetup()中检查登录用户的注册表

函数InitializeSetup():布尔值;
开始
如果RegQueryStringValue(HKCU、'SOFTWARE\{some path}、'Version',{some value}),则
开始
{在这里做点什么}
结束
结束
但这会检查管理员帐户的注册表值,而不是登录用户帐户的注册表值


此时是否有办法检查已登录的用户注册表?

首先,您不应尝试从以管理员权限运行的安装程序访问用户环境。那是错误的

有关此主题的一般性讨论,请参阅:


无论如何,您可以使用下面的函数

该代码结合了以下解决方案:

函数ReqQueryValueOfOriginalUser(var ResultStr:String):布尔值;
变量
Uniq:字符串;
TempFileName:字符串;
Cmd:字符串;
键:字符串;
值:字符串;
参数:字符串;
线条:柏油纹;
Buf:字符串;
结果代码:整数;
P:整数;
开始
日志(“查询原始用户的注册表值”);
Uniq:=ExtractFileName(ExpandConstant({tmp}');
临时文件名:=
ExpandConstant(格式({commondocs}\appdata-%s.txt',[Uniq]);
Cmd:=ExpandConstant('{Cmd}');
键:=“HKEY\U当前用户\软件\{some path}”;
值:='版本';
参数:=格式('/C reg.exe查询“%s”/v“%s”>“%s”,[Key,Value,TempFileName]);
结果:=假;
如果执行原始用户(Cmd,Params',SW_HIDE,ewwaitunFilterminated,ResultCode)
和(ResultCode=0)然后
开始
如果LoadStringsFromFile(TempFileName,行),则
开始
如果(长度(行[0])>0)或
(行[1]键)然后
开始
日志(格式('reg.exe查询的意外输出:“%s”-“%s”[
行[0],行[1]]);
结束
其他的
开始
Buf:=修剪(第[2]行);
如果复制(Buf,1,长度(值))值,则
开始
日志(格式('值查询的意外输出:'%s',[Buf]);
结束
其他的
开始
Buf:=修剪(复制(Buf,长度(值)+1,长度(Buf)-长度(值));
P:=位置(“”,Buf);
如果P=0,则
开始
日志(格式('在“%s”中找不到类型和值分隔符,[Buf]);
结束
其他的
开始
结果tr:=Trim(拷贝(Buf,P+1,长度(Buf)-P));
日志(格式('值为“%s”,[ResultStr]);
结果:=真;
结束;
结束;
结束;
结束
其他的
开始
日志(格式('读取%s'时出错,[TempFileName]);
结束;
删除文件(TempFileName);
结束
其他的
开始
日志(“查询原始用户注册表项时出错”);
结束;
结果:=真;
结束;

但也许您应该向我们解释一下,如果您设置了
PrivilegesRequired=lower
,为什么要以管理员身份执行设置。这对我来说毫无意义。有关一般性讨论,请参阅。@Martin-我将通过Visual Studio生成的两个前男友捆绑到一个Inno设置中。一个安装程序需要管理员权限,另一个不需要。这就是为什么安装程序需要在两种模式下运行。@Martin-以及建议的链接显示如何创建注册表项。但我需要在这里搜索注册表好的,但主要是第二个答案解释了你试图做的是错误的。