检查 windows 对象 DACL 中是否存在 ACE
Checking the existence of ACE in windows object DACL
有没有办法检查对象的 DACL
中是否已经存在 ACE
?
我想使用 RtlAddAccessAllowedAce
API 调用将 ACE
添加到对象,但我只想在 ACE
不这样做的情况下这样做已经存在。
有人知道我如何检查 ACE
是否已经存在,或者在添加给定的 ACE
之前尝试删除它,或者可以实现相同目标的任何其他解决方案?谢谢!
您可以或使用 winapi 或直接通过 ACL ACE 遍历 - 一个一个地枚举 ACE 并检查是否存在一些特定的 ACE:
变体 1:
void WalkAcl(PACL acl)
{
ACL_SIZE_INFORMATION asi;
if (GetAclInformation(acl, &asi, sizeof(asi), AclSizeInformation))
{
if (asi.AceCount)
{
do
{
union {
PVOID pvAce;
PACE_HEADER pAceHeader;
PACCESS_ALLOWED_ACE pAllowedAce;
};
PWSTR szSid;
if (GetAce(acl, --asi.AceCount, &pvAce))
{
switch (pAceHeader->AceType)
{
case ACCESS_ALLOWED_ACE_TYPE:
if (ConvertSidToStringSid(&pAllowedAce->SidStart, &szSid))
{
DbgPrint("%08x %S\n", pAllowedAce->Mask, szSid);
LocalFree(szSid);
}
break;
}
}
} while (asi.AceCount);
}
}
}
变体 2:
void WalkAcl(PACL acl)
{
if (USHORT AceCount = acl->AceCount)
{
union {
PVOID pv;
PBYTE pb;
PACE_HEADER pAceHeader;
PACCESS_ALLOWED_ACE pAllowedAce;
};
pv = acl + 1;
do
{
UNICODE_STRING usSid;
switch (pAceHeader->AceType)
{
case ACCESS_ALLOWED_ACE_TYPE:
if (0 <= RtlConvertSidToUnicodeString(&usSid, &pAllowedAce->SidStart, TRUE))
{
DbgPrint("%08x %wZ\n", pAllowedAce->Mask, usSid);
RtlFreeUnicodeString(&usSid);
}
break;
}
} while (pb += pAceHeader->AceSize, --AceCount);
}
}
有没有办法检查对象的 DACL
中是否已经存在 ACE
?
我想使用 RtlAddAccessAllowedAce
API 调用将 ACE
添加到对象,但我只想在 ACE
不这样做的情况下这样做已经存在。
有人知道我如何检查 ACE
是否已经存在,或者在添加给定的 ACE
之前尝试删除它,或者可以实现相同目标的任何其他解决方案?谢谢!
您可以或使用 winapi 或直接通过 ACL ACE 遍历 - 一个一个地枚举 ACE 并检查是否存在一些特定的 ACE:
变体 1:
void WalkAcl(PACL acl)
{
ACL_SIZE_INFORMATION asi;
if (GetAclInformation(acl, &asi, sizeof(asi), AclSizeInformation))
{
if (asi.AceCount)
{
do
{
union {
PVOID pvAce;
PACE_HEADER pAceHeader;
PACCESS_ALLOWED_ACE pAllowedAce;
};
PWSTR szSid;
if (GetAce(acl, --asi.AceCount, &pvAce))
{
switch (pAceHeader->AceType)
{
case ACCESS_ALLOWED_ACE_TYPE:
if (ConvertSidToStringSid(&pAllowedAce->SidStart, &szSid))
{
DbgPrint("%08x %S\n", pAllowedAce->Mask, szSid);
LocalFree(szSid);
}
break;
}
}
} while (asi.AceCount);
}
}
}
变体 2:
void WalkAcl(PACL acl)
{
if (USHORT AceCount = acl->AceCount)
{
union {
PVOID pv;
PBYTE pb;
PACE_HEADER pAceHeader;
PACCESS_ALLOWED_ACE pAllowedAce;
};
pv = acl + 1;
do
{
UNICODE_STRING usSid;
switch (pAceHeader->AceType)
{
case ACCESS_ALLOWED_ACE_TYPE:
if (0 <= RtlConvertSidToUnicodeString(&usSid, &pAllowedAce->SidStart, TRUE))
{
DbgPrint("%08x %wZ\n", pAllowedAce->Mask, usSid);
RtlFreeUnicodeString(&usSid);
}
break;
}
} while (pb += pAceHeader->AceSize, --AceCount);
}
}