Поддерживает ли транзакция Active Directory? - PullRequest
16 голосов
/ 07 августа 2009

Простой вопрос, но я нигде не могу найти ответ: поддерживает ли транзакция Active Directory?

Другими словами, будет ли откатано следующее изменение (поскольку я не звонил scope.Complete()):

using (var scope = new TransactionScope())
{
    DirectoryEntry entry = ...;
    entry.Properties["givenName"].Value = "New Given Name";
    entry.CommitChanges();
}

Если нет, то можно ли это как-то включить? Прямо сейчас у меня есть код, который выполняет обновления базы данных и соответствующие обновления AD, и у меня есть компенсирующая логика для обновлений AD, если они как-то не работают. Это решение далеко от оптимального.

С уважением, Рональд Вильденберг

Ответы [ 2 ]

9 голосов
/ 10 августа 2009

Краткий ответ - нет. ActiveDirectory по сути является реализацией LDAP (с некоторыми необычными расширениями, но по своей сути это все еще LDAP). Ни протоколы LDAP, ни спецификации не имеют концепции транзакций, так что это действительно невозможно.

Можно было бы эмулировать транзакции на стороне клиента, но вы должны были бы сделать это самостоятельно или использовать Spring, который, я считаю, сделает это для вас - очевидно, это не так безопасно, как транзакции на стороне сервера, что вы ' Ожидал от БД. Замечание о Spring - я не совсем уверен, что Spring.NET поддерживает «транзакции» для LDAP, но у них есть что-то подобное в Java-реализации Spring. Возможно, стоит посмотреть.

Из прочтения документации по методу CommitChanges просто говорится, что он отправляет ваши изменения на сервер - если не будет смысла говорить, что они безопасны для транзакций, я бы предположил, что это не так.

Некоторые случайные мысли - я догадываюсь , возможно, что Microsoft может добавить что-то подобное в ActiveDirectory (так как это больше, чем просто LDAP), но они, вероятно, не будут, если они еще не сделали.

1 голос
/ 07 января 2017

Нет. LDAP напрямую не поддерживает транзакции, однако можно «свернуть свое» решение, написав класс enlistment, который реализует интерфейс IEnlistmentNotification. IEnlistmentNotification работает как с явными, так и с неявными транзакциями в пространстве имен System.Transactions.

Дополнительную документацию (и пример) вы можете найти здесь: https://msdn.microsoft.com/en-us/library/system.transactions.ienlistmentnotification(v=vs.110).aspx

...