gpt4 book ai didi

delphi - 如何将 EXPLICIT_ACCESS 与 SetEntriesInAcl 的 jedi-winutils 正确对齐?

转载 作者:行者123 更新时间:2023-12-01 22:43:50 34 4
gpt4 key购买 nike

我尝试使用 SetEntriesInAclA 从 Free Pascal 中的 EXPLICIT_ACCESS_A 数组创建新的 ACL,但我不断收到来自 的错误代码 87(无效参数) >SetEntriesInAclA 与以下代码:

uses
sysutils,
JwaWinNT,
JwaAclApi,
JwaAccCtrl,
JwaSDDL,
jwawinbase,
jwawinsta,
jwawintype,
jwawinerror;

function SetupAccess(owner: jwawinnt.PSID; var acl: jwawinnt.PACL): bool;
const
EA_COUNT = 3;
var
sidAuthWorld: jwawinnt.SID_IDENTIFIER_AUTHORITY;
sidAuthNT: jwawinnt.SID_IDENTIFIER_AUTHORITY;
everyoneSID: jwawinnt.PSID;
adminSID: jwawinnt.PSID;
ea: Array[0..(EA_COUNT-1)] of jwaaccctrl.EXPLICIT_ACCESS_A;
status: jwawintype.DWORD;
begin
try
begin
WriteLn(IntToStr(SizeOf(jwaaccctrl.EXPLICIT_ACCESS_A)));
sidAuthWorld := jwawinnt.SECURITY_WORLD_SID_AUTHORITY;
sidAuthNT := jwawinnt.SECURITY_NT_AUTHORITY;

if not (jwawinbase.AllocateAndInitializeSid(@sidAuthWorld, 1, jwawinnt.SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0, everyoneSID)
and AllocateAndInitializeSid(@sidAuthNT, 2, jwawinnt.SECURITY_BUILTIN_DOMAIN_RID,
jwawinnt.DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, adminSID)) then
begin
WriteLn('Could not allocate SIDs: ' + SysErrorMessage(getLastError()));
Result := false;
end
else
begin
jwawinbase.ZeroMemory(@ea, EA_COUNT * sizeOf(EXPLICIT_ACCESS_A));

ea[0].grfAccessPermissions := GENERIC_ALL;
ea[0].grfAccessMode := DENY_ACCESS;
ea[0].grfInheritance := NO_INHERITANCE;
ea[0].Trustee.MultipleTrusteeOperation := NO_MULTIPLE_TRUSTEE;
ea[0].Trustee.pMultipleTrustee := nil;
ea[0].Trustee.TrusteeForm := TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType := TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName := pointer(everyoneSID);

ea[1].grfAccessPermissions := GENERIC_ALL;
ea[1].grfAccessMode := SET_ACCESS;
ea[1].grfInheritance := NO_INHERITANCE;
ea[1].Trustee.MultipleTrusteeOperation := NO_MULTIPLE_TRUSTEE;
ea[1].Trustee.pMultipleTrustee := nil;
ea[1].Trustee.TrusteeForm := TRUSTEE_IS_SID;
ea[1].Trustee.TrusteeType := TRUSTEE_IS_GROUP;
ea[1].Trustee.ptstrName := pointer(adminSID);

ea[2].grfAccessPermissions := GENERIC_ALL;
ea[2].grfAccessMode := SET_ACCESS;
ea[2].grfInheritance := NO_INHERITANCE;
ea[2].Trustee.MultipleTrusteeOperation := NO_MULTIPLE_TRUSTEE;
ea[2].Trustee.pMultipleTrustee := nil;
ea[2].Trustee.TrusteeForm := TRUSTEE_IS_SID;
ea[2].Trustee.TrusteeType := TRUSTEE_IS_USER;
ea[2].Trustee.ptstrName := pointer(owner);

status := jwaaclapi.SetEntriesInAclA(2, @ea, nil, acl);
if status = ERROR_SUCCESS then
Result := true
else
begin
WriteLn('Error in SetEntriesInAcl: ' + IntToStr(status));
Result := false;
end;
end;
end
finally
If Assigned(everyoneSID) then
jwawinbase.FreeSID(everyoneSID);
If Assigned(adminSID) then
jwawinbase.FreeSID(adminSID);
end
end;

在谷歌搜索这个问题时,我发现了this question ,这暗示问题可能与 EXPLICIT_ACCESS_A 记录的对齐有关。

果然 WriteLn(IntToStr(SizeOf(jwaaccctrl.EXPLICIT_ACCESS_A))); 显示它的大小为 20。这是因为 jedi 将结构声明为 packed。从链接的问题中我收集到 EXPLICIT_ACCESS_A 应该大小为 24,但在 C++ 中测试后,它实际上似乎是 32。

我还尝试将 EXPLICIT_ACCESS_ATRUSTEE_A 结构复制到我的单元并删除 packed 关键字。这产生了尺寸为 24 的结构,但仍然是同样的错误。

结论:我可以使上述代码与 jedi 一起工作还是 jedi 中的错误/疏忽?

另请注意,我使用 Lazarus 2.0.4 和 FPC 3.0.4 从 x64 交叉编译到 x86。

最佳答案

对于 32 位,EXPLICIT_ACCESS_A 结构应为 32 字节。该记录可能是打包的,因为它包含一个联合。我在 Delphi 中使用 Jedi ApiLib 对此进行了测试,它返回正确的大小:

program SizeTest;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils,
JwaAccCtrl;

begin
WriteLn(Format('EXPLICIT_ACCESS_A size: %d', [SizeOf(EXPLICIT_ACCESS_A)]));

输出:

Output

在 Delphi 中,{$MINENUMSIZE 4} 用于强制枚举为 4 个字节(如在 C 中),也许您需要在 Lazarus/FPC 中设置它?

关于delphi - 如何将 EXPLICIT_ACCESS 与 SetEntriesInAcl 的 jedi-winutils 正确对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58953002/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com