我创build了一个自解压的7-Zip文件。 其中包含一个CMD文件,7-Zip在提取上运行。 这个CMD读取registry并执行一些进一步的活动(对这个特定的问题不重要)。
在Windows Server 2003 32位这种行为工作得很好。 但是,在Windows Server 2008框中进行testing显示,由7-Zip启动的cmd无权读取registry。 更具体地说,它可以读取一些区域(Windows当前版本),而不是其他(其他软件密钥)。
如果我把这个cmd文件自己运行(从7-Zip提取它的临时文件夹运行它),一切运行良好。
使用UAC“以pipe理员身份运行”会产生相同的问题,禁用UAC似乎没有帮助。
我不知道configuration文件的任何7-Zip选项,告诉它升级权限,或类似的东西。 有什么我在这里失踪? 在Windows Server 2008中,还是在64位版本的操作系统上,registry访问得到了更多的locking? 我怎样才能确保我的EXE文件可以传递正确的权限到它启动的命令?
由于7-Zip文件是32位可执行文件,因此您的命令脚本在32位上下文中运行。 其中一个后果是某些注册表位置被重定向。 请参阅MSDN了解更多详情。
您可以通过查找环境变量PROCESSOR_ARCHITEW6432
来检测WOW64环境,并且可以通过运行在c:\windows\sysnative
找到的cmd.exe
副本来返回到本机64位环境。
这两行在你的命令文件的顶部应该做的伎俩:
if defined PROCESSOR_ARCHITEW6432 c:\windows\sysnative\cmd.exe /c %~pf0 %* if defined PROCESSOR_ARCHITEW6432 goto :eof