如何从指向 ACCESS_ALLOWED_ACE 结构的指针中的 SidStart 成员获取完整的 SID?
How to get complete SID from the SidStart member in a pointer that points to an ACCESS_ALLOWED_ACE structure?
从包含 Security Descriptor String Format, I convert this string to a security descriptor (using ConvertStringSecurityDescriptorToSecurityDescriptorW 函数的字符串变量开始。
此函数为我提供了一个指向安全描述符的“指针”(我将指针放在相对于 this blog post 的引号下)。
接下来,我使用 GetSecurityDescriptorDacl function. From this DACL, I store all the ACEs into a vector of pointers to ACCESS_ALLOWED_ACE structures. Finally in these structures, there is my targeted member (SidStart) that I want to use to get a "translation" of the SID (for example with Well-Known SIDs 恢复指向指定安全描述符的 DACL 的指针,我想将“S-1-1-0”转换为最终用户可读的字符串,如“Everyone”) .
但是,SidStart 只提供受托者 SID 的第一个 DWORD。 SID 的剩余字节存储在 SidStart 成员之后的连续内存中(如 documentation 所说)。尽管我在 Internet 上进行了研究,但我无法弄清楚如何获取这些剩余字节。
这是 C++ 控制台应用程序中的最小可重现示例:
#include <iostream>
#include <Windows.h>
#include <sddl.h>
#include <vector>
using namespace std;
int main()
{
LPCWSTR stringSecurityDescriptor = L"D:AI(D;OICI;DCLCDTSD;;;S-1-1-0)";
PSECURITY_DESCRIPTOR pSD;
ConvertStringSecurityDescriptorToSecurityDescriptorW(stringSecurityDescriptor, SDDL_REVISION_1, &pSD, nullptr);
PACL pDacl;
BOOL bDaclPresent = SE_DACL_PRESENT;
BOOL bDaclDefaulted = SE_DACL_DEFAULTED;
GetSecurityDescriptorDacl(pSD, &bDaclPresent, &pDacl, &bDaclDefaulted);
LPVOID pAce;
ACCESS_ALLOWED_ACE* pAceBuffer;
vector<ACCESS_ALLOWED_ACE*> pDaclAces;
if (bDaclPresent)
{
for (int i = 0; i < pDacl->AceCount; i++)
{
GetAce(pDacl, i, &pAce);
pAceBuffer = (ACCESS_ALLOWED_ACE*)pAce;
pDaclAces.push_back(pAceBuffer);
}
}
/* TODO : Get the SID of the ACEs */
}
我在 C++ 编程(以及一般编程)方面相对较新,尤其是在 winapi 环境中。此外,这是我在 Whosebug 上的第一个问题。所以,我希望我的问题是清楚的、可理解的和可解决的。我对批评持开放态度。
感谢@RbMm 在我的问题的评论部分:
use (PSID)&SidStart
我已将此行添加到我的项目中(通过替换最小可重现示例中的 TODO 部分)以对其进行测试:
PSID pSid = (PSID)&pDaclAces[0]->SidStart
然后我通过将 this page 与 Microsoft 文档一起重新用于我的案例,将其转换为可读字符串,所有这些都运行良好。
从包含 Security Descriptor String Format, I convert this string to a security descriptor (using ConvertStringSecurityDescriptorToSecurityDescriptorW 函数的字符串变量开始。
此函数为我提供了一个指向安全描述符的“指针”(我将指针放在相对于 this blog post 的引号下)。
接下来,我使用 GetSecurityDescriptorDacl function. From this DACL, I store all the ACEs into a vector of pointers to ACCESS_ALLOWED_ACE structures. Finally in these structures, there is my targeted member (SidStart) that I want to use to get a "translation" of the SID (for example with Well-Known SIDs 恢复指向指定安全描述符的 DACL 的指针,我想将“S-1-1-0”转换为最终用户可读的字符串,如“Everyone”) .
但是,SidStart 只提供受托者 SID 的第一个 DWORD。 SID 的剩余字节存储在 SidStart 成员之后的连续内存中(如 documentation 所说)。尽管我在 Internet 上进行了研究,但我无法弄清楚如何获取这些剩余字节。
这是 C++ 控制台应用程序中的最小可重现示例:
#include <iostream>
#include <Windows.h>
#include <sddl.h>
#include <vector>
using namespace std;
int main()
{
LPCWSTR stringSecurityDescriptor = L"D:AI(D;OICI;DCLCDTSD;;;S-1-1-0)";
PSECURITY_DESCRIPTOR pSD;
ConvertStringSecurityDescriptorToSecurityDescriptorW(stringSecurityDescriptor, SDDL_REVISION_1, &pSD, nullptr);
PACL pDacl;
BOOL bDaclPresent = SE_DACL_PRESENT;
BOOL bDaclDefaulted = SE_DACL_DEFAULTED;
GetSecurityDescriptorDacl(pSD, &bDaclPresent, &pDacl, &bDaclDefaulted);
LPVOID pAce;
ACCESS_ALLOWED_ACE* pAceBuffer;
vector<ACCESS_ALLOWED_ACE*> pDaclAces;
if (bDaclPresent)
{
for (int i = 0; i < pDacl->AceCount; i++)
{
GetAce(pDacl, i, &pAce);
pAceBuffer = (ACCESS_ALLOWED_ACE*)pAce;
pDaclAces.push_back(pAceBuffer);
}
}
/* TODO : Get the SID of the ACEs */
}
我在 C++ 编程(以及一般编程)方面相对较新,尤其是在 winapi 环境中。此外,这是我在 Whosebug 上的第一个问题。所以,我希望我的问题是清楚的、可理解的和可解决的。我对批评持开放态度。
感谢@RbMm 在我的问题的评论部分:
use (PSID)&SidStart
我已将此行添加到我的项目中(通过替换最小可重现示例中的 TODO 部分)以对其进行测试:
PSID pSid = (PSID)&pDaclAces[0]->SidStart
然后我通过将 this page 与 Microsoft 文档一起重新用于我的案例,将其转换为可读字符串,所有这些都运行良好。