Geração de relatórios sobre atributos de objetos de usuário do AD para contas que nunca efetuaram logon

1

Eu escrevi um utilitário em C # para relatar detalhes da conta do AD para uso em processos de gerenciamento de acesso. Eu observei que os valores de alguns atributos não estão incluídos nos relatórios para contas que nunca fizeram logon e, portanto, o userAccountControl não foi inicializado.

Existe uma maneira de informar programaticamente esses valores para contas que nunca efetuaram login usando C #?

Por exemplo, todas as nossas contas têm o atributo employeeType e, em cada conta, employeeType é definido como "Contractor" ou "Permanent", visível no AD Explorer na guia "Attribute Editor" do perfil de conta. Se a conta tiver sido registrada nesse valor, ela será incluída nos meus relatórios, mas se não tiver, então, employeeType não aparecerá nos resultados dessa conta.

Aqui está uma amostra do meu código:

public static List<ADObjects> getADUserObjects(string domainShortNameStr)
{
    List<ADObjects> adUserObjectsList = new List<ADObjects>();
    DirectoryEntry searchRoot = ADUtils.getSingleDomainDirectoryEntry(domainShortNameStr);
    string searchFilter = "(sAMAccountType=805306368)";
    string[] adAttributeNamesStrArr = new string[] {
        "distinguishedName",
        "sAMAccountName",
        "userAccountControl",
        "employeeType"
    };
    DirectorySearcher search = new DirectorySearcher(searchRoot, searchFilter, adAttributeNamesStrArr);
    search.PageSize = 1000;

    SearchResult result;
    SearchResultCollection resultCol = search.FindAll();
    if (resultCol != null)
    {
        for (int counter = 0; counter < resultCol.Count; counter++)
        {
            result = resultCol[counter];
            ADObjects tempAdUserObject = new ADObjects();
            tempAdUserObject.DistinguishedName = (result.Properties.Contains("distinguishedName")) ? ((String)result.Properties["distinguishedName"][0]) : null;
            tempAdUserObject.SAMAccountName = (result.Properties.Contains("samaccountname")) ? (String)result.Properties["samaccountname"][0] : null;
            tempAdUserObject.UserAccountControl = (result.Properties.Contains("userAccountControl")) ? result.Properties["userAccountControl"][0].ToString() : null;
            tempAdUserObject.EmployeeType = (result.Properties.Contains("employeeType")) ? (String)result.Properties["employeeType"][0] : null;
            adUserObjectsList.Add(tempAdUserObject);
        }
    }
    ...
    return adUserObjectsList;
}

Eu tentei executar relatórios semelhantes usando CSVDE, LDIFDE, DSQUERY, Powershell e VBScript, e a mesma coisa acontece: o employeeType não é retornado para contas que nunca efetuaram login.

Todos os relatórios foram executados em minha própria conta de domínio e em uma conta de serviço somente leitura criada para esse fim, produzindo os mesmos resultados.

    
por LupusAlbus 18.05.2017 / 13:37

1 resposta

0

Se o atributo não estiver definido nas entradas LDAP até o primeiro login, não haverá uma consulta LDAP que o retorne. É o modo como o protocolo LDAP funciona:

Se o atributo não estiver definido na entrada, mesmo que seja solicitado, não estará vazio no resultado, mas não haverá atributo algum.

Você precisará testar em sua entrada que, se o atributo de entrada "EmployeeType" não estiver presente, defina um valor padrão que você deseja que apareça no relatório

    
por 18.05.2017 / 14:08