2010-02-21 50 views
18

Tôi đang tìm cách tạo người dùng Active Directory và đặt mật khẩu của mình, tốt nhất là không cung cấp đặc quyền Quản trị miền của ứng dụng/dịch vụ.Tạo người dùng Active Directory bằng mật khẩu trong C#

Tôi đã thử những điều sau đây:

DirectoryEntry newUser = _directoryEntry.Children.Add("CN=" + fullname, USER); 
newUser.Properties["samAccountName"].Value = username; 
newUser.Properties["userPassword"].Value = password; 
newUser.Properties["mail"].Value = email; 
newUser.CommitChanges(); 

Người dùng được tạo ra, nhưng có vẻ như các mật khẩu không bao giờ được đặt trên người dùng.

Có ai có ý tưởng về cách đặt mật khẩu của người dùng ban đầu khi tạo người dùng không? Tôi biết về

.Invoke("SetPassword", new object[] { password }) 

Nhưng điều đó yêu cầu mã của tôi phải được chạy với đặc quyền Quản trị viên miền. Vì tôi không thực sự thấy điểm để cấp đặc quyền Quản trị miền của mình, chỉ cần đặt mật khẩu ban đầu (tôi cũng cho phép đặt lại mật khẩu người dùng, nhưng những người chạy trong ngữ cảnh của người dùng cụ thể đó), tôi hy vọng ai đó có thông minh giải pháp không yêu cầu tôi làm như vậy.

Cảm ơn trước!

+0

Đó là lựa chọn duy nhất chúng tôi có, tôi đặt cược bạn ở cùng một chiếc thuyền, nhưng cung cấp cho bạn lựa chọn thay thế 3,5 bên dưới trong trường hợp đó là tùy chọn. Tôi có 1/4 mã so với phong cách 'DirectoryEntry' là lựa chọn duy nhất trước đây, tôi ** rất khuyên bạn nên đưa ra một không gian tên mới. –

Trả lời

25

Bạn có thể làm toàn bộ quá trình này dễ dàng hơn nhiều bây giờ với System.DirectoryServices.AccountManagement (miễn là bạn đang ở trên Net 3.5):

See here for a full rundown

Dưới đây là một ví dụ nhanh của trường hợp cụ thể của bạn:

using(var pc = new PrincipalContext(ContextType.Domain)) 
{ 
    using(var up = new UserPrincipal(pc)) 
    { 
    up.SamAccountName = username; 
    up.EmailAddress = email; 
    up.SetPassword(password); 
    up.Enabled = true; 
    up.ExpirePasswordNow(); 
    up.Save(); 
    } 
} 
+3

Đừng quên vứt bỏ bối cảnh và các đối tượng nguyên tắc khi bạn hoàn thành. Điều này được thực hiện tốt nhất với câu lệnh 'using' trên' pc' và 'up'. – tvanfosson

+0

Cảm ơn rất nhiều! Điều đó dường như làm các trick. – RajenK

+0

@tvanfosson - Điểm tuyệt vời, thậm chí các ví dụ nhanh chóng nên được sao chép/dán xứng đáng, cập nhật! –

4

Tôi muốn sử dụng mã của @ Nick (được đính kèm trong các câu lệnh using để bối cảnh và hiệu trưởng được xử lý đúng cách). Đối với các đặc quyền, bạn sẽ cần ít nhất có đủ đặc quyền trên OU nơi bạn đang tạo người dùng để tạo và quản lý các đối tượng. Tôi muốn tạo một người dùng cụ thể mà theo đó chương trình của bạn sẽ chạy và cung cấp cho nó chỉ đủ đặc quyền để thực hiện các tác vụ mà nó cần trong OU cụ thể đó và không còn nữa.

3

Có cũng có thể sử dụng mã dưới đây để tạo ra số lượng lớn người sử dụng

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

     for (int i = 0; i < 10; 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) 
      { 

      } 
     } 
1

Hãy thử với mã này.

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

for (int i = 0; i < 10; 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