2008-12-21 3 views
19

Làm cách nào để tạo tài khoản người dùng cục bộ bằng .NET 2.0 và C# và cũng có thể đặt "Mật khẩu không bao giờ hết hạn".Tạo tài khoản người dùng cục bộ C# và .NET 2.0

Tôi đã thử sử dụng "Net.exe" bằng cách sử dụng Process.Start và chuyển các tham số của nó nhưng có vẻ như "người dùng net" không thể đặt "Mật khẩu không bao giờ hết hạn" để không bao giờ.

Trả lời

21

Đọc bài viết này CodeProject tuyệt vời

Howto: (Almost) Everything In Active Directory via C#

Có một phần "Create User Account" và "Xử lý tài Passwords".

UPDATE:

Để thích ứng với các mã cho các tài khoản địa phương thay thế các dòng tương ứng với những:

DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + 
    Environment.MachineName); 
DirectoryEntry newUser = localMachine.Children.Add("localuser", "user"); 

đây bắt đầu đoạn mã ban đầu cho các tài khoản tên miền:

public string CreateUserAccount(string ldapPath, string userName, 
    string userPassword) 
{ 
    string oGUID = string.Empty; 
    try 
    {   
     string connectionPrefix = "LDAP://" + ldapPath; 
     DirectoryEntry dirEntry = new DirectoryEntry(connectionPrefix); 
     DirectoryEntry newUser = dirEntry.Children.Add 
      ("CN=" + userName, "user"); 
     newUser.Properties["samAccountName"].Value = userName; 

     int val = (int)newUser.Properties["userAccountControl"].Value; 
     newUser.Properties["userAccountControl"].Value = val | 0x10000; 

     newUser.CommitChanges(); 
     oGUID = newUser.Guid.ToString(); 

     newUser.Invoke("SetPassword", new object[] { userPassword }); 
     newUser.CommitChanges(); 

     dirEntry.Close(); 
     newUser.Close(); 
    } 
    catch (System.DirectoryServices.DirectoryServicesCOMException E) 
    { 
     //DoSomethingwith --> E.Message.ToString();  
    } 
    return oGUID; 
} 

Có một số chi tiết cụ thể để hiểu khi giao dịch với mật khẩu người dùng và ranh giới xung quanh mật khẩu như buộc người dùng phải thay đổi mật khẩu họ khi đăng nhập tiếp theo, phủ nhận người dùng có quyền thay đổi mật khẩu riêng của họ, thiết lập mật khẩu để không bao giờ hết hạn, khi nào hết hạn và các tác vụ này có thể được thực hiện bằng cách sử dụng các cờ UserAccountControl được minh họa trong phần tiến hành.

Vui lòng tham khảo MSDN article: Managing User Passwords để biết các ví dụ và tài liệu về các tính năng này.

CONST       HEX 
------------------------------------------ 
SCRIPT       0x0001 
ACCOUNTDISABLE     0x0002 
HOMEDIR_REQUIRED    0x0008 
LOCKOUT      0x0010 
PASSWD_NOTREQD     0x0020 
PASSWD_CANT_CHANGE    0x0040 
ENCRYPTED_TEXT_PWD_ALLOWED  0x0080 
TEMP_DUPLICATE_ACCOUNT   0x0100 
NORMAL_ACCOUNT     0x0200 
INTERDOMAIN_TRUST_ACCOUNT  0x0800 
WORKSTATION_TRUST_ACCOUNT  0x1000 
SERVER_TRUST_ACCOUNT   0x2000 
DONT_EXPIRE_PASSWORD   0x10000 
MNS_LOGON_ACCOUNT    0x20000 
SMARTCARD_REQUIRED    0x40000 
TRUSTED_FOR_DELEGATION   0x80000 
NOT_DELEGATED     0x100000 
USE_DES_KEY_ONLY    0x200000 
DONT_REQ_PREAUTH    0x400000 
PASSWORD_EXPIRED    0x800000 
TRUSTED_TO_AUTH_FOR_DELEGATION 0x1000000 
+0

Các liên kết bạn chỉ định là cho thư mục hoạt động. Có lẽ tôi không rõ ràng. Tôi muốn thay đổi tài khoản người dùng cục bộ (Máy tính không phải là một phần của thư mục hoạt động). – mrtaikandi

+0

Theo như tôi nhớ, nó cũng nên áp dụng cho các tài khoản cục bộ. – splattne

+0

@ Mohammadreza: Tôi đã cập nhật câu trả lời của mình. Bây giờ có mã xử lý các tài khoản cục bộ – splattne

21

Mã này sẽ tạo ra một tài khoản cục bộ với mật khẩu không bao giờ hết hạn tùy chọn thiết lập:

 using System.DirectoryServices; 

     DirectoryEntry hostMachineDirectory = new DirectoryEntry("WinNT://localhost"); 
     DirectoryEntries entries = hostMachineDirectory.Children; 
     bool userExists = false; 
     foreach (DirectoryEntry each in entries) 
     { 
      userExists = each.Name.Equals("NewUser", 
      StringComparison.CurrentCultureIgnoreCase); 
      if (systemtestUserExists) 
       break; 
     } 

     if (false == userExists) 
     { 
      DirectoryEntry obUser = entries.Add("NewUser", "User"); 
      obUser.Properties["FullName"].Add("Local user"); 
      obUser.Invoke("SetPassword", "[email protected]"); 
      obUser.Invoke("Put", new object[] {"UserFlags", 0x10000}); 
      obUser.CommitChanges(); 
     } 

Các 0x10000 cờ nghĩa PasswordNeverExpires.

Tôi đã dành một thời gian dài để tìm hiểu cách tạo tài khoản người dùng cục bộ với mật khẩu được đặt không hết hạn. Có vẻ như khi bạn cố gắng sử dụng:

int val = (int)newUser.Properties["userAccountControl"].Value; 
newUser.Properties["userAccountControl"].Value = val | 0x10000 

quyền từ thư mục hoạt động có hiệu lực. Nếu bạn có quyền thư mục hoạt động, mọi thứ hoạt động tốt. Nếu bạn không nhận được thuộc tính userAccountControl sẽ luôn dẫn đến giá trị null. Cố gắng đặt userAccountControl sẽ dẫn đến một ngoại lệ "Không thể tìm thấy thuộc tính thư mục trong bộ nhớ cache".

Tuy nhiên sau nhiều lần khám phá xung quanh, tôi tìm thấy một thuộc tính khác "UserFlags" cần được đặt bằng cách sử dụng Gọi. Bạn có thể sử dụng điều này để đặt cờ trên tài khoản cục bộ. Tôi đã thử mã này và nó đã làm việc trên windows server 2008.

Hy vọng điều này sẽ giúp

+0

Đẹp nhất, +1. Một vài lưu ý: đầu tiên, DirectoryEntry là dùng một lần, vì vậy tốt hơn bọc với một sử dụng {}; thứ hai, hàm tạo DirectoryEntry có thể lấy tên máy từ xa nếu bạn cần tạo một người dùng cục bộ trên một hộp điều khiển từ xa. –

0

using System.DirectoryServices;

DirectoryEntry hostMachineDirectory = new DirectoryEntry("WinNT://localhost"); 
    DirectoryEntries entries = hostMachineDirectory.Children; 
    bool userExists = false; 
    foreach (DirectoryEntry each in entries) 
    { 
     userExists = each.Name.Equals("NewUser", 
     StringComparison.CurrentCultureIgnoreCase); 
     if (systemtestUserExists) 
      break; 
    } 

    if (false == userExists) 
    { 
     DirectoryEntry obUser = entries.Add("NewUser", "User"); 
     obUser.Properties["FullName"].Add("Local user"); 
     obUser.Invoke("SetPassword", "[email protected]"); 
     obUser.Invoke("Put", new object[] {"UserFlags", 0x10000}); 
     obUser.CommitChanges();