我有一个批处理文件,可以将目录复制到新位置,创建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\
答案 0 :(得分: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-bit world”创建密钥;否则,它会读取并显示该值。 修改相同的应用程序以编写“Hello 64-bit world”而不是“Hello 32-bit world”并重新编译为64位应用程序。
当在64位Windows上运行32位应用程序时,它会显示“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。授予用户写入密钥的权限将克服这一点。