[英]Getting Error Querying Active Directory On The Server Only
我有以下代碼塊,使用System.DirectoryServices.AccountManagement
通過組名向Active Directory查詢用戶:
var domainContext = new PrincipalContext(ContextType.Domain, "company.container.internal");
var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext, IdentityType.Name, "Lvl1Users");
if (groupPrincipal != null)
{
//Read the values
}
現在,該網站使用以下內容:
在我的本地計算機上(您知道如何運行),一切都很好。 在本地嘗試的同行們也很好用。 但是,一旦部署到服務器,它將顯示以下內容:
發生操作錯誤。
我研究的所有內容都說這是權限問題。 需要注意的一件事是,在本地計算機上,我位於MainNetwork
域上,該域是我正在查詢的company.container.internal
域的父級。 IIS計算機位於company.container.internal
並且正在查詢同一域。 坦白說,我認為更具挑戰性的情況是在本地計算機上讀取AD,該本地計算機位於其他域中,但是可以正常工作。 在查詢相同域的服務器上,它失敗。
這是我嘗試過的, 但沒有一個起作用:
MainNetwork
域上的admin用戶一起操縱本地塊中的調用上下文。 company.container.internal
域上的管理員用戶一起在本地塊中操縱調用的上下文。 using (HostingEnvironment.Impersonate())
這里有什么? 我嘗試在兩個域上模擬每種類型的電源管理員,並使用了多個AppPool設置,但我始終遇到相同的錯誤。 域聲明中是否需要更改代碼中的任何內容,或者我缺少權限問題?
我發現了這一點,結果發現使用HostingEnvironment.Impersonate()
仍然是解決問題的根源。 我已經嘗試過了,但是我的代碼還有另一個問題。
問題常常是,進行Active Directory調用的上下文是在沒有權限的用戶下進行的(由於用戶令牌是一個事實,因此在ASP.NET中,如果identity impersonate="true"
也會發生這種情況)通過以下網址對另一台服務器進行身份驗證時無法使用的“輔助令牌”: http : //bit.ly/1753RjA )。
下面的代碼將確保運行該代碼塊是在運行ASP.NET站點的AppPool
(即NETWORKSERVICE
)的上下文中運行的。
using (HostingEnvironment.Impersonate())
{
var domainContext = new PrincipalContext(ContextType.Domain, "myDomain.com");
var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext, IdentityType.Name, "PowerUsers");
if (groupPrincipal != null)
{
//code to get the infomation
}
}
但是,一個非常重要的細節是, 所有調用Active Directory的代碼都必須在該塊中。 我曾經使用過我的一個團隊成員編寫的一些代碼,該代碼返回類型為Users
(自定義類)的LINQ
查詢結果,但未評估表達式(錯誤的做法)。 因此,返回了表達式樹而不是結果。
最終發生的是調用代碼最終評估了結果,並且仍然出現“ An operations error occurred
消息。 我雖然上面的代碼修復不起作用。 實際上確實可以,但是有代碼在塊外評估結果。
簡而言之,請確保所有用於訪問Active Directory的代碼都在using
塊的內部,並且應該修復將服務/應用程序部署到服務器的異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.