0

我正在编写一些 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;
       }
}
4

0 回答 0