我怎样才能知道C#中是否存在动态属性

时间:2018-04-10 21:00:39

标签: c# active-directory

我正在使用下面的代码迭代一些Active Directory PrincipalSearcher Principal结果。在我的foreach循环中,我将结果属性分配给我的_user对象,我可以在调试中中断并查看result.EmailAddress值。当我尝试将result.EmailAddress分配给_user.EmailAdress时,代码甚至不会编译。我猜测EmailAddress是结果的动态属性。有没有办法检查此属性,以便我可以将用户AD电子邮件地址添加到我的_user对象?

 private static void GetAllActiveDirectoryUsers()
    {
        PrincipalContext context = new PrincipalContext(
        ContextType.Domain, Environment.UserDomainName);

        UserPrincipal user = new UserPrincipal(context);


        // create a principal searcher for running a search operation
        PrincipalSearcher pS = new PrincipalSearcher(user);

        // run the query
        PrincipalSearchResult<Principal> results = pS.FindAll();

        foreach (Principal result in results)
        {

            Console.WriteLine(result.DisplayName);
            Console.ReadKey();

            User _user = new User();

            _user.Description = result.Description;
            _user.DisplayName = result.DisplayName;
            _user.DistinguishedName = result.DistinguishedName;
            _user.Guid = result.Guid ?? null;
            _user.Name = result.Name;
            _user.Sid = result.Sid?.ToString();

            Users.Add(_user);
        }

    }

2 个答案:

答案 0 :(得分:1)

您需要从DirectoryEntry获取Principal对象并查询其属性。

这样的事情 - 假设电子邮件存储在'mail'属性中。

 var directoryEntry = result.GetUnderlyingObject() as DirectoryEntry;
 if (directoryEntry != null && directoryEntry.Properties.Contains("mail"))
 {
    _user.EmailAddress = directoryEntry.Properties[property].Value.ToString();
 }

这是使用上述内容的扩展方法。它只是为您要搜索的属性采用字符串。

public static string GetPropertyValue(this Principal principal, string property)
{
    var directoryEntry = principal.GetUnderlyingObject() as DirectoryEntry;
    if (directoryEntry != null && directoryEntry.Properties.Contains(property))
    {
        return directoryEntry.Properties[property].Value.ToString();
    }

    return null;
}

答案 1 :(得分:1)

它不是动态属性。 EmailAddressUserPrincipal类的属性,继承自Principal。您的result实际上是UserPrincipal类型,这就是您在调试时看到该属性的原因,但是您要将其作为类型Principal访问,而该类型没有被调用的属性EmailAddress,因此您的代码无法使用它。

如果您想要访问EmailAddress媒体资源,则需要将result投射到UserPrincipal。既然您确定所有结果都是用户对象,那么您可以在foreach中执行此操作:

foreach (UserPrincipal result in results)