2017-06-22 69 views
0

我有用C#編寫的測試工具。使用System.DirectoryServices.AccountManagement;我正在通過虛擬服務器(LDAP)在遠程計算機上創建一個到Active Directory的PrincipalContext連接。Active Directory LDAP,提高讀取組的權限..?

我100%能夠連接到活動目錄,並使用用戶名和密碼(UserPrincipal.FindByIdentity,然後context.ValidateCredentials)進行身份驗證。我不能讀取羣組。它撤回默認的,如域用戶。 如果我將該實用程序作爲虛擬服務器(不是AD中存在的用戶)的本地管理員運行,那麼突然間我可以使用相同的確切參數從Active Directory中獲取所有指定用戶的組。

這怎麼可能?我錯過了什麼?

我的代碼如下,雖然我相信問題與代碼完全無關,如上所述,運行提升時可以正常工作。

   g_context = new PrincipalContext(ContextType.Domain, this.USERDOMAIN); 
       g_principal = UserPrincipal.FindByIdentity(g_context, IdentityType.SamAccountName, this.USERNAME); 
       this.g_entry = (DirectoryEntry)g_principal.GetUnderlyingObject(); 
       this.AUTHENTICATED = g_context.ValidateCredentials(this.USERNAME, this.USERPASS); 

這就是設置。然後,我們後來用g_context ..

List<String> memberships=GetGroups(this.g_principal, true); // get a list of all possible groups for user

的遞歸組掃描功能的調用..

private List<String> GetGroups(Principal source, bool debug, int depth=0, List<String> resultset=null) { 
      if (resultset==null) resultset = new List<String>(); 
      depth++; 
      foreach (GroupPrincipal group in source.GetGroups()) { 
       if (!resultset.Contains(group.Name)) { 
        resultset.Add(group.Name); 
        if (debug) { 
         log.Debug((String.Join("\t",new String[depth-1]))+"Located group("+group.Name+") at depth: "+depth); 
        } 
        resultset=GetGroups(group, debug, depth, resultset); 
       } 
      } 
      return resultset; 
     } 

當以管理員身份運行,AD與用戶名的所有可能的組成員響應。當不是作爲高級程序運行時,AD用較少的組(僅基本組)響應。

任何有關我需要挖掘解決方案的建議?在虛擬Windows機器上是否存在一些隱藏的本地策略,這會在非管理員的ldap連接上隱藏活動目錄數據?

回答

1

發現問題,基本上AD 2008 /早些時候(顯然)在非管理員用戶(或其他類似用戶)的要求下沒有響應所有組。不得不使用不同的方法..

信息搜索結果條目掃描[CN]屬性 濾波器=的String.Format( 「(&(objectCategory =基團)(成員= {0}))」,user.DistinguishedName);

或使用具有組合集的System.Security.Principal.WindowsIdentity進行循環。

這兩個工作正常。