web-dev-qa-db-ja.com

WinNTグループのメンバーのリストを取得する

スタックオーバーフローについては、これに似た質問がいくつかありますが、まったく同じではありません。

Win XPコンピュータでローカルグループを開くか作成して、そのグループ、ドメイン、ローカル、およびよく知られたアカウントにメンバーを追加したいと思います。また、同じアカウントを2回追加しないように、ユーザーがすでにメンバーになっているかどうかを確認したいのですが、おそらく例外が発生します。

これまで、WinNT://プロバイダーでDirectoryEntryオブジェクトの使用を開始しました。これは問題ありませんが、グループのメンバーのリストを取得する方法に固執していますか?

誰もがこれを行う方法を知っていますか?または、DirectoryEntryを使用するよりも優れたソリューションを提供しますか?

19
Kepboy

さて、さまざまな解決策をいじって、しばらく時間がかかりましたが、私の元の質問に最もよく合うものを以下に示します。 'standard'メソッドを使用してDirectoryEntryオブジェクトにローカルグループのメンバーにアクセスさせることができません。メンバーを列挙する唯一の方法は、Invokeメソッドを使用してネイティブオブジェクトのMembersメソッドを呼び出すことでした。

 using(DirectoryEntry groupEntry = new DirectoryEntry( "WinNT://./ Administrators、group"))
 {
 foreach(object member in(IEnumerable)groupEntry.Invoke( "メンバー "))
 {
 using(DirectoryEntry memberEntry = new DirectoryEntry(member))
 {
 Console.WriteLine(memberEntry.Path); 
} 
} 
} 

同様の手法を使用して、ローカルグループのメンバーを追加および削除しました。

うまくいけば、これは他の誰かにも役立つでしょう。キース。

[〜#〜] edit [〜#〜] by Tim:VB.Netバージョンを追加

Public Function MembersOfGroup(ByVal GroupName As String) As List(Of DirectoryEntry)
    Dim members As New List(Of DirectoryEntry)
    Try
        Using search As New DirectoryEntry("WinNT://./" & GroupName & ",group")
            For Each member As Object In DirectCast(search.Invoke("Members"), IEnumerable)
                Dim memberEntry As New DirectoryEntry(member)
                members.Add(memberEntry)
            Next
        End Using
    Catch ex As Exception
        MessageBox.Show(ex.ToString)
    End Try
    Return members
End Function
30
Kepboy

Microsoft .NET Frameworkは、Active Directoryを操作するための標準ライブラリを提供します:System.DirectoryServices名前空間System.DirectoryServices.dll 。

Microsoftは、System.DirectoryServices名前空間の2つのメインクラス(DirectoryEntryおよびDirectorySearcherを使用することをお勧めします。 -)。ほとんどの場合、DirectorySearcherクラスのみを使用するだけで十分です。

更新:自分のマシンでテストしました-動作します。しかし、多分私はあなたの質問を誤解しました。

これは優れた CodeProjectの記事 からの例です:

特定のADグループに属するユーザーのリストを取得します

using System.DirectoryServices;

ArrayList GetADGroupUsers(string groupName)
{    
   SearchResult result;
   DirectorySearcher search = new DirectorySearcher();
   search.Filter = String.Format("(cn={0})", groupName);
   search.PropertiesToLoad.Add("member");
   result = search.FindOne();

   ArrayList userNames = new ArrayList();
   if (result != null)
   {
       for (int counter = 0; counter < 
          result.Properties["member"].Count; counter++)
       {
           string user = (string)result.Properties["member"][counter];
               userNames.Add(user);
       }
   }
   return userNames;
}
7
splattne

この情報は "member" attribute グループを表すDirectoryEntry上。

1
Tim Robinson