System.DirectoryServices を使用して、ユーザのプライマリグループしてみます。
確認環境
- 動作環境:Windows 2003 Server (AD環境)
- 開発環境:Visual Studio 2008 Professional
- .NET 3.5
1. プライマリグループを取得する
ユーザのディレクトリオブジェクトにバインドすると、プロパティprimaryGroupIdにプライマリグループのSIDの一部(相対識別ID)が格納されています。プライマリグループのSIDを取得するには、属性objectSidのバイト値の最後4バイトをprimaryGroup属性値で置き換えることで取得します。
crmuser03というユーザのプライマリグループを取得するサンプルを掲載します。
public static void ShowPrimaryGroup() { using (DirectoryEntry user = GetEntry("CN=crmuser03,OU=CrmUsers,DC=crm1,DC=local")) { byte[] primaryGroup = CreatePrimaryGroupSID(user); string path = string.Format("<SID={0}>", ToSidString(primaryGroup)); using (DirectoryEntry group = GetEntry(path)) { Console.WriteLine(group.Properties["distinguishedName"].Value); } } } /// <summary> /// userのprimaryGroupId属性値はプライマリグループの相対識別値のみ /// 含まれているので、userのobjectSidのバイト値の最後の4バイトをprimaryGroupId /// のバイト値で置き換えることで取得する。 /// </summary> /// <param name="user"></param> /// <returns></returns> public static byte[] CreatePrimaryGroupSID(DirectoryEntry user) { byte[] sid = user.Properties["objectSid"][0] as byte[]; int primaryGroup = (int)user.Properties["primaryGroupId"][0]; byte[] primaryGroupBytes = BitConverter.GetBytes(primaryGroup); for (int i = 0; i < primaryGroupBytes.Length; ++i) { sid.SetValue(primaryGroupBytes[i], sid.Length - (primaryGroupBytes.Length - i)); } return sid; } public static DirectoryEntry GetEntry(string path) { return new DirectoryEntry("LDAP://" + path, null, null, AuthenticationTypes.Secure); } private static string ToSidString(byte[] bytes) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < bytes.Length; ++i) { builder.AppendFormat(bytes[i].ToString("X2")); } return builder.ToString(); }
実行するとAD環境では通常Domain Users がプライマリグループとして取得されます。
説明は以上です。誤りなどがあればご連絡ください。
さんのコメント: さんのコメント: