为什么我的应用程序以pipe理员身份运行时工作不同

我有一个小的Delphi应用程序,它将一个键写入LOCAL_MACHINEregistry。 当我使用具有pipe理员权限的用户在Windows 7专业版上运行它时,它无法写入值,但是当我右键单击并select“以pipe理员身份运行”时,它可以正常工作。

代码是:

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设置设置为“只有当程序尝试对我的计算机进行更改时才通知”(第二低级别)。 当我将其logging为“从不通知”时,它也可以工作(不需要使用“以pipe理员身份运行”)。

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

谢谢。

Solutions Collecting From Web of "为什么我的应用程序以pipe理员身份运行时工作不同"

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

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

在进一步深入之前,你真的需要阅读UAC。 从这里开始

一旦你熟悉了这个问题,你有两个主要的选择:

  1. requireAdministrator清单添加到您的应用程序,以便它始终以提升的特权运行。 这意味着用户每次启动应用程序时都必须协商UAC对话框。
  2. 重做你的应用程序,使其不写给HKLM。 常见的做法是在安装过程中执行所有需要管理权限的事情,这通常会发生。 另一个变种是将需要管理权限的应用程序的一小部分分配给单独的进程,以便在必要时仅显示UAC对话框。

在这两个选项中,2号绝对是首选。 请记住,对于非管理员用户,您的应用程序已无法在2000 / XP上运行。

管理员帐户由于UAC而具有有限的访问权 – 这是Windows Vista和Windows 7的设计HKEY_LOCAL_MACHINE是一个非常受保护的空间。

您可以在启动应用程序时包含一个清单来提示。

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