21

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

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

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

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

4

3 に答える 3

33

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

using(DirectoryEntry groupEntry = new DirectoryEntry("WinNT://./Administrators,group"))
{
    foreach((IEnumerable) groupEntry.Invoke("Members") 内のオブジェクト メンバー)
    {
        using(DirectoryEntry memberEntry = 新しい DirectoryEntry(メンバー))
        {
            Console.WriteLine(memberEntry.Path);
        }
    }
}

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

うまくいけば、これは他の誰かにも役立ちます。キース。

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
于 2008-11-24T09:59:58.453 に答える
7

Microsoft .NET Framework provides a standard library for working with Active Directory: System.DirectoryServices namespace in the System.DirectoryServices.dll.

Microsoft recommends using two main classes from the System.DirectoryServices namespace: DirectoryEntry and DirectorySearcher. In most cases, it is enough to use DirectorySearcher class only.

UPDATE: I tested it on my machine - it works. But maybe I've misunderstood your question.

Here is an example from an excellent CodeProject article:

Get a list of users belonging to a particular AD group

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;
}
于 2008-10-31T08:43:06.537 に答える
1

この情報は、グループを表す の属性"member"内で見つけることができるはずです。DirectoryEntry

于 2008-10-31T08:41:29.210 に答える