delphi - 尝试在标准用户上写入 HKLM 时如何不触发异常?

标签 delphi security registry uac

尝试使用Delphi中的TRegistry组件将值写入HKLM注册表。

由于我以标准用户身份运行 Windows 2000(或以标准用户身份运行 XP,或以标准用户身份运行 Windows Vista,或以标准用户身份运行 Windows 7),所以我完全预计我将无法编写到注册表的 HKEY_LOCAL_MACHINE 部分:

reg := TRegistry.Create(KEY_WRITE);
try
   reg.Access := KEY_WRITE; //sure, set it again, why not
   reg.RootKey := HKEY_LOCAL_MACHINE;
   if not reg.OpenKey('\Software\Microsoft\SQMClient', True) then
      Exit;

   reg.WriteString('MachineId', s);
finally
   reg.Free;
end;

不幸的是,WriteString 抛出 ERegistryException:

Failed to set data for 'MachineId`

这完全是预料之中的,这就是我试图避免异常的原因。我在 TRegistry 中没有看到任何 CanWriteStringTryWriteString

尝试写入 HKLM 时如何触发异常?

<小时/>

不言而喻的注释:

  • 如果用户实际上是管理员,那么写入应该能够成功
  • 将对 WriteString 的调用包装在 try- except 中:

    reg := TRegistry.Create(KEY_WRITE);
    try
      reg.RootKey := HKEY_LOCAL_MACHINE;
      if not reg.OpenKey('\Software\Microsoft\SQMClient', True) then
         Exit;
    
      try
         reg.WriteString('MachineId', s);
      except
         on E:ERegistryException do
            {nothing};
      end;
    finally
      reg.Free;
    end;
    

    一开始就不会阻止异常的抛出。

更新:来自 RTL 源:

KEY_WRITE          = (STANDARD_RIGHTS_WRITE or
                        KEY_SET_VALUE or
                        KEY_CREATE_SUB_KEY) and not
                        SYNCHRONIZE;

来自 MSDN :

KEY_WRITE (0x20006)  

Combines the STANDARD_RIGHTS_WRITE, KEY_SET_VALUE, and KEY_CREATE_SUB_KEY access rights.

最佳答案

您无法让 TRegistry 按照您想要的方式运行。没有 TryXXX 方法,也没有禁用异常的参数。您可以确定情况确实如此,因为 TRegistry 方法不提供任何错误或状态代码。

您必须围绕 Win32 注册表 API 编写自己的包装器。

顺便说一句,我同意您在评论中表达的观点,即 TRegistry 这里缺乏功能。我们预计注册表操作会失败,因此我们不必捕获异常来处理该问题。

关于delphi - 尝试在标准用户上写入 HKLM 时如何不触发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10404564/

相关文章:

delphi - 如何在Delphi服务中挂载网络磁盘?

delphi - "As"约束泛型类型的运算符

.net - 如何在 WCF 中设置安全 token ?

android - 是安卓:allowBackup a security risk for android applications

windows - 在 windows cmd yes/no 提示下自动有脚本输入 yes

C# 注册表子键双字值

delphi - 为什么 Treeview.Clear 在父窗体边框样式更改上失败?

java - 在 Freemarker 模板中检查 Spring 安全角色和记录的用户名

windows-10 - 从 PowerShell 调用 Windows Shell 函数?

delphi - 找不到目录库\PrivateFrameworks XE8 64位iPhoneOS9