加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:28:13 所属栏目:大数据 来源:网络整理
导读:我试图使用Delphi中的TRegistry组件向HKLM注册表写一个值. 由于我作为标准用户(或作为标准用户的XP,或作为标准用户的Windows Vista,或带有标准用户的Windows 7)在Windows 2000上运行,我完全希望我无法写入HKEY_LOCAL_MACHINE注册表的一部分: reg := TRegist
我试图使用Delphi中的TRegistry组件向HKLM注册表写一个值.

由于我作为标准用户(或作为标准用户的XP,或作为标准用户的Windows Vista,或带有标准用户的Windows 7)在Windows 2000上运行,我完全希望我无法写入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('SoftwareMicrosoftSQMClient',True) then
      Exit;

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

不幸的是,WriteString抛出了一个ERegistryException:

Failed to set data for 'MachineId`

这是完全可以预料到的,这就是我试图避免异常的原因.我在TRegistry中没有看到任何CanWriteString或TryWriteString.

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

不言而喻的笔记:

>如果用户实际上是管理员,则写入应该能够成功
>在try-except中包含对WriteString的调用:

reg := TRegistry.Create(KEY_WRITE);
try
  reg.RootKey := HKEY_LOCAL_MACHINE;
  if not reg.OpenKey('SoftwareMicrosoftSQMClient',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:

06004

Combines the STANDARD_RIGHTS_WRITE,KEY_SET_VALUE,and KEY_CREATE_SUB_KEY access rights.

解决方法

你不能让TRegistry以你想要的方式行事.没有TryXXX方法,也没有禁用异常的参数.您可以确定这是因为TRegistry方法不提供任何错误或状态代码.

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

顺便说一句,我同意你在评论中表达的观点,即TRegistry在这里缺乏功能.我们希望注册表操作失败,因此我们不应该捕获异常来处理它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读