2013-05-15 45 views
12

Tôi đang cố gắng xác định xem tài khoản người dùng trong AD có được bật hay không. Đối với điều này tôi sử dụng đoạn mã sau:Tại sao UserPrincipal.Enabled trả về các giá trị khác nhau?

string domain = "my domain"; 
string group = "my security group"; 
string ou = "my OU"; 

//init context 
using (var cnt= new PrincipalContext(ContextType.Domain, domain)) 
{ 
    //find the necessary security group 
    using (GroupPrincipal mainGroup 
       = GroupPrincipal.FindByIdentity(cnt, IdentityType.Guid, group)) 
    { 
     if (mainGroup != null) 
     { 
      //get the group's members 
      foreach (var user in mainGroup.GetMembers() 
            .OfType<UserPrincipal>() 
            .Where(u => u.DistinguishedName.Contains(ou))) 
      { 
       //ensure that all the info about the account is loaded 
       //by using FindByIdentity as opposed to GetMembers 
       var tmpUser= UserPrincipal.FindByIdentity(cnt, 
                  user.SamAccountName); 
       //actually I could use `user` variable, 
       //as it gave the same result as `tmpUser`. 

       //print the account info 
       Console.WriteLine(tmpUser.Name + "\t" + 
            tmpUser.Enabled.HasValue + "\t" + 
            tmpUser.Enabled.Value);      
      } 
     } 
    } 
} 

Vấn đề là, khi tôi chạy mã này dưới tài khoản quản trị, tôi nhận được kết quả thực sự, trong khi khi tôi chạy nó dưới một tài khoản không phải priviledged, user.Enabled lợi nhuận false đối với một số tài khoản, trong khi đó phải là true.

Các chỉ q tương tự & một Tôi cố gắng tìm được

  1. UserPrincipal.Enabled returns False for accounts that are in fact enabled?
  2. Everything in Active Directory via C#.NET 3.5 (Using System.DirectoryServices.AccountManagement)

mà không giúp đỡ ở đây.

Tại sao vậy? Các tùy chọn của tôi để nhận thông tin này trong tài khoản không được quản lý là gì?


Đây là cách tiếp cận khác: How to determine if user account is enabled or disabled:

private bool IsActive(DirectoryEntry de) 
{ 
    if (de.NativeGuid == null) 
     return false; 

    int flags = (int)de.Properties["userAccountControl"].Value; 

    if (!Convert.ToBoolean(flags & 0x0002)) 
     return true; 
    else 
     return false; 
} 

Cùng phương pháp được mô tả trong Active Directory Objects and C#.

Tuy nhiên khi chạy trong tài khoản người dùng chưa được khai thác, thuộc tính userAccountControlnull và không thể xác định trạng thái tài khoản.


Cách giải quyết ở đây là sử dụng PrincipalContext Constructor, chỉ định thông tin xác thực của người dùng có đủ quyền truy cập vào AD.

Nó vẫn không rõ ràng với tôi, tại sao người dùng không được khai thác có quyền truy cập vào AD ở tất cả, và không thể nhận được giá trị của một số thuộc tính tài khoản nhất định. Có lẽ điều này không liên quan gì đến C# và phải được định cấu hình trong AD ...

Trả lời

1

Bạn sẽ cần ủy quyền quyền trong Active Directory cho các tài khoản sẽ thực hiện truy vấn AD. Đây là những gì tôi phải làm cho các ứng dụng của mình hoạt động (mặc dù chúng tôi đang thực hiện các tác vụ quản trị khác trên tài khoản người dùng).

Kiểm tra Here để biết hướng dẫn về cách ủy quyền (hoặc xem chặn bên dưới).

Bạn có thể gọi các thủ tục sau đây để chạy các đoàn đại biểu:

  • Bắt đầu đoàn công tác của thuật sĩ kiểm soát bằng cách thực hiện các bước sau:
    • mở Active Directory Users and Computers.
    • Trong cây giao diện điều khiển, bấm đúp vào nút miền.
    • Trong trình đơn chi tiết, nhấp chuột phải vào đơn vị tổ chức, nhấp vào kiểm soát ủy quyền và nhấp vào tiếp theo.
    • Chọn người dùng hoặc nhóm mà bạn muốn ủy nhiệm các tác vụ quản trị chung.Để thực hiện việc này, hãy thực hiện các bước sau:
    • Trên trang Người dùng hoặc Nhóm, nhấp vào Thêm.
    • Trong Chọn người dùng, máy tính hoặc Nhóm, hãy viết tên của người dùng và nhóm mà bạn phải ủy quyền kiểm soát đơn vị tổ chức, hãy nhấp vào OK. Và nhấp vào tiếp theo.
    • Gán các tác vụ phổ biến để ủy quyền. Để thực hiện việc này, hãy thực hiện các tác vụ phổ biến sau đây.
    • Trên các tác vụ để phân trang trang, hãy nhấp vào ủy nhiệm các tác vụ phổ biến sau đây.
    • Trên các tác vụ để ủy quyền trang, hãy chọn các tác vụ bạn muốn ủy quyền và nhấp vào OK. Kích Finish

Ví dụ: Để ủy quản trị viên để di chuyển đối tượng người dùng/máy tính, bạn có thể sử dụng chế độ trước trong AD người dùng và máy tính và chạy đoàn. Nó phải có đặc quyền ghi trong cả OU cho đối tượng di chuyển. Để viết giá trị mới, tài khoản quản trị viên phải có các giá trị được ủy quyền trên tài khoản người dùng (Đặc quyền đầy đủ trong OU cụ thể.

Điều gì đó đáng để xem xét là nếu tài khoản có thuộc tính userAccountControl. Trong hầu hết các trường hợp, thuộc tính này phải được đặt thành NormalAccount:

+0

Nếu bạn có thể thêm hướng dẫn chính xác từ liên kết của bạn, câu trả lời của bạn sẽ tốt hơn và an toàn không bị liên kết bị hỏng! – ForceMagic

+1

Cảm ơn. Đã thêm blockquote thông tin liên quan từ liên kết. –

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