SCCM: Коллекция устройств на основе членства в локальной группе

Недавно передо мной возникла задача отделять в SCCM рабочие станции, управляемые IT-отделом, от рабочих станций, управляемых пользователями самостоятельно. Критерием самостоятельно управляемой рабочей станции было выбрано наличие каких-либо учётных записей в группе локальных администраторов, кроме Administrator, Domain Admins и группы сотрудников техподдержки. Все рабочие станции расположены в одном OU, поэтому создание коллекций по OU не подходило.

Как вы возможно знаете, SCCM 2012 не имеет встроенных средств для получения членства в локальных группах рабочих станций и серверов. Спасибо Sherry Kissinger, которая решила эту проблему с использованием Compliance Settings.
После установки её пакета, вы получите новые Configuration Baseline, Configuration Item и 2 таблицы и 1 view в базе SCCM: LocalGroupMembers_DATA, LocalGroupMembers_HIST и v_GS_LocalGroupMembers0.

В дальнейшем вы можете использовать данные из view v_GS_LocalGroupMembers0 для построения отчётов о членах локальных групп управляемых вами компьютеров (Не забудьте распространить baseline на нужную коллекцию компьютеров, но ни в коем случае не на контроллеры домена! Например, создайте коллекцию с правилом Include для стандартной коллекции All Systems и правилом Exclude для коллекции All Domain Controllers. Вы можете загрузить MOF-файл такой коллекции здесь).

НО, к сожалению, ни таблица LocalGroupMembers_DATA, ни v_GS_LocalGroupMembers0 недоступны для WQL-запросов, которые используются при создании коллекций.
Казалось бы, я застрял. Что у меня было на руках на тот момент:

  • У меня есть все данные о членстве в локальных группах на всех компьютерах.
  • Я могу построить любые отчёты по ним.
  • У меня есть средства для построения коллекций по данным из стандартных таблиц SCCM.
  • SCCM не может использовать данные из нестандартных таблиц для построения коллекций.

Итак, нам нужен способ поместить данные из таблицы LocalGroupMembers_DATA в стандартные таблицы SCCM для построения коллекции по ним и PowerShell нам в этом поможет.
Есть как минимум 2 способа получения данных из SQL в PowerShell:

  1. Подключаться напрямую к базе и использовать SQL-запросы при помощи командлетов SQL.
  2. Или подключаться к SQL Server Reporting Services с использованием командлета New-WebServiceProxy. Stefan Stranger и Jin Chen написали сценарий для этого.

Т.к. это PowerShell, дальше мы можем делать с данными из SQL всё, что угодно. Наша задача – это наполнение коллекции устройств, и тут опять существует как минимум 2 варианта:

  1. Добавлять компьютеры в группу AD DS, по которой затем создавать коллекцию устройств в SCCM. В этом случае, метод обнаружения Active Directory Group Discovery для сайта и домена, где будет расположена эта группа, должен быть активирован.
  2. Напрямую добавлять компьютеры в коллекцию SCCM используя командлет Add-CMDeviceCollectionDirectMembershipRule.

Т.к. и отчёт, и группа в AD DS будут мне полезны в будущем, я выбрал вариант именно с ними.

Итак, общий сценарий действий такой:

  1. Активировать Active Directory Group Discovery.
  2. При помощи Compliance Settings собирать сведения о членстве в локальных группах на компьютерах.
  3. Строить отчёт по этой таблице на любом SSRS.
  4. Используя командлет New-WebServiceProxy, получать имена компьютеров из этого отчёта.
  5. Добавлять эти компьютеры в специальную группу.
  6. Стандартными средствами SCCM наполнять коллекцию устройств по группе AD DS.

Я построил отчёт в котором вывожу списком все компьютеры, не удовлетворяющие условиям, описанным выше. Вот, как выглядит запрос для первого DataSet’а:

Вы легко можете расширить его для исключения как-то других групп.
Обратите внимание на параметр CompOU: в веб-интерфейсе вы можете выбрать одно или несколько OU, откуда выводить компьютеры.

Для получения полного списка этих OU из ваших лесов, служит второй DataSet с таким кодом:

Далее я модифицировал сценарий RenderSQLReportFromPosh.v1.000.ps1 таким образом, чтобы он не только получал отчёт из SSRS, но и на его основе формировал группу в AD DS. Вот его полный код:

Сценарий получает отчёт с SSRS, определяемому в переменных $URI и $ReportPath, сравнивает список компьютеров из него с группой $GroupName и добавляет/удаляет компьютеры из неё таким образом, чтобы она совпадала со списком из отчёта.
Сценарий ведёт журнал работы по пути $Log, в который записывает, удалил он компьютер в группу или, наоборот, добавил.
В качестве параметров я передаю отчёту 2 OU ($param1 и $param2). Если вам нужно больше, просто создавайте новые параметры и добавляйте их в переменную $parameters.

Наконец, я создал стандартную коллекцию устройств на основе членства в группе $GroupName и всё заверте…

Загрузить RDL-файл отчёта и сценарий вы можете здесь. Не забудьте в отчёте создать DataSource для подключения к вашему серверу SSRS.

Leave a Reply

Your email address will not be published. Required fields are marked *