C#方法获取Active Directory属性

本文关键字:Directory 属性 Active 获取 方法 | 更新日期: 2023-09-27 18:26:53

我想创建一个接受两个参数的方法;第一个是用户名,第二个是要返回的Active Directory属性的名称。。。该方法存在于一个单独的类(SharedMethods.cs)中,如果您在该方法中本地定义属性名称,则该方法可以很好地工作,但我无法练习如何从第二个参数传递该名称。

方法如下:

public static string GetADUserProperty(string sUser, string sProperty)
{    
        PrincipalContext Domain = new PrincipalContext(ContextType.Domain);
        UserPrincipal User = UserPrincipal.FindByIdentity(Domain, sUser);
        var Property = Enum.Parse<UserPrincipal>(sProperty, true);
        return User != null ? Property : null;
}

调用它的代码如下所示;

sDisplayName = SharedMethods.GetADUserProperty(sUsername, "DisplayName");

当前Enum.Parse正在抛出以下错误:

非泛型方法"system.enum.parse(system.type,string,bool)"不能与类型参数一起使用

我可以通过删除Enum.Parse并手动指定要检索的属性来使其工作:

public static string GetADUserProperty(string sUser, string sProperty)
{
        PrincipalContext Domain = new PrincipalContext(ContextType.Domain);
        UserPrincipal User = UserPrincipal.FindByIdentity(Domain, sUser);
        return User != null ? User.DisplayName : null;
}

我很确定我错过了一些显而易见的东西,提前感谢大家抽出时间。

C#方法获取Active Directory属性

因为UserPrincipal不是枚举,所以这很难,但正如Svein所建议的,反射也是可能的。

public static string GetAdUserProperty(string sUser, string sProperty)
{
    var domain = new PrincipalContext(ContextType.Domain);
    var user = UserPrincipal.FindByIdentity(domain, sUser);
    var property = GetPropValue(user, sProperty);
    return (string) (user != null ? property : null);
}
public static object GetPropValue(object src, string propName)
{
    return src.GetType().GetProperty(propName).GetValue(src, null);
}

如果您想根据属性名称动态获取属性的值,则需要使用反射。

请看一下这个答案:在C#中使用反射从字符串中获取属性值