如何清除扩展属性

时间:2016-08-19 09:51:48

标签: c# active-directory directoryservices

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

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

调用ActiveDirectory.ClearProperty("user.name", "extensionAttribute2")后,该属性已清除,但当我尝试使用ActiveDirectory.GetProperty("user.name", "extensionAttribute2", "123456789")设置时,我收到错误消息:

  

对象引用未设置为对象的实例。

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

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

这是AD的正常行为吗?我觉得调用Clear只是清除值而不是实际销毁属性,或者这是extensionAttribute s的一个特征?我想使用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();
}

1 个答案:

答案 0 :(得分:0)

虽然我仍然不确定为什么代码表现得像这样,但我设法用以下方法解决了这个问题:

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";
    }
}

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