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