У меня есть инструмент синхронизации Active Directory (.NET 2.0/C#), написанный как служба Windows, над которым я работал некоторое время, и недавно было поручено добавить возможность управлять событиями на основе изменений в членстве в группе. Основной сценарий заключается в том, что пользователи синхронизируются с базой данных безопасности, а при изменении членства в группе пользователям необходимо изменить права доступа (то есть, если я сейчас являюсь членом «ИТ-персонала», то я должен автоматически получать доступ к серверная комната, если я удалю из этой группы, я должен автоматически потерять доступ к серверной комнате).Более эффективное участие группы мониторинга в Active Directory (C# .NET)
Проблема заключается в том, что при выполнении DirectorySynchronization против групп вы получаете обратно группу, у которой был добавлен/удален член, а оттуда, когда вы захватываете список участников, вы возвращаете список всех членов этой группы в настоящее время, а не просто члены, которые были добавлены или удалены. Это приводит меня к довольно эффективной проблеме - поскольку для того, чтобы узнать, был ли пользователь добавлен или удален, мне придется локально сохранять список каждой группы и всех членов и сравнивать их с текущим списком, чтобы узнать, кто был добавлен (не в локальный список) и кто был удален (в локальном списке, а не в списке текущих участников).
Я обсуждаю, как просто хранить данные о членстве в группе в DataSet в памяти и записывать на диск каждый раз, когда я обрабатывал новые изменения членства. Таким образом, если служба останавливается/сбой или перезагрузка компьютера, я все равно могу перейти к текущему состоянию Active Directory в базе данных безопасности, сравнив последнюю информацию на диске с текущим списком членов группы. Тем не менее, это кажется ужасным неэффективным - прохождение через каждого члена группы, чтобы сравнить с тем, что находится в наборе данных, а затем записывать изменения на диск каждый раз, когда есть изменения в списке.
Кто-нибудь имел дело с этим сценарием раньше? Есть ли способ, который я не нашел, чтобы получить только дельту членов группы? Что бы вы сделали в этой ситуации, чтобы вы никогда не пропустили каких-либо изменений, хотя можно было добиться наименьшей производительности?
Edit: AD может содержать 500 пользователей, он может содержать 200000 пользователей - это зависит от клиента, и на вершине, что сколько групп средний пользователь является членом
Вы получили лучший хороший образец и практику для эффективного доступа к AD? – Kiquenet 2016-02-16 08:10:37