UAC 注册表 WIN64 OS 运行时主题

首先EXE程序是32位,DelphiIDE对Project默认是启用主题的,默认情况在WIN64 OS下运行时,无管理员权限。

WIN64 OS,默认情况下UAC是启用的。

上述默认情况下,EXE 是无法写注册表HKEY_LOCAL_MACHINESoftware的,OpenKey 返回False(既然启用了主题,但是未要求管理员权限,那Windows就假定该程序不需要写注册表)。

如果禁用IDE的主题选项,OpenKey返回True(可能是以前win9x的老程序,因为没有manifest文件来判断,所以返回true),但是后面实际写时,会提示出错

---------------------------
Project1
---------------------------
Failed to set data for 'ConsentPromptBehaviorAdmin'
---------------------------
确定
---------------------------

EXE加 XPManifestUAC.manifest 资源,再次编译,就会自动有盾牌,有管理员权限。

如果在IDE里2种方式运行,都会显示 

---------------------------
Error
---------------------------
Unable to create process: 请求的操作需要提升。.
---------------------------
OK
---------------------------

 如果在 文件夹窗口运行,就是显示提升对话框,提升以后。

然后以with TRegistry.Create do 写注册表成功,但是写的PATH会 重定向到Wow6432Node下

如果code再改一下, 用  

with TRegistry.Create(KEY_WOW64_64KEY or KEY_ALL_ACCESS) do 红色的是必须的,只有前面的是不行的,否则OpenKey返回False。

就能写到 PATH 对应的位置,Windows7根据情况自动确定Wow6432Node下是否同步相应的值。

如果32位的EXE自己要 读、写注册表保存软件自身的设置,一般自动重定向到Wow6432Node也没有什么问题。

如果32位的EXE要读、写到64PATH,那才需要KEY_WOW64_64KEY 。

 http://blog.csdn.net/xiexuan2007/article/details/38416123

http://www.xuebuyuan.com/809036.html

http://blog.csdn.net/educast/article/details/10168621

http://www.bccsafe.com/?p=634

另外,文件虚拟化

1、Windows7兼容的程序(带manifest文件或者启用主题,但是以标准用户权限运行),比如自带的记事本,保存文件到Windows 目录C:windows,会提示

你没有权限在此位置保存文件。

请与管理员联系以取得相应权限。

你想改为保存到 我的文档 文件夹中吗?

这时,虚拟化技术并未生效。

2、WindowsXP下的notepad.exe,复制到Windows7运行,也保存到Windows目录

能成功保存,没有任何提示信息。

这时,虚拟化技术起作用了。其实文件是被保存到了 用户配置文件夹下 AppData-Local——VirsualStore-原来准备保存的文件夹Windows。

3、Windows7兼容的程序(以管理员权限运行,manifest文件里要求RunAsAdministrtor),则,可以保存数据到 Windows目录。

原文地址:https://www.cnblogs.com/CodeGear/p/4270108.html