Более эффективный мониторинг членства в группах в Active Directory (C # .NET)
-
01-07-2019 - |
Вопрос
У меня есть инструмент синхронизации Active Directory (.NET 2.0 / C #), написанный как служба Windows, над которым я некоторое время работал, и недавно мне было поручено добавить возможность управлять событиями на основе изменений в членстве в группе.Базовый сценарий заключается в том, что пользователи синхронизируются с базой данных безопасности, и при изменении членства в группе пользователям необходимо изменить свои права доступа (т.е.если я теперь являюсь членом "ИТ-персонала", то я должен автоматически получать доступ к серверной комнате, если я удален из этой группы, то я должен автоматически потерять доступ к серверной комнате).
Проблема в том, что при выполнении DirectorySynchronization для групп вы получаете обратно группу, в которую был добавлен / удален участник, и оттуда, когда вы захватываете список участников, вы получаете обратно список всех участников в этой группе в данный момент, а не только участников, которые были добавлены или удалены.Это приводит меня к довольно серьезной проблеме эффективности - поскольку для того, чтобы узнать, был ли добавлен или удален пользователь, мне нужно будет хранить локально список каждой группы и всех участников и сравнивать его с текущим списком, чтобы увидеть, кто был добавлен (не в локальный список), а кто был удален (в локальный список, не в список текущих участников).
Я обсуждаю возможность простого сохранения сведений о членстве в группе в наборе данных в памяти и записи на диск каждый раз, когда я обрабатываю новые изменения членства.Таким образом, если служба остановится / выйдет из строя или компьютер будет перезагружен, я все равно смогу получить информацию о текущем состоянии Active Directory в базе данных безопасности, сравнив последнюю информацию на диске с информацией из текущего списка участников группы.Однако это кажется ужасно неэффективным - перебирать каждого участника в группе для сравнения с тем, что есть в наборе данных, а затем записывать изменения на диск каждый раз, когда в списке появляются изменения.
Кто-нибудь сталкивался с этим сценарием раньше?Есть ли какой-нибудь способ, который я не нашел, чтобы получить только дельту членов группы?Что бы вы сделали в этой ситуации, чтобы гарантировать, что вы никогда не пропустите никаких изменений при минимально возможном снижении производительности?
Редактировать: В объявлении может быть 500 пользователей, в нем может быть 200 000 пользователей - это зависит от заказчика и, кроме того, от количества групп, в которых состоит средний пользователь
Решение
Я бы сказал, что это зависит от того, сколько объектов active Directory вам нужно отслеживать.Если это небольшое число (менее 1000 пользователей), вы, вероятно, сможете сериализовать данные о своем состоянии на диск с незначительным снижением производительности.Если вы имеете дело с очень большим количеством объектов, возможно, было бы эффективнее создать простую схему сохранения в чем-то вроде SQL Express и использовать ее.
Другие советы
Вы можете настроить аудит успешности внесения изменений в учетную запись в редакторе групповой политики
Затем вы можете отслеживать записи в журнале безопасности и обрабатывать записи в журнале изменений учетной записи.
Например.
EventLog myLog = new EventLog("Security");
// set event handler
myLog.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten);
myLog.EnableRaisingEvents = true;
Убедитесь, что у вас есть права доступа к журналу событий безопасности http://support.microsoft.com/kb/323076
Вы знаете, что существуют продукты, которые помогают вам с синхронизацией каталогов и подготовкой пользователей (погуглите эти термины)?Изобретено не здесь и все такое, и вам, возможно, придется оправдывать инвестиции в нынешних условиях, но разработка и сопровождение кода, для которого уже существует коммерческое решение, не всегда является, скажем так, самым рентабельным способом в долгосрочной перспективе.
Не все поддерживают eventing / provisioning, но они поддерживают отслеживание изменений и их распространение:нет ничего сложного в создании решений для проведения соревнований поверх этих возможностей.
У Microsoft есть Сервер интеграции идентификационных данных (MISS), который переупаковывается как часть Менеджер жизненного цикла идентификационных данных.Первоначально он был построен на более общем продукте для управления мета / основными данными, но вполне работоспособен.IBM обладает Интегратор каталогов Tivoli (но вам нужно следить за изменениями названия раз в два года!).У Oracle есть Oracle Identity Manager - Менеджер идентификации, и Солнце , и Менеджер идентификации.Большинство из них являются ведущими продуктами, приобретаемыми крупными игроками, чтобы заполнить пробел в своих портфелях.
Конечно, это продукты корпоративного класса, то есть большие и дорогие, но в целом довольно перспективные и расширяемые.Если вам не нужна их полная мощность (пока!), вам нужно будет подумать о том, чтобы сохранить копию для себя.В таком случае, рассматривали ли вы возможность сохранения вашей копии последнего известного дерева объявлений с использованием Рекламные СПД (ранее AD/AM)?Это не оптимальный формат для сравнения различий, но база данных каталогов будет достаточно хорошо масштабироваться, даже самая легкая.