如何从指向 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 文档一起重新用于我的案例,将其转换为可读字符串,所有这些都运行良好。