System.DirectoryServices (SDS) 名前空間のクラスを使用して、ユーザとグループを作成するサンプルを掲載します。
確認環境
- 動作環境:Windows 2003 Active Directory環境
- 開発環境:Visual Studio 2008 Professional
- .NET 2.0 以上
1. グループを作成する
グループを作成するサンプルを掲載します。グループの種類には、セキュリティグループ、配布グループという種類とそれぞれに対して、ドメインローカル、グローバルグループ、ユニバーサルグループの区別があります。グループは列挙形 GroupType で定義しています。
/// <summary> /// ActiveDirectoryグループタイプ /// </summary> [Flags] public enum GroupType : uint { ADS_GROUP_TYPE_BUILTIN_LOCAL_GROUP = 0x00000001, ADS_GROUP_TYPE_GLOBAL_GROUP = 0x00000002, ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP = 0x00000004, ADS_GROUP_TYPE_UNIVERSAL_GROUP = 0x00000008, ADS_GROUP_TYPE_SECURITY_ENABLED = 0x80000000, // ドメインローカル配布グループ LocalDistribution = ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP, // ドメインローカルセキュリティグループ LocalSecurity = ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP | ADS_GROUP_TYPE_SECURITY_ENABLED, // グローバル配布グループ GlobalDistribution = ADS_GROUP_TYPE_GLOBAL_GROUP, // グローバルセキュリティグループ GlobalSecurity = ADS_GROUP_TYPE_GLOBAL_GROUP | ADS_GROUP_TYPE_SECURITY_ENABLED, // ユニバーサル配布グループ UniversalDIstribution = ADS_GROUP_TYPE_UNIVERSAL_GROUP, // ユニバーサルセキュリティグループ UniversalSecurity = ADS_GROUP_TYPE_UNIVERSAL_GROUP | ADS_GROUP_TYPE_SECURITY_ENABLED }
以降が引数で指定されたグループ名を作成するサンプルです。メソッドのみで定義しています。
/// <summary> /// 引数で指定された名前のセキュリティグループを作成する /// </summary> /// <param name="newGroup"></param> public static void CreateGroup(string newGroup) { // 作成するグループの親ディレクトリオブジェクト using (DirectoryEntry parent = GetEntry("CN=Users,DC=crm1,DC=local")) { object obj = parent.NativeObject; uint groupType = (uint)GroupType.LocalSecurity; DirectoryEntry group = parent.Children.Add("CN=" + newGroup, "group"); group.Properties["sAMAccountName"].Value = newGroup; group.Properties["groupType"].Value = (int) groupType; group.CommitChanges(); } } public static DirectoryEntry GetEntry(string path) { return new DirectoryEntry("LDAP://" + path, null, null, AuthenticationTypes.Secure); }
2 グループにメンバーを追加する、削除する方法1
ADSI で定義されているインタフェースIADsGroup の Add , Remove メソッドを使用してメンバーを追加、削除するサンプルを掲載します。追加しようとしているメンバーがグループに含まれているかは IsMember メソッドで確認するようにしています。
/// <summary> /// ユーザがグループに所属しているか調べ、 /// 所属している場合は削除し、所属していない場合は追加する /// 削除、追加メソッドにIADsGroup.Add, IADsGroup.Remove メソッドを使用する /// </summary> public static void ManageGroup() { using (DirectoryEntry group = GetEntry("CN=testGroup,CN=Users,DC=crm1,DC=local")) { string crmuserAdsPath = "LDAP://CN=crmuser03,OU=CrmUsers,DC=crm1,DC=local"; if (!IsMember(group, crmuserAdsPath)) { Console.WriteLine("add member"); AddMember(group, crmuserAdsPath); } else { Console.WriteLine("remove member"); RemoveMember(group, crmuserAdsPath); } } } public static bool IsMember(DirectoryEntry entry, string adsPath) { return (bool)entry.Invoke("IsMember", adsPath); } public static void AddMember(DirectoryEntry entry, string adsPath) { entry.Invoke("Add", adsPath); } public static void RemoveMember(DirectoryEntry entry, string adsPath) { entry.Invoke("Remove", adsPath); }
サンプルでは、crm1.local ドメインのオブジェクトユニット CrmUsers に含まれるユーザ crmuser03 をUsers コンテナの testGroup グループに追加しています。
3 グループにメンバーを追加する、削除する方法2
group のスキーマに含まれる member 属性値にメンバーを追加、削除する方法で、グループにメンバーを追加、削除する方法を次のサンプルで掲載します。
public static void ManageGroup2() { using (DirectoryEntry group = GetEntry("CN=testGroup,CN=Users,DC=crm1,DC=local")) { try { string crmuserPath = "CN=crmuser03,OU=CrmUsers,DC=crm1,DC=local"; // メンバーに追加する場合 AddMember2(group, crmuserPath); // メンバーを削除する場合 //RemoveMember2(group, crmuserPath); group.CommitChanges(); } catch (COMException ex) { Console.WriteLine(ex.ErrorCode); } } } public static void AddMember2(DirectoryEntry entry, string memberPath) { entry.Properties["member"].Add(memberPath); } public static void RemoveMember2(DirectoryEntry entry, string memberPath) { entry.Properties["member"].Remove(memberPath); }
サンプルでは、IADsGroupのメソッドを使用するサンプルと同様に、crm1.local ドメインのオブジェクトユニット CrmUsers に含まれるユーザ crmuser03 をUsers コンテナの testGroup グループに追加しています。
説明は以上です。誤り等がありましたらご連絡下さい。
さんのコメント: さんのコメント: