Я написал утилиту на C # для отчета о деталях учетной записи AD для использования в процессах управления доступом. Я заметил, что значения некоторых атрибутов не включаются в отчеты для учетных записей, которые никогда не входили в систему, и поэтому userAccountControl не инициализирован.
Есть ли способ программно сообщить эти значения для учетных записей, которые никогда не входили в систему, с помощью C #?
Например, все наши учетные записи имеют атрибут employeeType, и для каждой учетной записи employeeType установлено значение " Подрядчик »или« Постоянный », который отображается в AD Explorer на вкладке« Редактор атрибутов »профиля учетной записи. Если для учетной записи был выполнен вход, это значение включается в мои отчеты, но если нет, то employeeType не отображается в результатах для этой учетной записи.
Вот образец моего кода:
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;
}
Я пробовал создание аналогичных отчетов с использованием CSVDE, LDIFDE, DSQUERY, Powershell и VBScript, и происходит то же самое: employeeType не возвращается для учетных записей, которые никогда не входили в систему.
Все отчеты были запущены как под моей собственной учетной записью домена, так и под учетной записью службы только для чтения, созданной для этой цели, с такими же результатами.
Если атрибут не установлен в записях LDAP до первого входа в систему, тогда нет запроса LDAP, который вернет его. Так работает протокол LDAP:
Если атрибут не установлен в записи, даже если он запрошен, он не будет пустым в результате, но не будет атрибута вообще.
Вам нужно будет проверить при обработке записи, что, если атрибут записи «EmployeeType» отсутствует, установите значение по умолчанию, которое вы хотите отобразить в отчете