Pergunta

Im querendo saber como obter uma lista de todos os computadores / máquinas / pc a partir do Active Directory?

(Tentando tornar esta página uma isca motor de pesquisa, irá responder-me. Se alguém tem uma melhor il resposta aceitar que)

Foi útil?

Solução

Se você tem um grande domínio, ou seu domínio tem limites configurados em como quantos itens podem ser devolvidos por pesquisa, você pode ter que usar paginação.

using System.DirectoryServices;  //add to references

public static List<string> GetComputers()
{
    List<string> ComputerNames = new List<string>();

    DirectoryEntry entry = new DirectoryEntry("LDAP://YourActiveDirectoryDomain.no");
    DirectorySearcher mySearcher = new DirectorySearcher(entry);
    mySearcher.Filter = ("(objectClass=computer)");
    mySearcher.SizeLimit = int.MaxValue;
    mySearcher.PageSize = int.MaxValue;

    foreach(SearchResult resEnt in mySearcher.FindAll())
    {
        //"CN=SGSVG007DC"
        string ComputerName = resEnt.GetDirectoryEntry().Name;
        if (ComputerName.StartsWith("CN="))
            ComputerName = ComputerName.Remove(0,"CN=".Length);
        ComputerNames.Add(ComputerName);
    }

    mySearcher.Dispose();
    entry.Dispose();

    return ComputerNames;
}

Outras dicas

O EKS sugerido é de correta , mas está realizando um pouco lento .

A razão para isso é a chamada para GetDirectoryEntry() em cada resultado. Isso cria um objeto DirectoryEntry, o que só é necessário se você precisar modificar o objeto de diretório (AD) ativo. Tudo bem se a sua consulta retornaria um único objeto, mas ao listar todos os objetos no AD, este degrada muito o desempenho.

Se você só precisa de consulta AD, é melhor usar apenas a coleção Properties do objeto resultado. Isto irá melhorar o desempenho do código várias vezes.

Isto é explicado em para a classe SearchResult :

As instâncias da classe SearchResult são muito semelhantes aos casos de classe DirectoryEntry. A diferença crucial é que o classe DirectoryEntry recupera suas informações a partir do Active Diretório Serviços de Domínio hierarquia cada vez que um novo objeto é acessada, enquanto os dados para SearchResult já está disponível em o SearchResultCollection, onde fica de voltar de uma consulta que é realizado com a classe DirectorySearcher.

Aqui é um exemplo sobre como usar a coleção Properties:

public static List<string> GetComputers()
{
    List<string> computerNames = new List<string>();

    using (DirectoryEntry entry = new DirectoryEntry("LDAP://YourActiveDirectoryDomain.no")) {
        using (DirectorySearcher mySearcher = new DirectorySearcher(entry)) {
            mySearcher.Filter = ("(objectClass=computer)");

            // No size limit, reads all objects
            mySearcher.SizeLimit = 0;

            // Read data in pages of 250 objects. Make sure this value is below the limit configured in your AD domain (if there is a limit)
            mySearcher.PageSize = 250; 

            // Let searcher know which properties are going to be used, and only load those
            mySearcher.PropertiesToLoad.Add("name");

            foreach(SearchResult resEnt in mySearcher.FindAll())
            {
                // Note: Properties can contain multiple values.
                if (resEnt.Properties["name"].Count > 0)
                {
                    string computerName = (string)resEnt.Properties["name"][0];
                    computerNames.Add(computerName);
                }
            }
        }
    }

    return computerNames;
}

Documentação para SearchResult.Properties

Note que as propriedades podem ter vários valores, por isso usamos Properties["name"].Count para verificar o número de valores.

Para melhorar ainda mais as coisas, use a coleção PropertiesToLoad para deixar o know pesquisador que propriedades que você vai usar com antecedência. Isso permite que o usuário apenas ler os dados que são realmente vai ser usado.

Note que os DirectoryEntry e DirectorySearcher objetos devem ser correctamente eliminados, a fim de libertar todos os recursos utilizados. É melhor feito com uma cláusula using.

consulta Um LDAP como:. (objectCategory=computer) deve fazer o truque

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