2012-06-08 25 views
0

我正在使用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; 
    } 

}

回答

2

我讀了你的另一個問題。我想我明白你想要做什麼。爲了實現您的目標,您需要具有impersonation level「Impersonate」或「Delegate」的訪問令牌。你可以通過不同的方式獲得它。提供密碼是最直接的方法。另一種方法是設置一臺機器來執行Protocol Transition

我個人的建議是避免冒充他人。只要確保所有共享文件夾都具有授予域讀取權限的域管理員。正如我在另一個問題中所表明的那樣,這完全不是安全妥協。無論如何,域管理員總是可以有辦法讀取文件夾。

此外,還有一些現有的工具可以從SysInternals做類似的事情。從SysInternals

退房AccessChk.exe和AccessEnum.exe他們都來自相同的權限問題,因爲你所面對的現在受苦。

+0

感謝您留下深刻印象的答案。這個軟件是爲了客戶的需要而不是自用的。我的隊友還表示,當有人試圖分享某些內容時,通常會刪除Everyone讀取權限。所以我無法獲得域管理員的讀訪問權限。但你建議不要使用你提供的兩種方式:採取所有者和模仿。僅供參考,我還發現了一種WMI查詢方法來檢查共享權限,但這種方式依賴於遠程設備上的一些服務和防火牆設置。那麼這裏至少有三種方法,那麼做這件事最安全有效的方法是什麼? – hsluoyz

+0

聽起來像你已經找到了解決方案。在提到WMI後,我會進行一些搜索並瞭解共享文件夾與我描述的不同。我會在另一篇文章中刪除我的答案。我認爲你正朝着正確的方向前進。我剛剛發現您似乎在執行類似於[共享和存儲管理](http://technet.microsoft.com/zh-cn/library/cc731574.aspx)的操作,但您呈現給用戶的方式就像一份報告。 –

+0

我不建議使用模擬,因爲我認爲提供密碼不是一個好方法。首先,你不知道你應該扮演誰。其次,您需要以安全的方式存儲許多用戶的密碼。做協議轉換避免保存密碼。但是,這需要設置一個幾乎與域控制器一樣強大的專用機器。你不希望你的客戶爲此安裝一臺機器。 –

0

忘記授予管理員在創建時訪問包含配置文件或家庭驅動器的共享的常見錯誤。權限通常通過創建者所有者驅動,並且繼承在這些共享中被破壞。只有管​​理員進入的方式是取得所有權。取得所有權當然會給最終用戶帶來問題。在某些情況下,哪裏是誰是特定文件夾的所有者(例如,文件夾名稱等於用戶帳戶名稱)您可以使用腳本將所有權 - >將管理權限 - >設置權限設置回從文件夾名稱收集的用戶帳戶名稱。 如果您仍然有興趣,我可以在這裏發佈代碼

0

您不能也不應該「冒充」任何您沒有密碼的帳戶 - 並且因此沒有權限使用 - 因爲您的意思不是即使您是管理員也可以代表他/她做任何事情,並且可以更改他或她的密碼 - 除非明確授權。您也不應修改任何您不是所有者的文件夾的權限 - 除非獲得授權。做一名「管理員」並不意味着你是一位上帝般的生物,你可以免於公司政策。

這完全是關於「問責制」 - 帳戶不僅允許或拒絕訪問,還記錄和審計誰做了什麼,從而負責。有法律要求可以要求識別和控制誰可以訪問某種敏感信息 - 並限制可以訪問他們的人數。 Windows具有審計用戶操作的功能 - 包括文件訪問。

這就是爲什麼Windows不允許您代表任何用戶行事,除非明確允許 - 即使您是管理員。

管理員從文件夾中刪除訪問權限也有很好的理由 - 管理員總是可以訪問某些內容並不意味着他或她可以這樣做 - 如果沒有許可,可能會讓您遇到麻煩。刪除(某些)管理員的權限意味着您不能「錯誤地」訪問您未明確允許訪問的文件。

在正確設置的系統中,還有日誌被髮送到不同的機器,大多數管理員但高權限的人無法訪問 - 以確保公司的數據保護策略得到執行和審覈,而管理員無法清除日誌以隱藏其日誌軌道。

相關問題