PermissiveModifyControl создает исключение DirectoryOperationException в C # LDAP - PullRequest
4 голосов
/ 10 августа 2010

Использование пространства имен System.DirectoryServices.Protocols для добавления / изменения атрибутов в группе Active Directory. Код:

public void UpdateProperties(Dictionary<string, string> Properties) {

    List<DirectoryAttributeModification> directoryAttributeModifications;

    //  ... Code to convert Properties dictionary to directoryAttributeModifications
    //  There is one 'Add' modification, to set the 'description' of the group

    ModifyRequest modifyRequest = new ModifyRequest(groupDistinguishedName, directoryAttributeModifications.ToArray());
    modifyRequest.Controls.Add(new PermissiveModifyControl());
    ModifyResponse response = connection.SendRequest(modifyRequest) as ModifyResponse;

PermissiveModifyControl предназначен для предотвращения сбоя кода, если описание уже существует. Единственная информация о PermissiveModifyControl, которую я нашел, находится здесь: http://msdn.microsoft.com/en-us/library/bb332056.aspx

которая гласит:

Запрос на изменение LDAP обычно не выполняется, если он пытается добавить атрибут, который уже существует, или если он пытается удалить атрибут, который не существует. При PermissiveModifyControl операция изменения завершается успешно, не выдавая ошибку DirectoryOperationException.

Однако, когда приведенный выше код попадает в SendRequest(), он выдает DirectoryOperationException: «Атрибут существует или ему присвоено значение».

Чего я пытаюсь избежать, так это необходимости запрашивать каждое свойство в передаваемой коллекции; если он существует, создайте Replace DirectoryAttributeModification; если это не так, создайте Add. Из того, что я могу почерпнуть, PermissiveModifyControl должен делать именно это.

Может кто-нибудь пролить свет на то, почему PermissiveModifyControl все еще выбрасывает DirectoryOperationException, и как правильно его использовать?

Заранее спасибо! Джеймс

1 Ответ

3 голосов
/ 17 августа 2010

После еще нескольких экспериментов я обнаружил, что документация вводит в заблуждение ... вы не хотите добавлять атрибут, вы хотите заменить его (DirectoryAttributeOperation.Replace). Если атрибут существует, он, конечно, заменит его. Если атрибут не существует, он его создаст.

Остальная часть моего кода верна.

...