我有一个小型 Delphi 应用程序,它向 LOCAL_MACHINE 注册表写入一个 key 。 当我使用具有管理员权限的用户在 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 设置设置为“仅当程序尝试对我的计算机进行更改时通知”(第二低级别)。当我将其改为“从不通知”时,它也有效(无需使用“以管理员身份运行”)。
如果您对可能出现的问题有任何想法/想法,我将不胜感激。
谢谢。
最佳答案
简单地说,用户需要管理员权限才能写入 HKLM。同样用于写入系统目录(system32,程序文件)。对于实现了安全性的 Windows 版本(NT、2k、XP、Vista、7)来说,这一直是正确的。
在 UAC 下,管理员组中的用户默认使用标准用户 token 运行进程。所以他们没有对 HKLM 等的写入权限。
在进一步了解之前,您确实需要阅读 UAC。开始here .
熟悉这些问题后,您有两个主要选择:
- 添加
requireAdministrator
显示给您的应用程序,以便它始终以提升的权限运行。这意味着用户每次启动您的应用程序时都必须协商 UAC 对话。 - 修改您的应用程序,使其不写入 HKLM。一种常见的方法是在安装期间执行所有需要管理员权限的操作,这通常发生在提升的情况下。另一种变体是将应用程序中需要管理员权限的一小部分分离开到一个单独的进程,以便您只在必要时显示 UAC 对话框。
在这两个选项中,数字 2 绝对是首选。请记住,对于非管理员用户,您的应用程序已经无法在 2000/XP 上运行。
关于windows - 为什么以管理员身份运行时我的应用程序工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7547182/