2009-08-19 50 views
20

Tôi cần tạo người dùng mới trong Active Directory. Tôi đã tìm thấy một số ví dụ như sau:Tạo người dùng Active Directory trong .NET (C#)

using System; 
using System.DirectoryServices; 

namespace test { 
    class Program { 
     static void Main(string[] args) { 
     try { 
      string path = "LDAP://OU=x,DC=y,DC=com"; 
      string username = "johndoe"; 

      using (DirectoryEntry ou = new DirectoryEntry(path)) { 
       DirectoryEntry user = ou.Children.Add("CN=" + username, "user"); 

       user.Properties["sAMAccountName"].Add(username); 

       ou.CommitChanges(); 
      } 
     } 
     catch (Exception exc) { 
      Console.WriteLine(exc.Message); 
     } 
     } 
    } 
} 

Khi tôi chạy mã này, tôi không gặp lỗi, nhưng không có người dùng mới nào được tạo.

Tài khoản tôi đang chạy thử nghiệm có đủ đặc quyền để tạo người dùng trong Đơn vị tổ chức đích.

Tôi có thiếu thứ gì đó (có thể một số thuộc tính bắt buộc của đối tượng người dùng) không?

Bất kỳ ý tưởng nào về lý do mã không đưa ra ngoại lệ?

EDIT
Sau đây làm việc cho tôi:

int NORMAL_ACCOUNT = 0x200; 
int PWD_NOTREQD = 0x20; 
DirectoryEntry user = ou.Children.Add("CN=" + username, "user"); 
user.Properties["sAMAccountName"].Value = username; 
user.Properties["userAccountControl"].Value = NORMAL_ACCOUNT | PWD_NOTREQD; 
user.CommitChanges(); 

Vì vậy, trên thực tế đã có một vài vấn đề:

  1. CommitChanges phải được gọi vào user (nhờ Rob)
  2. Chính sách mật khẩu đã ngăn người dùng tạo (nhờ Marc)

Trả lời

16

Tôi nghĩ rằng bạn đang gọi CommitChanges trên DirectoryEntry sai.Trong tài liệu MSDN (http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentries.add.aspx) nó nói như sau (nhấn mạnh thêm bởi tôi)

Bạn phải gọi CommitChanges phương pháp trên gương mặt mới để làm cho việc tạo ra vĩnh viễn. Khi bạn gọi phương thức này, bạn có thể đặt giá trị thuộc tính bắt buộc trên mục nhập mới. Mỗi nhà cung cấp có các yêu cầu khác nhau đối với các thuộc tính cần được thiết lập trước khi thực hiện cuộc gọi đến phương thức CommitChanges. Nếu những yêu cầu đó không được đáp ứng, nhà cung cấp có thể ném một ngoại lệ. Kiểm tra với nhà cung cấp của bạn để xác định thuộc tính nào phải được đặt trước khi thực hiện thay đổi.

Vì vậy, nếu bạn thay đổi mã của bạn để user.CommitChanges() nó nên làm việc, nếu bạn cần phải thiết lập các thuộc nhiều hơn chỉ là tên tài khoản sau đó bạn sẽ nhận được một ngoại lệ.

Vì bạn hiện đang gọi CommitChanges() trên OU chưa được thay đổi nên sẽ không có ngoại lệ.

+0

Good catch !! :-) –

+1

sức mạnh của việc đọc "hướng dẫn" trong hành động :) – balexandre

8

Giả sử con đường OU bạn OU=x,DC=y,DC=com thực sự tồn tại - nó nên làm việc :-)

Những điều cần kiểm tra:

  • bạn đang thêm một giá trị cho "sAMAccountName" - tại sao không bạn chỉ cần thiết lập giá trị của nó:

    user.Properties["sAMAccountName"].Value = username; 
    

Nếu không, bạn có thể kết thúc với sever al samAccountNames - và điều đó sẽ không làm việc .....

  • bạn không thiết lập các userAccountControl tài sản để bất cứ điều gì - hãy thử sử dụng:

    user.Properties["userAccountControl"].Value = 512; // normal account 
    
  • làm bạn có nhiều bộ điều khiển miền trong tổ chức của bạn? Nếu bạn và bạn đang sử dụng liên kết "không có máy chủ" này (không chỉ định bất kỳ máy chủ nào trong đường dẫn LDAP), bạn có thể ngạc nhiên khi người dùng được tạo :-) và sẽ mất vài phút đến nửa giờ để đồng bộ hóa trên toàn bộ mạng

  • bạn có chính sách mật khẩu đúng không? Có lẽ đó là vấn đề. Tôi nhớ chúng tôi đã từng phải tạo người dùng bằng tùy chọn "không yêu cầu mật khẩu" trước, hãy thực hiện một lần đầu tiên .CommitChanges(), sau đó tạo mật khẩu đủ mạnh, đặt mật khẩu trên người dùng và xóa tùy chọn người dùng đó.

Marc

0

Kiểm tra mã dưới đây

DirectoryEntry ouEntry = new DirectoryEntry("LDAP://OU=TestOU,DC=TestDomain,DC=local"); 

     for (int i = 3; i < 6; i++) 
     { 
      try 
      { 
       DirectoryEntry childEntry = ouEntry.Children.Add("CN=TestUser" + i, "user"); 
       childEntry.CommitChanges(); 
       ouEntry.CommitChanges(); 
       childEntry.Invoke("SetPassword", new object[] { "password" }); 
       childEntry.CommitChanges(); 
      } 
      catch (Exception ex) 
      { 

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