0

我的组织使用 AD 和 LDS 的组合。AD 同步到 LDS 并在 extensionAttribute 字段中存储一些信息 [主要是 10、11 和 12]。

我可以从 LDS 中提取标准信息,即 Title、Surname、Initials 但无法获取 exntensionAttributes。我已使用示例扩展 UserPrincipal 但仍然无法查看属性值。

[DirectoryRdnPrefix("CN")]
    [DirectoryObjectClass("user")]
    public class UserPrincipalEx : UserPrincipal
    {
        public UserPrincipalEx(PrincipalContext context)
            : base(context)
        { }

        public UserPrincipalEx(PrincipalContext context, string samAccountName, string password, bool enabled)
            :base(context, samAccountName,password,enabled)
        { }

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

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

        [DirectoryProperty("extensionAttribute10")]
        public string Ext10
        {
            get
            {
                if (ExtensionGet("extensionAttribute10").Length != 1)
                    return null;
                return (string)ExtensionGet("extensionAttribute10")[0];
            }
        }
    }

然后我有:

PrincipalContext ctx = new PrincipalContext(ContextType.ApplicationDirectory, "LDSServerHere:389", "OU HERE", "Acccount Name Here", "Password HEre");

        UserPrincipalEx u = UserPrincipalEx.FindByIdentity(ctx, IdentityType.SamAccountName, login);
        string prop = string.Empty;
        try
        {
            prop = u.Ext10;
        }
        catch (Exception ex)
        {
            prop = ex.ToString();
        }

        return prop;

不断收到 NULLReferenceException:对象引用未设置为对象的实例

我在这里做一些愚蠢的事情吗?

4

1 回答 1

1

打电话是FindByIdentityWithType不行的。查看文档Principal,它是从(not )继承的UserPrincipal,它说它“不打算直接从您的代码中调用”。它可能只是不理解您的派生类,因此它什么也不返回,因为它找到的任何内容都与您的类不匹配。

但是还有另一种方法:使用DirectoryEntry.

PrincipalContext ctx = new PrincipalContext(ContextType.ApplicationDirectory, "LDSServerHere:389", "OU HERE", "Acccount Name Here", "Password HEre");

UserPrincipal u = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, login);
string prop = string.Empty;

try
{
    var de = (DirectoryEntry) u.GetUnderlyingObject();
    if (de.Properties.Contains("extensionAttribute10")) {
        prop = de.Properties["extensionAttribute10"].Value;
    }
}
catch (Exception ex)
{
    prop = ex.ToString();
}

return prop;

注意属性的空检查。如果该属性为空,则它根本不存在于Properties集合中。为了安全起见,您可能可以在其中添加一些额外的空检查。

UserPrincipal和命名空间中的其他类无论如何都AccountManagement只是DirectoryEntry在后台使用。他们只是不公开所有可用的属性。所以有时你必须DirectoryEntry直接使用。

实际上,我发现只使用DirectoryEntry而不使用AccountManagement命名空间会更快、更有效,尽管有时使用起来会更复杂一些。

于 2018-05-10T12:24:35.463 回答