Pergunta

Há um par de perguntas semelhantes a este no estouro de pilha, mas não exatamente o mesmo.

Eu quero abrir ou criar, um grupo local em um computador win xp e adicionar membros a ela, domínio contas locais e bem conhecidos. Eu também quero verificar se um usuário já é um membro de modo que eu não adicionar a mesma conta duas vezes, e, presumivelmente, obter uma exceção.

Até agora eu comecei a usar o objeto DirectoryEntry com o provedor WinNT://. Isso vai ok, mas eu estou preso em como obter uma lista de membros de um grupo?

Alguém sabe como fazer isso? Ou fornecer uma solução melhor do que usar DirectoryEntry?

Foi útil?

Solução

Ok, é tomado um tempo, brincando com soluções diferentes, mas o que melhor se encaixa com a minha pergunta inicial é dado abaixo. Eu não posso obter o objeto DirectoryEntry para acessar os membros de um grupo local usando os métodos de 'padrão', a única maneira que eu poderia obtê-lo para enumerar os membros estava usando o método Invoke para chamar o método objetos membros nativa.

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);
        }
    }
}

Eu também usei uma técnica semelhante para adicionar e remover membros do grupo local.

Esperamos que isso ajude alguém assim. Keith.

Editar por Tim: adicionado versão 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

Outras dicas

Microsoft .NET Framework fornece uma biblioteca padrão para trabalhar com o Active Directory: System.DirectoryServices namespace na System.DirectoryServices.dll.

Microsoft recomenda o uso de duas classes principais do namespace System.DirectoryServices: DirectoryEntry e DirectorySearcher . Na maioria dos casos, é o suficiente para usar única classe DirectorySearcher.

UPDATE: Eu testei na minha máquina - ele funciona. Mas mal entendido já talvez eu sua pergunta.

Aqui está um exemplo de um excelente artigo :

obter uma lista de usuários que pertencem a um determinado grupo 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;
}

Você deve ser capaz de encontrar essa informação dentro do "member" atributo na DirectoryEntry que representa o grupo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top