C++ WINAPI读取自定义文件或文件夹的所有访问权限
我有一个基于算法的任务来接收对某个文件或文件夹的访问权限,我尝试过实现它,但有些部分似乎不清楚。 我被要求的是: 1) 使用函数GetNamedSecurityInfo(),例如: GetNamedSecurityInfo(路径、SE文件对象、DACL安全信息、NULL、, 空值(a、空值和pSD) 2) 此外,使用SID来接收权限:use 这些函数用于接收SID:GetAclInformation(),然后是GetAce() 3) 现在可以使用LookupAccountSid()函数 成功后,将速度->掩码与所有常量进行比较,例如 “文件的通用\u ALL、通用\u READ、通用\u WRITE、通用\u EXECUTE” 显示访问权限 以及我如何尝试实现这个算法://首先获取进程SIDC++ 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()函数 成功后,
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);