为什么我的应用程序在以管理员身份运行时的工

时间:2011-09-25 17:20:35

标签: windows delphi registry uac privileges

我有一个小的Delphi应用程序,它将一个密钥写入LOCAL_MACHINE注册表。 当我在具有管理员权限的用户的Windows 7专业版上运行它时,它无法写入值,但是当我右键单击并选择“以管理员身份运行”时,它确实有效。

代码是:

var
   reg : TRegistry;
begin
 Result := false;

 reg := TRegistry.Create;
 reg.RootKey := HKEY_LOCAL_MACHINE;
 if (reg.OpenKey('Software\YepYep', TRUE)) then
 Begin
      try
         reg.WriteString('ProductKey', Trim(ProductKey));
         Result := true;
      finally
             reg.CloseKey();
      end;
 End;
 reg.Free;

end;

计算机UAC设置设置为“仅在程序尝试更改计算机时通知”(第二低级别)。当我把它归结为“从不通知”它也有效(不需要使用“以管理员身份运行”)。

如果您对可能存在的问题有任何想法/想法,我将不胜感激。

感谢。

3 个答案:

答案 0 :(得分:16)

简而言之,用户需要管理员权限才能写入HKLM。同样用于写入系统目录(system32,程序文件)。对于实现安全性的Windows版本(NT,2k,XP,Vista,7),情况一直如此。

在UAC下,管理员组中的用户默认使用标准用户令牌运行进程。所以他们没有获得HKLM等的写访问权。

在继续前进之前,你真的需要阅读UAC。开始here

熟悉问题后,您有两个主要选择:

  1. 向您的应用程序添加requireAdministrator清单,以便它始终以提升的权限运行。这意味着用户每次启动应用程序时都必须协商UAC对话框。
  2. 重做您的申请,使其不会写入HKLM。一种常见的方法是在安装过程中执行需要管理员权限的所有操作,这通常会提升。另一种变体是将需要管理员权限的应用程序的小部分分配到单独的进程,以便您在必要时仅显示UAC对话框。
  3. 在这两个选项中,数字2绝对是首选。请记住,对于非管理员用户,您的应用程序已无法在2000 / XP上运行。

答案 1 :(得分:1)

由于UAC,管理员帐户访问受限 - 这是Windows Vista和Windows 7的设计。HKEY_LOCAL_MACHINE是一个受到很好保护的空间。

您可以添加清单以在启动应用程序时提示。

答案 2 :(得分:1)

从Vista开始,应用程序无法再写入注册表的这一部分。 写入HKEY_LOCAL_MACHINE \ Software时,您的应用程序需要提升权限。 为了提供向后XP兼容性,他们发明了注册表虚拟化: http://msdn.microsoft.com/en-us/library/aa965884 请阅读ms页面,您将了解为什么您的应用程序在不以管理员身份运行时无效...