提升 Visual Studio 对构建后事件批处理脚本的权限

Meg*_*ark 5 registry permissions batch-file post-build-event visual-studio

我有一个批处理文件,它将目录复制到新位置,创建 2 个其他 .bat 文件、2 个 .json 文件,并插入注册表项。当为命令行运行批处理脚本时,我没有得到任何错误和所有期望的结果。从构建后事件命令行运行它时,我没有收到任何错误,但缺少注册表项。同事建议这可能是由于 Visual Studio 没有管理员权限,而命令行可以。我的问题是:有没有办法(无需以管理员身份运行 Visual Studio)来提升构建后事件的权限?如果您想知道为什么不以管理员身份运行 VS,那是因为该解决方案是通过 TFS 共享的,并且并非我所有的同事都知道针对这一特定解决方案以管理员身份运行其 VS 实例。我用谷歌搜索了一下,没有任何结果。预先感谢您的帮助!这是我正在使用的构建后事件命令行。我再次知道它有效......它只是不会破坏注册表值。CMD 确实如此。附言。在 Windows 7 上使用 VS 2013

if $(ConfigurationName) == Debug call "$(ProjectDir)BatchFiles\DebugHelper.bat" "$(TargetDir)" C:\CEC\Batch\Test\
Run Code Online (Sandbox Code Playgroud)

小智 1

这是来自Windows SDK关于重定向的内容(也有反映和分享)

注册表重定向器

注册表重定向器通过在 WOW64 上提供注册表关键部分的单独逻辑视图来隔离 32 位和 64 位应用程序。注册表重定向器拦截对每个逻辑注册表视图的 32 位注册表调用,并将它们映射到相应的物理注册表位置。重定向过程对于应用程序来说是透明的。因此,32 位应用程序可以像在 32 位 Windows 上运行一样访问注册表数据,即使数据存储在 64 位 Windows 上的不同位置也是如此。

为以下注册表项启用重定向:

HKEY_LOCAL_MACHINE\Software 
HKEY_USERS\*\Software\Classes 
HKEY_USERS\*_Classes 
Note  * indicates a match for all user security IDs (SID).
Run Code Online (Sandbox Code Playgroud)

以下场景说明了这些逻辑视图的用法:

32 位应用程序检查以下注册表项是否存在:HKEY_LOCAL_MACHINE\Software\Hello。如果该键不存在,则会使用默认值“Hello 32-bit world”创建它;否则,它读取并显示该值。同一应用程序被修改为写入“Hello 64-bit world”而不是“Hello 32-bit world”,并重新编译为 64 位应用程序。

当32位应用程序在64位Windows上运行时,它会显示“Hello 32-bit world”。当64位应用程序运行时,它会显示“Hello 64-bit world”。两个应用程序使用相同的预定义句柄和相同的键名调用相同的注册表函数;不同之处在于,每个应用程序都在其注册表的逻辑视图上进行操作,并且每个视图都映射到注册表的单独物理位置,这使字符串的两个版本保持完整。

为了帮助应用程序将包含 %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. 
Run Code Online (Sandbox Code Playgroud)

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

并提醒大家,UAC 也可能对其进行虚拟化。因为它将一些对 HKLM 的写入重定向到 HKCU。授予用户写入您的密钥的权限将克服这个问题。