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

Delphi – 在注册表项上设置完全控制

发布时间:2020-12-15 09:26:18 所属栏目:大数据 来源:网络整理
导读:我正在使用以下代码(在线找到)为注册表中的密钥设置完全控制: procedure TForm1.bnSetRegistryFCClick(Sender: TObject);var SID: PSID; peUse,cchDomain,cchName,dwResult: DWORD; Name,Domain: array of Char; pDACL: PACL; pEA: PEXPLICIT_ACCESS_W;// s
我正在使用以下代码(在线找到)为注册表中的密钥设置完全控制:

procedure TForm1.bnSetRegistryFCClick(Sender: TObject);
var
  SID: PSID;
  peUse,cchDomain,cchName,dwResult: DWORD;
  Name,Domain: array of Char;
  pDACL: PACL;
  pEA: PEXPLICIT_ACCESS_W;//
  sObject: String;
begin
  sObject := 'HKEY_LOCAL_MACHINESOFTWAREBorland';
  SID := nil;
  Win32Check(ConvertStringSidToSidA(PChar('S-1-5-32-545'),SID));        //    S-1-5-32-545='users';  S-1-1-0='everyone'
  cchName := 0;
  cchDomain := 0;

  if (not LookupAccountSid(nil,SID,nil,peUse)) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
  begin
    SetLength(Name,cchName);
    SetLength(Domain,cchDomain);
    if LookupAccountSid(nil,@Name[0],@Domain[0],peUse) then
    begin
      pEA := AllocMem(SizeOf(EXPLICIT_ACCESS));
      BuildExplicitAccessWithName(pEA,PChar(Name),GENERIC_ALL,GRANT_ACCESS,SUB_CONTAINERS_AND_OBJECTS_INHERIT);
      dwResult := SetEntriesInAcl(1,pEA,pDACL);
      if dwResult = ERROR_SUCCESS then
      begin
        dwResult := SetNamedSecurityInfo(pChar(sObject),SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,pDACL,nil);
        if dwResult <> ERROR_SUCCESS then
          ShowMessage('SetNamedSecurityInfo failed: ' + SysErrorMessage(GetLastError));
        LocalFree(Cardinal(pDACL));
      end
      else
        ShowMessage('SetEntriesInAcl failed: ' + SysErrorMessage(dwResult));
    end;
  end;
end;

SetNamedSecurityInfo返回错误87并且无法设置权限,我认为这意味着其中一个参数是错误的.如果我使用相同的代码,但使用SE_FILE_OBJECT而不是SE_REGISTRY_KEY,我可以成功设置给定文件夹的权限.无论我使用SID S-1-5-32-545 =’用户’还是S-1-1-0 =’每个人’,我都得到相同的结果.

任何帮助非常感谢.

克里斯

解决方法

注册表项的格式错误.在进行使用SE_OBJECT_TYPE的API调用时,您必须使用一组特定的文字来代替完整的HKEY _…格式.

sObject := 'MACHINESOFTWAREBorland';

供参考:MSDN – SE_OBJECT_TYPE enumeration

The names of registry keys must use the following literal strings to identify the predefined registry keys: “CLASSES_ROOT”,“CURRENT_USER”,“MACHINE”,and “USERS”.

(编辑:李大同)

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

    推荐文章
      热点阅读