ローカル ユーザー アカウントの作成 C# および .NET 2.0
質問
.NET 2.0 と C# を使用してローカル ユーザー アカウントを作成し、「パスワードを無期限にする」を無期限に設定するにはどうすればよいですか。
Process.Startを使用して「Net.exe」を使用し、そのパラメータを渡してみましたが、「ネットユーザー」は「パスワードの無期限」を「無期限」に設定できないようです。
解決
この優れた CodeProject 記事を読んでください
方法:C# 経由の Active Directory 内の(ほぼ)すべて
「ユーザーアカウントの作成」と「ユーザーパスワードの処理」セクションがあります。
アップデート:
コードをローカル アカウントに適合させるには、それぞれの行を次のように置き換えます。
DirectoryEntry localMachine = new DirectoryEntry("WinNT://" +
Environment.MachineName);
DirectoryEntry newUser = localMachine.Children.Add("localuser", "user");
ここからはドメイン アカウントの元のコード スニペットを開始します。
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;
}
理解しておくべきいくつかの詳細があります ユーザーパスワードを扱う場合、 パスワードに関する境界 ( ユーザーに 次回ログオン時のパスワード、拒否 ユーザーは自分のものを変更する権利 パスワード、パスワードを never に設定する expire、to to expire、および タスクは、 UserAccountControl フラグ 議事録で実証されています セクション。
この素晴らしいものを参照してください MSDN の記事:ユーザーパスワードの管理 例とドキュメント これらの機能について。
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
他のヒント
このコードはパスワードでローカルアカウントを作成するオプションのセットを無期限にする:
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", "abcdefg12345@");
obUser.Invoke("Put", new object[] {"UserFlags", 0x10000});
obUser.CommitChanges();
}
0x10000番地フラグはPasswordNeverExpiresを意味する。
私は有効期限が切れないように設定されたパスワードを使用してローカルユーザーアカウントを作成する方法を考え出す長い時間を費やしました。あなたが使用しようとすると思われます:
int val = (int)newUser.Properties["userAccountControl"].Value;
newUser.Properties["userAccountControl"].Value = val | 0x10000
アクティブディレクトリからアクセス権が遊びに来ます。あなたは、アクティブディレクトリのパーミッションを持っている場合はすべてが正常に動作します。あなたは、その後でuserAccountControlプロパティを取得していない場合は、常にnull値になります。でuserAccountControlを設定しようとすると、「ディレクトリのプロパティがキャッシュに見つかりません」例外が発生します。
しかし多くの狩猟後の周りの私は、Invokeを使用して設定する必要があり、別のプロパティ「UserFlags」を見つけました。あなたは、ローカルアカウントにフラグを設定するためにこれを使用することができます。私はこのコードを試してみたし、それは、Windows Server 2008上で働いています。
ホープ、このことができます。
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", "abcdefg12345@");
obUser.Invoke("Put", new object[] {"UserFlags", 0x10000});
obUser.CommitChanges();