2009-05-06 28 views
4

ユーザが所属するグループのcommonNameだけが必要です。DirectoryEntry memberOfプロパティはフルパスを返します

DirectoryEntry user = new DirectoryEntry("LDAP://cn=myuser...."); 
foreach(string path in user.Properties["memberOf"]) 
    Console.WriteLine(path); 

その後のmemberOfプロパティが文字列、グループの完全なパスのセットを含みます。それは理にかなっていますが、私が望むものではありません。

私はかなり一般的な名前を取得するためにそれらのパスのそれぞれについてDirectoryEntryをshoudn'tしていないと確信していますが、単にパスからCNを解析するのがベストアイデアですか? (それはむしろむちゃくちゃしているようです)

ユーザーが所属するグループのSearchResultsを取得するには、より良い方法が必要です。

これは.NET 2なので、私はLINQ to LINQを実行できませんし、ActiveDirectoryのDirectoryServicesの新しいビットにアクセスすることもできません。

答えて

2

CNは必ずしもグループの名前と同じではありません。 DNをエスケープするので、DNから解析することは推奨できません。オブジェクトのディレクトリを照会する必要があります。

単一のオブジェクトを取得するには、検索ベースを識別名に、検索スコープを「ベース」に設定してクエリを発行します。

同じLDAPクエリを複数回発行することを避けるために、クエリ結果をキャッシュすることが推奨されます(行内に複数のオブジェクトのmemberOfを取得する場合)。

サンプルコード(right off the MSDN、わずかに変更された):

"関連" セクションで、この古いスレッドを発見
string dn = "LDAP://CN=Group Name,ON=Groups,DC=fabrikam,DC=com"; 

// Bind to a specific group. 
DirectoryEntry entry = new DirectoryEntry(dn); 

// Create a DirectorySearcher object. 
DirectorySearcher mySearcher = new DirectorySearcher(entry); 
mySearcher.SearchScope = SearchScope.Base; 
mySearcher.PropertiesToLoad.Add("displayName"); 

// Use the FindOne method to find the group object. 
SearchResult resEnt = mySearcher.FindOne(); 
0

残念ながら、.NET 2.0ではあなたの記述よりも良い方法はありません。 memberOf属性には、ユーザーが属しているすべてのグループの完全な識別名が含まれているため、各識別名を解析することをお勧めします。

0

この質問に2つの他の提案があります。
それぞれは、memberOf属性のオブジェクトを1回の検索でSearchResultとして直接取得できます。

すべてのコードはC#にあります。

はスコープクエリ(ASQ)の属性:

DirectoryEntry userEntry = new DirectoryEntry("LDAP://<server>/<user DN>", "user", "pwd"); 

DirectorySearcher searcher = new DirectorySearcher(userEntry); 
searcher.SearchScope = SearchScope.Base; 
searcher.AttributeScopeQuery = "memberOf"; 
searcher.PropertiesToLoad.Clear(); 
// just load any attributes you want, not limited to cn 
searcher.PropertiesToLoad.Add("cn"); 

foreach (SearchResult result in searcher.FindAll()) 
{ 
    Console.WriteLine(result.Path); 
} 

制限事項:

  • プライマリグループのメンバシップを処理しないでください(ドメイン/森を忘れてしまった)2003の機能レベルが必要です
  • ASQはドメイン全体で動作しません(少なくともシステム。プライマリグループのメンバシップ
  • を処理しないでください

    • DirectoryEntry rootEntry = new DirectoryEntry("GC://<GC server>", "user", "pwd"); 
      
      DirectorySearcher searcher = new DirectorySearcher(rootEntry); 
      searcher.SearchScope = SearchScope.Subtree; 
      searcher.Filter = "(member:1.2.840.113556.1.4.1941:=<user DN>)"; 
      searcher.PropertiesToLoad.Clear(); 
      // just load any attributes you want, not limited to cn 
      searcher.PropertiesToLoad.Add("cn"); 
      
      foreach (SearchResult result in searcher.FindAll()) 
      { 
          Console.WriteLine(result.Path); 
      } 
      

      制限事項:DirectoryServicesは、それが別のドメイン内の任意のオブジェクト)

    LDAP_MATCHING_RULE_IN_CHAINマッチングルールの例外がスローされますすることはできません

  • 2008 R2の機能レベルが必要(ドメイン/フォレストを忘れた)
  • memberOfの1つのレベルだけでなく、ネストされたグループメンバーシップを取得します
関連する問題