我正在使用以下代码(在线找到)为注册表中的密钥设置完全控制:
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_MACHINE\SOFTWARE\Borland'; 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 := 'MACHINE\SOFTWARE\Borland';
供参考: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”.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。