DirectoryAccess クラスに追加したグループ関連のメソッドのC#のコードです。
前回追加したコードはこちら。
//指定した ADSI オブジェクトの所属パスを取得します。
public static string GetBelongPath(IADs native) //オーバーロードを追加
{
if (entry == null)
{
throw new ArgumentNullException("native", "native が null です。");
}
return GetBelongPath(native.ADsPath);
}
//グループを取得を取得します。GroupTokens プロパティが設定されます。
public static IList GetGroups() where T : DirectoryObject, IGroup
{
var groups = new List();
using (var root = GetRootEntry()) //ルートのDirectoryEntryを取得
{
if (CanConnectDomain) //ドメインに接続できる時
{
var filter = String.Format("(objectCategory={0})", CategoryType.Group);
GroupTokens.Clear();
using (var searcher = new DirectorySearcher(root, filter))
{
using (var results = searcher.FindAll())
{
foreach (SearchResult res in results)
{
var entry = res.GetDirectoryEntry();
groups.Add((T)CreateInstance(entry));
AddGroupToken(entry); //PrimaryGroupTokenを追加
}
}
}
else //ドメインに接続できない時 <-- こっちはローカル
{
root.Children.SchemaFilter.Add(CategoryType.Group.ToString());
foreach (DirectoryEntry entry in root.Children)
{
groups.Add((T)CreateInstance(entry));
}
}
}
return groups;
}
//指定した PrimaryGroupToken を持つドメイングループをプライマリグループとしているメンバの DirectoryEntry のコレクションを取得します。
public static IList<DirectoryEntry> GetPrimaryGroupMemberEntries(int primaryGroupToken)
{
if (CanConnectDomain == false) //ドメインに接続できない時
{
return new List<DirectoryEntry>();
}
var entries = new List<DirectoryEntry>();
using (var root = GetRootEntry()) //ルートのDirectoryEntryを取得
{
var filter = String.Format("(&(|(objectCategory={0})(objectCategory={1}))(primaryGroupID={2}))",
CategoryType.User, CategoryType.Computer, primaryGroupToken);
using (var searcher = new DirectorySearcher(root, filter))
{
using (var results = searcher.FindAll())
{
foreach (SearchResult res in results)
{
entries.Add(res.GetDirectoryEntry());
}
}
}
}
return entries;
}
//指定した LDAP パスの名前(オブジェクト名)を取得します。
public static string PathToCn(string ldapPath)
{
if (ldapPath == null)
{
throw new ArgumentNullException("ldapPath", "ldapPath が null です。");
}
var spos = ldapPath.IndexOf('=') + 1;
if (spos == 0)
{
return ldapPath;
}
var epos = ldapPath.IndexOf(',');
if (spos > 0)
{
return ldapPath.Substring(spos, epos - spos);
}
else
{
return ldapPath.Substring(spos);
}
}
//PrimaryGroupToken を追加します。
private static void AddGroupToken(DirectoryEntry entry)
{
entry.Invoke("GetInfoEx", new object[] { "primaryGroupToken" }, 0);
var token = Convert.ToInt32(entry.Properties["primaryGroupToken"].Value);
GroupTokens.Add(token, entry.Properties["cn"].Value.ToString());
}
DirectoryObject のインスタンスを作成する CreateInstance メソッドにグループ部分のコード(太字の部分)を追加しました。
private static DirectoryObject CreateInstance(DirectoryEntry entry)
{
CategoryType category;
if (Enum.TryParse<CategoryType>(entry.SchemaClassName, true, out category) == false)
{
throw new ArgumentException("entry の種類が CategoryType に該当しません。", "entry");
}
switch (category)
{
case CategoryType.User:
if (CanConnectDomain) //ドメインに接続できる時
{
return new DomainUser(entry);
}
else //ドメインに接続できない時
{
return new LocalUser(entry);
}
case CategoryType.Group:
if (CanConnectDomain) //ドメインに接続できる時
{
return new DomainGroup(entry);
}
else //ドメインに接続できない時
{
return new LocalGroup(entry);
}
default:
throw new NotImplementedException();
}
}