質問

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

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

これまでのところ、 WinNT:// プロバイダーでDirectoryEntryオブジェクトを使用し始めました。これは大丈夫ですが、グループのメンバーのリストを取得する方法に固執していますか?

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

役に立ちましたか?

解決

OK DirectoryEntryオブジェクトを取得して「標準」メソッドを使用してローカルグループのメンバーにアクセスすることはできません。メンバーを列挙するために取得できる唯一の方法は、Invokeメソッドを使用してネイティブオブジェクトのMembersメソッドを呼び出すことです。 p>

using(DirectoryEntry groupEntry = new DirectoryEntry("WinNT://./Administrators,group"))
{
    foreach(object member in (IEnumerable) groupEntry.Invoke("Members"))
    {
        using(DirectoryEntry memberEntry = new DirectoryEntry(member))
        {
            Console.WriteLine(memberEntry.Path);
        }
    }
}

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

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

編集ティム: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

他のヒント

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

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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top