我正在使用以下代码(在线找到)为注册表中的密钥设置完全控制:
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, cchName, nil, cchDomain, peUse)) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
begin
SetLength(Name, cchName);
SetLength(Domain, cchDomain);
if LookupAccountSid(nil, SID, @Name[0], cchName, @Domain[0], cchDomain, 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, nil, pDACL);
if dwResult = ERROR_SUCCESS then
begin
dwResult := SetNamedSecurityInfo(pChar(sObject), SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, nil, nil, 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 ='大家',我都会得到相同的结果。
任何帮助都非常感激。
克里斯
答案 0 :(得分:6)
您的注册表项的格式错误。在进行使用SE_OBJECT_TYPE
的API调用时,您必须使用一组特定的文字来代替完整的HKEY_...
格式。
sObject := 'MACHINE\SOFTWARE\Borland';
供参考:MSDN - SE_OBJECT_TYPE enumeration
注册表项的名称必须使用以下文字字符串 识别预定义的注册表项:“CLASSES_ROOT”,“CURRENT_USER”, “机器”和“用户”。