2012-04-12 23 views
11

Tôi muốn kiểm tra xem liệu người dùng có thuộc một OU mẹ cụ thể không.Nhận cấp độ gốc của người dùng trong Active Directory bằng C#

Tôi có thể làm như thế nào?

Kiểm tra mã bên dưới để biết rõ ràng về những gì tôi đang tìm kiếm.

using System.DirectoryServices.AccountManagement; 

public bool IsUserInOU(string samAccountName, string OUName){ 

    using (var context = new PrincipalContext(ContextType.Domain)) 
     { 
      using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, samAccountName)) 
      {      
       //Check if the user is in the OU specified in OUName 
       //Something like: 
       //return user.IsInOU(OUName); 
      } 
     } 
} 

public void TestIt_1(){ 
    //The parent OU of this user is "AwesomeOU" 
    string samAccountName = "Joe"; 
    string OUName = "AwesomeOU"; 
    bool expected = true; 
    bool actual = IsUserInOU(samAccountName, OUName); 
    Assert.AreEqual(expected, actual); 
} 

public void TestIt_2(){ 
    //The parent OU of this user is "WhateverOU" 
    string samAccountName = "Mike"; 
    string OUName = "AwesomeOU"; 
    bool expected = false; 
    bool actual = IsUserInOU(samAccountName, OUName); 
    Assert.AreEqual(expected, actual); 
} 

Domain:

  • Quốc OU
    • tạo ảnh vui nhộn OU
      • Joe
    • Dù OU
      • Mike

Giải pháp 1 sau câu trả lời empi của

Với những thông tin được đưa ra bởi empi, tôi đã viết các phương pháp dưới đây để trích xuất các OU đầu tiên trong DistinguishedName. Sau khi làm điều đó, phần còn lại thật dễ dàng.

public static string GetOUForUser(string samAccountName) 
    { 
     using (var context = new PrincipalContext(ContextType.Domain)) 
     { 
      using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, samAccountName)) 
      { 
       //System.Console.WriteLine(user.DistinguishedName); 
       int startIndex = user.DistinguishedName.IndexOf("OU=", 1) + 3; //+3 for length of "OU=" 
       int endIndex = user.DistinguishedName.IndexOf(",", startIndex); 
       var group = user.DistinguishedName.Substring((startIndex), (endIndex - startIndex)); 
       return group; 
      } 
     } 
    } 

Giải pháp 2 sau câu trả lời JPBlanc của

public static string GetOUForUser(string samAccountName) 
    { 
     using (var context = new PrincipalContext(ContextType.Domain)) 
     { 
      using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, samAccountName)) 
      { 
       using (DirectoryEntry deUser = user.GetUnderlyingObject() as DirectoryEntry) 
       { 
        using (DirectoryEntry deUserContainer = deUser.Parent) 
        { 
         return deUserContainer.Properties["Name"].Value.ToString(); 
        } 
       } 
      } 
     } 
    } 
+1

Không hoạt động nếu các đối tượng có dấu phẩy trong tên phân biệt của chúng. Bạn cần phải xử lý cách những người đang trốn thoát, hoặc sử dụng giải pháp JPBlanc 2. – Chalky

Trả lời

12

Ok @Empi giải pháp đang làm việc, nhưng UserPrincipal được xây dựng trên DirectoryEntry đối tượng cung cấp một parent hoặc container tài sản mà chỉ cung cấp cho bạn các đối tượng bạn đang tìm kiếm, mà không sử dụng chuỗi cách.

/* Retreiving a principal context 
*/ 
PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "WM2008R2ENT:389", "dc=dom,dc=fr", "dom\\jpb", "MyPwd"); 

/* Retreive a user 
*/ 
UserPrincipal user = UserPrincipal.FindByIdentity(domainContext, "user1"); 

/* Retreive the container 
*/ 
DirectoryEntry deUser = user.GetUnderlyingObject() as DirectoryEntry; 
DirectoryEntry deUserContainer = deUser.Parent; 
Console.WriteLine (deUserContainer.Properties["distinguishedName"].Value); 
+1

Tuyệt vời! Dường như không có cách nào tao nhã hơn. :) – Kjensen

+1

Không biết điều đó :) – empi

2

Thông tin này là trong UserPrincipal.DistinguishedName. Bạn nên kiểm tra nếu DistinguishedName kết thúc bằng "," + ou tên phân biệt (phân biệt chữ hoa chữ thường). Tuy nhiên, bạn phải biết tên distingushed của ou bạn đang kiểm tra.

Ví dụ: nếu dn là: CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=COM, thì người dùng nói rằng người dùng đang ở OU=Sales,DC=Fabrikam,DC=COM ou.

+1

Đó là một bước xa hơn, cảm ơn! Tôi có thể xâu chuỗi theo cách của tôi để giải quyết ngay bây giờ, nhưng có vẻ như sẽ có một cách đẹp hơn. – Kjensen

+3

Theo như tôi biết nó không phải là một hack. Nó chỉ là cách dịch vụ thư mục hoạt động. Nếu bạn đã được đưa ra một đường dẫn tập tin và bạn nên kiểm tra xem tập tin có trong một số thư mục bạn sẽ làm điều tương tự. – empi

+0

Tôi đoán bạn đã đúng. Cảm ơn. :) – Kjensen

Các vấn đề liên quan