C++ WINAPI读取自定义文件或文件夹的所有访问权限

C++ WINAPI读取自定义文件或文件夹的所有访问权限,c++,windows,winapi,user-accounts,C++,Windows,Winapi,User Accounts,我有一个基于算法的任务来接收对某个文件或文件夹的访问权限,我尝试过实现它,但有些部分似乎不清楚。 我被要求的是: 1) 使用函数GetNamedSecurityInfo(),例如: GetNamedSecurityInfo(路径、SE文件对象、DACL安全信息、NULL、, 空值(a、空值和pSD) 2) 此外,使用SID来接收权限:use 这些函数用于接收SID:GetAclInformation(),然后是GetAce() 3) 现在可以使用LookupAccountSid()函数 成功后,

我有一个基于算法的任务来接收对某个文件或文件夹的访问权限,我尝试过实现它,但有些部分似乎不清楚。 我被要求的是:

1) 使用函数GetNamedSecurityInfo(),例如: GetNamedSecurityInfo(路径、SE文件对象、DACL安全信息、NULL、, 空值(a、空值和pSD)

2) 此外,使用SID来接收权限:use 这些函数用于接收SID:GetAclInformation(),然后是GetAce()

3) 现在可以使用LookupAccountSid()函数 成功后,将速度->掩码与所有常量进行比较,例如 “文件的通用\u ALL、通用\u READ、通用\u WRITE、通用\u EXECUTE” 显示访问权限

以及我如何尝试实现这个算法://首先获取进程SID

PSID g_pSID;
BOOL GetCurrentProcessSID()
{
    DWORD dwSize = 0, dwError, dwResult = 0;
    HANDLE hToken;

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
    {
        printf("OpenProcessToken Error %u\n", GetLastError());
        return FALSE;
    }

    // Call GetTokenInformation to get the buffer size.
    TOKEN_USER tU;
    if (!GetTokenInformation(hToken, TokenUser, &tU, 0, &dwSize))
    {
        dwError = GetLastError();
        if (dwError != ERROR_INSUFFICIENT_BUFFER)
        {
            std::cout << "GetTokenInformation failed, error " << dwError;
            CloseHandle(hToken);
            return 0;
        }
    }

    PTOKEN_OWNER to = (PTOKEN_OWNER)LocalAlloc(LPTR, dwSize);
    if (!to)
    {
        dwError = GetLastError();
        std::cout << "LocalAlloc failed, error " << dwError;
        CloseHandle(hToken);
        return 0;
    }

    if (!GetTokenInformation(hToken, TokenOwner, to, dwSize, &dwSize))
    {
        dwError = GetLastError();
        std::cout << "GetTokenInformation failed, error " << dwError;
        LocalFree(to);
        CloseHandle(hToken);
        return 0;
    }

    g_pSID = to->Owner;
    return TRUE;
}
PSID g_PSID;
BOOL GetCurrentProcessSID()
{
DWORD dwSize=0,dwError,dwResult=0;
拉赫托肯;
if(!OpenProcessToken(GetCurrentProcess()、TOKEN\u QUERY和hToken))
{
printf(“OpenProcessToken错误%u\n”,GetLastError());
返回FALSE;
}
//调用GetTokenInformation获取缓冲区大小。
令牌用户tU;
if(!GetTokenInformation(hToken、TokenUser和tU、0和dwSize))
{
dwError=GetLastError();
if(dwError!=错误\u缓冲区不足)
{
std::cout多亏了@(Rita Han-MSFT)的评论,我忘了从pSID比较中删除符号和标记

EqualSid(pSid, g_pSID);
而不是

EqualSid(pSid, &g_pSID);

现在它正常工作了

为什么不使用
AccessCheck
?@RbMm因为我正在实现一个由大学课程给出的算法,它说“使用这个,使用那个,等等”,正如你所看到的,我现在正试着观察AccessCheck(),但最初的任务仍然不是关于AccessCheck()仅供参考,此分配至少应在Vista(2006)中更新UAC。文件的访问可能会受到其
标签安全性信息
以及当前安全上下文的完整性级别(
TokenIntegrityLevel
)及其强制策略(
TokenMandatoryPolicy
)的限制。此外,Windows 8+中的内核
AccessCheck
(即
seaccescheck
)支持Authz条件ACE(例如,广泛用于“%ProgramFiles%\WindowsApps”中的UWP应用程序),我们可能需要文件的
属性\u安全性\u信息
范围\u安全性\u信息
。这是打字错误吗,
&g\u pSID
?使用
EqualSid(pSID,g\u pSID)
而不是
EqualSid(pSID,&g\u pSID)
@Rita Han-MSFT,谢谢,我可能只是忘记了从我以前的代码版本中删除符号,我尝试使用SID变量而不是pSID指针…现在一切正常:D
(显式访问*)pTempAce
不正确。ACE的结构与显式访问记录无关。将
pTempAce
转换为
PACE\u标头
,并跳过
AceFlags
包含
INHERIT\u ONLY\u ACE
的所有条目。这些条目不适用于当前文件/目录。循环需要单独累积授予的访问掩码和拒绝的访问掩码。如果不是针对目标SID或仅继承,则跳过条目。否则,如果是允许条目,则向授予的访问掩码添加未包含在拒绝的访问掩码中的
掩码
权限。如果是拒绝条目,则向拒绝的访问掩码添加不包含的
掩码
权限t已在授予的访问掩码中。这允许显式项重写继承的项,因为继承的项按规范顺序排列在显式项之后。最后,授予的访问掩码将得到结果。
EqualSid(pSid, &g_pSID);