我用 C# 编写了一个实用程序来报告 AD 帐户详细信息,以供访问管理流程使用。我注意到,对于从未登录过的帐户,某些属性的值未包含在报告中,因此 userAccountControl 尚未初始化。
有没有办法使用 C# 以编程方式报告从未登录过的帐户的这些值?
例如,我们所有的帐户都具有 employeeType 属性,并且每个帐户的 employeeType 都设置为“Contractor”或“Permanent”值,该值在 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。
所有报告均在我自己的域帐户和为此目的创建的只读服务帐户下运行,产生相同的结果。
答案1
如果在第一次登录之前未在 LDAP 条目中设置该属性,则没有 LDAP 查询会返回该属性。这是 LDAP 协议的工作方式:
如果条目中没有设置该属性,那么即使请求了,结果也不会为空,但是根本不会有该属性。
您必须在输入处理中进行测试,如果输入属性“EmployeeType”不存在,则设置您希望在报告中显示的默认值