我正在编写一些 c++ 代码来检索另一台计算机中共享折叠的权限,“权限”是指允许或拒绝该文件夹的用户或组。
这是在某个远程机器(名为 strServerName,其 ip 为 strServerIP)中获取共享文件夹(名为 strFileName)的 NTFS 安全描述符的函数。问题是当我删除“共享”选项卡中的“所有人”帐户时文件夹中,GetNamedSecurityInfo 函数将失败并出现错误代码 5,这意味着访问被拒绝。但是,如果我保留“所有人”,该功能就可以正常工作。我不能保证某个远程共享文件夹上是否保留了“所有人”。那么如何在没有“Everyone”的情况下让这个功能工作(或其他可以检查权限的方法都可以)?
PSECURITY_DESCRIPTOR ADDirectorySearch::getNTFSSecDescriptor2(CString strFileName, CString strServerName, CString strServerIP)
{
//CString strServerNameWithSlash = _T("\\\\") + strServerName;//"\\\\veotax3";
CString strFilePathName = _T("\\\\") + strServerName + _T("\\") + strFileName;//"\\\\veotax3\\nrdc1001";
CString strFilePathName2 = _T("\\\\") + strServerIP + _T("\\") + strFileName;//"\\\\192.168.1.7\\nrdc1001";
_bstr_t bstrFilePathName = strFilePathName;
BOOL bSuccess = FALSE;
PSECURITY_DESCRIPTOR pSecDescriptorBuf = NULL;
DWORD dwSizeNeeded = 0;
label2:;
bSuccess = GetNamedSecurityInfoW(bstrFilePathName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, NULL, NULL, &pSecDescriptorBuf);
//bSuccess = GetFileSecurityW(bstrFilePathName, DACL_SECURITY_INFORMATION, NULL, 0, &dwSizeNeeded);
if (ERROR_SUCCESS != bSuccess)
{
if (strFilePathName != strFilePathName2)
{
strFilePathName = strFilePathName2;
bstrFilePathName = strFilePathName2;
goto label2;
}
else
{
MyMessageBox_Error(_T("getNTFSSecDescriptor2 Error."), _T("Error"));
return NULL;
}
}
else
{
return pSecDescriptorBuf;
}
}