DirectoryAccess クラスに追加したメソッドの1つ、ユーザの所属するグループを取得する GetBelongGroups メソッドの実装ですが、ユーザの所属するグループは ADSI の IADsUser.Groups メソッドで取得してます。
このメソッドの戻り値の型は IADsMembers で、IEnumerable を継承してるので For Each で回せます。
要素の型は基本インターフェイスである IADs を指定してます。
ドメインユーザの場合はこれでプライマリグループ(通常は Domain Users グループ)以外の所属するグループを取得できるんですが、プライマリグループが取得できないんです。
なので次のようにして、プライマリグループを取得してます。
1. グループの primaryGroupToken/グループ名 の組を GroupTokens プロパティ(キーは primaryGroupToken)に保持
2. ドメインユーザは primaryGroupID 属性を持っている(DomainUser.PrimaryGroupId プロパティに保持)
3. ドメインユーザの primaryGroupID = グループの primaryGroupToken なら、そのグループがユーザのプライマリグループなので、primaryGroupID をキーに GroupTokens プロパティからグループ名を取得
但し、グループの DirectoryEntry.Properties(PropertyCollection)内には primaryGroupToken プロパティがないので、LoadGroupTokens メソッド内で DirectoryEntry.Invoke メソッドを使ってプロパティを取得してます。
entry.Invoke("GetInfoEx", New Object() {"primaryGroupToken"}, 0)
これは IADs.GetInfoEx(New Object() {"primaryGroupToken"}, 0) を呼び出したのと同じです。
つまり、次のように書くこともできます。
DirectCast(entry.NativeObject, IADs).GetInfoEx(New Object() {"primaryGroupToken"}, 0)
第1引数(vProperties パラメータ)は Object 型なんですが、取得したい属性の名前を Object 型の配列にして渡す必要があります。
第2引数(lnReserved パラメータ)は 0 を指定してますが理由は判らないのでお約束ということでお願いしますw