如何清除扩展属性

How to Clear Extension Attributes

我有一个应用程序可用于设置或清除某些 AD 属性 extensionAttribute2

一切似乎都工作正常,但是在更新我的 ode 以在清除属性时使用 Property.Clear() 方法后,我 运行 遇到了一些问题。

在调用 ActiveDirectory.ClearProperty("user.name", "extensionAttribute2") 后,属性 被清除,但是当我尝试用 ActiveDirectory.GetProperty("user.name", "extensionAttribute2", "123456789") 设置它时,我得到一个错误:

Object reference not set to an instance of an object.

而且我可以看到 extensionAttribute2 尚未加载到用户的 DirectoryEntry 对象中。

如果我将 ClearProperty 中的代码更改为调用 user.Properties[property].Value = " "; 那么它似乎工作正常(即再次查询用户时 属性 仍然存在),但我觉得使用 Clear()

这是 AD 的正常行为吗?我的印象是调用 Clear 只是清除值而不是实际破坏 属性,或者这是 extensionAttribute 的一个特性?我想使用 Clear,因为它看起来更清晰 - 这看起来合理还是坚持使用 user.Properties[property].Value = " "; 真的是最好的选择?

在此先感谢您的帮助。

private static DirectoryEntry GetUser(string friendlyName)
{
    var userEntry = new DirectoryEntry("LDAP://dc=DOMAIN,dc=co,dc=uk");
    var mySearcher = new DirectorySearcher(userEntry)
    { Filter = $"(cn={friendlyName})" };

    mySearcher.PropertiesToLoad.Add("extensionAttribute2");
    mySearcher.PropertiesToLoad.Add("distinguishedName");

    var userSearchResult = mySearcher.FindOne();
    var distinguishedName = userSearchResult.Properties["distinguishedName"][0].ToString();
    var userDirectoryEntry = new DirectoryEntry($"LDAP://{distinguishedName}");

    return userDirectoryEntry;
}

public static string GetProperty(string friendlyname, string property)
{
    var user = GetUser(friendlyname);
    return user.Properties[property].Value.ToString();
}
public static void SetProperty(string friendlyName, string property, string value)
{
    var user = GetUser(friendlyName);
    user.Properties[property].Value = value;
    user.CommitChanges();
}

public static void ClearProperty(string friendlyName, string property)
{
    var user = GetUser(friendlyName);
    user.Properties[property].Clear();
    user.CommitChanges();
}

虽然我仍然不确定为什么代码会这样,但我设法通过以下方法解决了这个问题:

public static string GetProperty(string friendlyname, string property)
{
    var user = GetUser(friendlyname);
    try
    {
        return user.Properties[property].Value.ToString();
    }
    catch (NullReferenceException ex)
    {
        throw "No property found";
    }
}

这样我就可以处理我从这里抛出的任何异常,并使用它来指示用户的分机 属性 为空。