Я написал служебную программу на C # для отчета о деталях учетной записи AD для использования в процессах управления доступом. Я заметил, что значения некоторых атрибутов не включаются в отчеты для учетных записей, которые никогда не входили в систему, и поэтому userAccountControl не инициализирован.
Есть ли способ программно сообщить эти значения для учетных записей, которые никогда не входили в систему, с помощью C #?
Например, все наши учетные записи имеют атрибут employeeType, и для каждой учетной записи employeeType установлено значение «Contractor» или «Permanent», которое отображается в AD Explorer на вкладке «Attribute Editor» профиля учетной записи. Если для учетной записи был выполнен вход, это значение включается в мои отчеты, но если нет, то 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» отсутствует, то установите значение по умолчанию, которое вы хотите отображать в отчете.