将权限提升至Visual Studio以进行后置构建事件批处理脚本

5
我有一个批处理文件,它将一个目录复制到一个新位置,创建2个其他的.bat文件、2个.json文件和插入注册表键。在命令行运行批处理脚本时,我没有错误并且得到了所有期望的结果。但是,在从后置生成事件命令行运行它时,我没有错误,但是缺少注册表条目。我的同事建议这可能是由于Visual Studio没有管理员权限,而命令行可以。我的问题是:有没有一种方法(不需要以管理员身份运行Visual Studio)来提升后置生成事件的权限?如果你想知道为什么不只是以管理员身份运行VS,那是因为这个解决方案通过TFS共享,而不是所有的同事都会知道为了这个特定的解决方案运行他们的VS实例作为管理员。我已经在谷歌上搜索了很久,但没有任何成果。先感谢您的帮助!这是我正在使用的后置生成事件命令行。再次说明,我知道它可以工作...只是它没有插入注册表值。CMD可以。PS。在Windows 7上使用VS 2013
if $(ConfigurationName) == Debug call "$(ProjectDir)BatchFiles\DebugHelper.bat" "$(TargetDir)" C:\CEC\Batch\Test\

如果您使用的是64位系统,那么您可能正在以错误的位数查看密钥。一些密钥是虚拟化的,因此32位和64位程序认为它是相同的密钥,但在底层实际上是完全不同的密钥,这也适用于system32文件夹。HKEY_LOCAL_MACHINE\Software HKEY_USERS\*\Software\Classes HKEY_USERS\*_Classes - Trigger
好的...那我该怎么做呢?我的.bat文件执行了HKLM\Software\Google\Chrome\NativeMessagingHosts\abc.def.ghi。 - MegaMark
1个回答

1
这是关于重定向的Windows SDK文档(还包括反射和共享)。 注册表重定向器 注册表重定向器通过在WOW64上为32位和64位应用程序提供独立的逻辑注册表视图来隔离它们。注册表重定向器截取每个逻辑注册表视图的32位注册表调用,并将其映射到相应的物理注册表位置。重定向过程对应用程序是透明的。因此,即使数据存储在64位Windows上的不同位置,32位应用程序也可以像在32位Windows上运行一样访问注册表数据。
以下注册表键启用了重定向:
HKEY_LOCAL_MACHINE\Software 
HKEY_USERS\*\Software\Classes 
HKEY_USERS\*_Classes 
Note  * indicates a match for all user security IDs (SID).

以下情景说明了这些逻辑视图的使用方法:
一个32位应用程序检查以下注册表键是否存在:HKEY_LOCAL_MACHINE\Software\Hello。如果该键不存在,则创建默认值为“Hello 32位世界”的键;否则,读取并显示该键的值。同一应用程序被修改为编写“Hello 64位世界”而不是“Hello 32位世界”,并被重新编译为64位应用程序。
当32位应用程序在64位Windows上运行时,它会显示“Hello 32位世界”。当64位应用程序运行时,它会显示“Hello 64位世界”。两个应用程序调用相同的注册表函数,使用相同的预定义句柄和相同的键名;区别在于每个应用程序都在其注册表的逻辑视图上操作,并且每个视图都映射到注册表的不同物理位置,这样就可以保留字符串的两个版本。
为了帮助将包含%ProgramFiles%的REG_EXPAND_SZ键写入注册表的应用程序,WOW64拦截这些写入操作,并将它们替换为“%ProgramFiles(x86)%”。这个环境变量对所有进程都是定义过的。例如,如果Program Files目录在C驱动器上,则“%ProgramFiles(x86)%”扩展为“C:\Program Files (x86)”。
为了通过COM和其他机制实现应用程序互操作性,WOW64使用注册表反射,在两个注册表视图之间复制特定的注册表键和值,以使它们保持同步。反射器是智能的,并在视图之间复制本地服务器的COM激活数据,但不会复制进程内数据,因为在64位Windows上不允许32/64位进程内数据混合。

做什么

在一个程序中

KEY_WOW64_64KEY 0x0100 Access a 64-bit key from either a 32-bit or 64-bit application.
Windows 2000:  This flag is not supported. 

KEY_WOW64_32KEY 0x0200 Access a 32-bit key from either a 32-bit or 64-bit application.
Windows 2000:  This flag is not supported. 

从命令提示符中查看reg flags /?,允许您的密钥选择退出重定向。

还要提醒一下,UAC也可能会将其虚拟化。因为它将某些写入HKLM的操作重定向到HKCU。授予用户对您的键进行写入的权限将克服这一问题。


在花费了一些认真的时间来理解这个问题之后...它实际上变得非常清晰了。CMD正在将密钥添加到32位注册表位置,而Visual Studio则是写入64位位置(即使VS本身是32位的...我猜这是因为操作系统是64位的吗?)非常感谢! - MegaMark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接