Я работаю над программным обеспечением Windows, которое может отображать информацию обо всех пользователях, группах и общих папках в домене, когда вы вводите учетную запись администратора домена. У меня возникли проблемы с получением информации о некоторых общих папках, потому что эти папки даже не предоставляли разрешения на общий доступ администраторам домена (удалите вкладку Все на общей вкладке). GetFileSecurity или GetNamedSecurityInfo возвращает код ошибки 5). Но, как администратор домена, я думаю, что мог бы иметь доступ к информации о разрешениях общих папок (только списки контроля доступа, без необходимости в разрешении на полный доступ) на компьютерах моего домена.
Я узнал о методе олицетворения для входа в систему в качестве другого пользователя, и если я войду в систему как пользователь домена, которому предоставлено разрешение на чтение на вкладке общего доступа общей папки, я смогу успешно получить списки управления доступом. Но проблема здесь в том, что я не знаю пароль пользователя домена в практической среде, хотя я знаю их имена пользователей и могу менять их пароли.
Итак, как заставить токен доступа пользователя домена выдавать себя за другое лицо, если у меня уже есть учетная запись администратора домена или есть еще какой-либо способ?
Я разрабатываю его на 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;
}
}