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.