windows vista和windows 7以兼容模式的运行

 

Vista下的程序运行权限比较严格,如题,想在安装程序安装完成后直接把exe的兼容性设为“以管理员权限运行此程序”,可是不知道对应的应该调用什么api? 是用inno setup制作的安装程序。 

注:
本贴不用讨论资源文件中加入 <requestedExecutionLevel level=”requireAdministrator”/>的方法,即不直接修改EXE文件的方法。

 
没有API,这个信息保存在注册表中,在[HKLM]或者HKEY_CURRENT_USERSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers分支下,添加一个值:
值类型:REG_SZ
值名称:C:abcxxx.exe
值数据:RUNASADMIN
 
自己写了个小函数来判断UAC是否开启:
function IsUACEnable : Boolean;
var
  EnableLUA: Cardinal;
begin
  try
  if RegQueryDWordValue(HKEY_LOCAL_MACHINE, ‘SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem’,
  ‘EnableLUA’, EnableLUA) then
  begin
  // 读取值成功
  Result := EnableLUA = 1;
  end;
  except
  Result := False;
  end;
end;

同时看到了以下有用的博文,通过修改注册表实现的正是本贴提出的要求:
http://blogs.itecn.net/blogs/winvista/archive/2006/08/09/UACV3.aspx
五种标识权限提升的方法

Windows Vista并没有一种与生俱来的魔力,可以未卜先知某个应用程序是否应该运行在更高安全级别上。应用程序必须自己想办法通知Windows Vista它需要更高权限。有以下五种方法,让Windows Vista明白该应用程序需要提升权限:

(1) Windows Vista可以智能识别安装程序,例如根据安装程序的文件名(包含install或者setup),还可以智能识别msi发布的安装包等等。可以做一个实验,如果修改其他某个应用程序的名字,例如将QQ.exe重命名为QQInstall.exe,运行它就会自动触发权限提升,原来UAC以为这是一个安装程序。

(2) 在可执行文件的属性对话框、兼容性标签页里勾选“以管理员身份启动该程序”复选框。这等效于在HKCU SoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers注册表分支下添加键值,也相当于修改C:WindowsAppPatch下的sysmain.sdb兼容性数据库。

(3) 在程序的manifest文件或者内嵌的manifest信息里加入“level=highestAvaible”或者“level requireAdministrator”安全级别。

(4) 鼠标右键单击应用程序,选择“用管理员帐户运行”菜单项。

(5) 利用ACT(应用程序兼容性工具)为特定应用程序创建兼容性数据库,以便IT部门可以方便地在企业里部署兼容性设置。


http://blogs.itecn.net/blogs/winvista/archive/2006/07/21/2945.aspx
修改UAC兼容性设置

能不能修改SC命令的兼容性设置,让系统知道它需要管理员权限?
但是打开SC命令的属性对话框,发现其兼容性设置被锁死,如下图所示,原因是SC命令属于系统内置的组件,这和Windows XP的情况一样。

图2
这里尝试修改注册表,试图绕过这个限制,把SC命令添加到系统的兼容性数据库中:
(1) 打开regedit注册表编辑器,定位到以下注册表项:
HKEY_CURRENT_USERSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers
(2) 新增一个字符串键值:
名称必须设置为“C:Windowssystem32sc.exe”
并将其数值数据设置为“RUNASADMIN”
提示 该注册表修改完全等效于如图2所示的兼容性设置,只是绕开了UI的限制。

这以修改SC.exe的兼容性为例。
谢谢各位的关注!

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

留言

你的邮箱是保密的 必填的信息用*表示