別のコンピューターで共有フォルダーのアクセス許可を取得する C++ コードを書いています。「アクセス許可」とは、このフォルダーに対してどのユーザーまたはグループが許可または拒否されているかなどを意味します。
特定のリモート マシン (strServerName という名前で、IP は strServerIP です) の共有フォルダー (strFileName という名前) の NTFS セキュリティ記述子を取得する関数を次に示します。フォルダーにアクセスできない場合、GetNamedSecurityInfo 関数は、アクセスが拒否されたことを意味するエラー コード 5 で失敗します。しかし、「全員」を保持すると、機能は正常に機能します。「全員」が予約されているか、リモート共有フォルダーにないかは保証できません。では、「全員」なしでこの機能を機能させる方法(または権限を確認できる他の方法で問題ありません)?
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;
}
}