ドメイン管理者アカウントを入力すると、ドメイン内のすべてのユーザー、グループ、および共有フォルダー情報を表示できる Windows ソフトウェアに取り組んでいます。これらのフォルダーはドメイン管理者に共有アクセス許可を付与していないため、一部の共有フォルダー情報を取得するのに問題があります (共有タブで [全員] を削除します)。GetFileSecurity または GetNamedSecurityInfo はエラー コード 5 を返します)。しかし、ドメイン管理者として、ドメイン コンピューターの共有フォルダーのアクセス許可情報 (ACL のみ、フル アクセス許可は必要ありません) にアクセスできると思います。
別のユーザーとしてログオンする偽装方法について学び、共有フォルダーの共有タブで読み取り権限を付与されたドメイン ユーザーとしてログオンすると、ACL を正常に取得できました。しかし、ここでの問題は、ユーザー名を知っていてパスワードを変更できるにもかかわらず、実際の環境ではドメイン ユーザーのパスワードを知らないことです。
では、ドメイン管理者アカウントを既に持っている場合に、ドメイン ユーザーのアクセス トークンを偽装する方法、または他に方法はありますか?
C++ と ADSI を使用して開発しています。ログオンして NTFS セキュリティの説明を取得する方法は次のとおりです。
BOOL ADDirectorySearch::logOnByUserPassword(CString strDomainName, CString strUserName, CString strPassword) {
CString strFullUserName = strDomainName + _T("\\") + strUserName;
HANDLE hToken;
BOOL bResult;
bResult = LogonUser(strFullUserName, strDomainName, strPassword, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, &hToken);
if (bResult == FALSE)
{
MyMessageBox_Error(_T("logOnByUserPassword Error."), _T("Error"));
return FALSE;
}
else
{
bResult = ImpersonateLoggedOnUser(hToken);
if (bResult == FALSE)
{
MyMessageBox_Error(_T("logOnByUserPassword Error."), _T("Error"));
return FALSE;
}
else
{
return TRUE;
}
}
}
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;
}
}