21 registry virtualization uac windows-7 c#-2.0
我有一套C#(v2)应用程序,我在Win7(以及较小程度上的Vista)中使用注册表虚拟化.
我有一个共享的注册表配置区域,我的应用程序需要在HKLM\Software\Company中访问...在Vista之前,所有内容都只是根据需要写入并从该位置读取.
代码适当地检测到写入该注册表项的失败并且会适当地回退(写入HKCU而不是通知用户他们应用的设置只会影响当前用户).
在Vista中,注册表虚拟化破坏了所有这一切,因为我们用于HKLM写入的访问检查将"成功"静默并虚拟化为HKCR\VirtualStore\Machine ...而不是.在这种情况下,用户会认为他们已经保存了机器范围的配置,而只是写入了虚拟商店.
遗憾的是,即使尝试枚举HKLM reg键的权限,也会显式返回指示用户是否访问的结果.
当我们添加Vista支持时,我们使用的解决方法是执行对HKLM的探测写入...然后在HKCR\VirtualStore\Machine ...中检查相同的值并注意如果找到该值则发生虚拟化.
Win7似乎已经打破了这个(再次),因为针对显式虚拟位置(HKCR)的查询现在显示来自HKLM位置的合并结果,即使写入未被虚拟化.
有没有人有任何解决这个问题的建议?
约束: - 我需要一个无需提升的解决方案(当我没有管理员级别权限时,我将回退到HKCU中的每用户配置,但我需要能够可靠地检测到这种情况).
它需要使用v2 C#应用程序(我看到的C++代码的一个选项是嵌入一个禁用.exe虚拟化的清单,但我无法在C#V2中执行此操作,请参阅Windows中的禁用文件夹虚拟化) .
它需要在没有"安装程序"的情况下工作(这排除了在注册表项上禁用虚拟化的能力,我们需要REG FLAGS ...命令).
Rub*_*ink 11
这是一个非常好的问题,+ 1(为什么它是社区维基,它值得分!)
通常,有一组规则([您遇到过]将随时间变化)控制UAC [因此隐式注册表]虚拟化是否在起作用.
MSDN中注册表虚拟化规则集文档的一些显着部分是:
如果您无法影响上述任何一个,这是理想的,并且您因此想要检测UAC虚拟化是否适用于当前上下文,请将此答案用于最初可能不相关的内容问题.(显然你仍然需要决定它是否适用于你正在操作的特定密钥,这是一个移动目标,你显然不希望实现需要跟踪变更的代码,如果它可以完全避免 - 但是大多数情况下应该比较清楚.)