我正在使用Windows軟件,它可以在您輸入域管理員帳戶時顯示域中的所有用戶,組和共享文件夾信息。我在獲取某些共享文件夾信息時遇到了一些麻煩,因爲這些文件夾甚至沒有向域管理員授予共享權限(在共享選項卡中刪除Everyone)。 GetFileSecurity或GetNamedSecurityInfo返回錯誤代碼5)。但作爲域管理員,我想我可以在我的域計算機中訪問共享文件夾的權限信息(只需ACL,不需要完全訪問權限)。如何模擬另一個域用戶,因爲我擁有此AD域的管理員帳戶?
我瞭解了登錄成爲另一個用戶的模擬方法,如果我以共享文件夾的共享選項卡中被授予讀取權限的域用戶身份登錄,則可以成功獲取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;
}
}
感謝您留下深刻印象的答案。這個軟件是爲了客戶的需要而不是自用的。我的隊友還表示,當有人試圖分享某些內容時,通常會刪除Everyone讀取權限。所以我無法獲得域管理員的讀訪問權限。但你建議不要使用你提供的兩種方式:採取所有者和模仿。僅供參考,我還發現了一種WMI查詢方法來檢查共享權限,但這種方式依賴於遠程設備上的一些服務和防火牆設置。那麼這裏至少有三種方法,那麼做這件事最安全有效的方法是什麼? – hsluoyz
聽起來像你已經找到了解決方案。在提到WMI後,我會進行一些搜索並瞭解共享文件夾與我描述的不同。我會在另一篇文章中刪除我的答案。我認爲你正朝着正確的方向前進。我剛剛發現您似乎在執行類似於[共享和存儲管理](http://technet.microsoft.com/zh-cn/library/cc731574.aspx)的操作,但您呈現給用戶的方式就像一份報告。 –
我不建議使用模擬,因爲我認爲提供密碼不是一個好方法。首先,你不知道你應該扮演誰。其次,您需要以安全的方式存儲許多用戶的密碼。做協議轉換避免保存密碼。但是,這需要設置一個幾乎與域控制器一樣強大的專用機器。你不希望你的客戶爲此安裝一臺機器。 –