通过 UserPrincipal 获取 Active Directory ExtensionAttribute

Get Active Directory ExtensionAttribute via UserPrincipal

我正在尝试获取用户 ExtensionAttribute4 的值。

这是我 class 到 UserPrincipal 的扩展:

[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("Person")]
public class UserPrincipalEx : UserPrincipal
{
    // Implement the constructor using the base class constructor. 
    public UserPrincipalEx(PrincipalContext context) : base(context)
    { }

    // Implement the constructor with initialization parameters.    
    public UserPrincipalEx(PrincipalContext context,
                         string samAccountName,
                         string password,
                         bool enabled) : base(context, samAccountName, password, enabled)
    { }

    // Create the "extensionAttribute4" property.    
    [DirectoryProperty("extensionAttribute4")]
    public string ExtensionAttribute4
    {
        get
        {
            if (ExtensionGet("extensionAttribute4").Length != 1)
                return string.Empty;

            return (string)ExtensionGet("extensionAttribute4")[0];
        }
        set { ExtensionSet("extensionAttribute4", value); }
    }

    public static new UserPrincipalEx FindByIdentity(PrincipalContext context, string identityValue)
    {
        return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityValue);
    }

    // Implement the overloaded search method FindByIdentity. 
    public static new UserPrincipalEx FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue)
    {
        return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityType, identityValue);
    }
}

下面是我调用方法的方式:

 UserPrincipalEx user = UserPrincipalEx.FindByIdentity(ctx, IdentityType.SamAccountName, "someuser");

我在调试中看到 user 确实是 Classes.UserPrincipalEx.FindByIdentity 的结果,但 extensionAttribute4 未在此处列出。完全没有。还有其他属性。

我尝试对 Manager 执行相同的操作,结果相同。错误是:

Object reference not set to an instance of an object

我是新手,所以如果我遗漏了一些明显的东西,请原谅。

documentation for ExtensionGet() 表示它 return 是“null 如果不存在具有该名称的属性”。如果该属性为空,则视为不存在,将returnnull。所以你必须检查一下。

[DirectoryProperty("extensionAttribute4")]
public string ExtensionAttribute4
{
    get
    {
        var extensionAttribute4 = ExtensionGet("extensionAttribute4");
        if (extensionAttribute4 == null || extensionAttribute4.Length != 1)
            return string.Empty;

        return (string)extensionAttribute4[0];
    }
    set { ExtensionSet("extensionAttribute4", value); }
}

请注意,您可以在不扩展 UserPrincipal 的情况下使用 GetUnderlyingObject() 并使用底层 DirectoryEntry 对象来做同样的事情:

UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "someuser");
var extensionAttribute4 = ((DirectoryEntry) user.GetUnderlyingObject())
                            .Properties["extensionAttribute4"]?.Value as string;