ActiveDirectory でもローカルアカウントでもおおむね同様に記述できる。
using System;
using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;
using System.DirectoryServices.AccountManagement;
namespace AddDelUser
{
class Program
{
static void Main(string[] args)
{
string mode = args[0];
string name = args[1];
Domain domain = Domain.GetCurrentDomain();
PrincipalContext context = new PrincipalContext(ContextType.Domain);
if (mode.Equals("add"))
{
UserPrincipal principal = new UserPrincipal(context);
principal.Name = name;
principal.UserPrincipalName = name + "@" + domain.Name;
principal.SamAccountName = name;
principal.Enabled = true;
principal.SetPassword("hogehoge1*");
principal.PasswordNeverExpires = true;
principal.Save();
}
else
{
UserPrincipal principal = UserPrincipal.FindByIdentity(context, IdentityType.Name, name);
principal.Delete();
}
}
}
}
UserPrincipalName はユーザープリンシパル名(umezawa@umead.local 形式のアカウント名)、SamAccountName はSAMアカウント名(NT形式のアカウント名)、Name は「Active Directory ユーザーとコンピューター」で「名前」カラムに出てくる名前である。3つとも異なる名前を付けることができる(普通はそんなことしないと思うが)。GUI 操作でアカウントを追加する場合はユーザープリンシパル名を空にすることはできないが、プログラム的に追加する場合はユーザープリンシパル名は空にできるし、@ 以降を持たない名前も付けられる。SAMアカウント名は空にはできず、値を設定しないとランダムな値が使われ、null や空文字列を設定することはできない。
これだと現在のドメインのデフォルトの場所(「Active Directory ユーザーとコンピューター」でのドメインの下の “Users” フォルダ)に作られる。他のドメインに作りたい場合は new PrincipalContext(ContextType.Domain, "umesub.umead.local"); などとする。デフォルト以外の場所(DN)に作りたい場合は new PrincipalContext(ContextType.Domain, "umead.local", "OU=OtherGroup,DC=umead,DC=local"); などとする。
ローカルアカウントを操作したい場合は ContextType.Machine を使う。この場合、UserPrincipal クラスのいくつかのプロパティは使えない(UserPrincipalName とか)。ドメインの場合と同様に他のマシンのローカルアカウントを操作できるとドキュメントには書いてあるが、試してない。なお、ドメインコントローラ上で ContextType.Machine を使ってもエラーにはならずドメインアカウントを操作することになるが、やっぱり UserPrincipalName とかは使えない。
no comment untill now