Размер шрифта:
Определение членства в группах
Play

Определение членства в группах

Начиная создавать сценарии, мы обычно мечтаем о чудесной автоматизации простых операций. После некоторых начальных успехов приходится переключать внимание на решение более сложных задач при помощи сценариев, которые требуют цепочек команд и утилит для получения необходимой информации. Использование результатов работы одной команды в качестве входных данных для следующей является наиболее общей техникой при создании сценариев. Однако при использовании такой техники требуется выстраивать логику кода так, что если одна из команд завершается ошибкой, сценарий должен пропускать следующие команды цепочки и вносить соответствующую запись в журнал событий

Практика написания сценариев

В Листинге 1 приведен сценарий GetGroupStats.bat; в нем используется встроенная команда Nbtstat и две дополнительные утилиты, PsLoggedOn и MemberOf, при помощи которых создается отчет, показывающий, членами скольких групп является зарегистрированный пользователь. В пояснениях к этому сценарию я представлю новый способ управления потоком команд сценария. Этот метод делает сценарий легким для чтения и упрощает синтаксис программы на языках Perl и VBScript. С тех пор, как появилась MS-DOS, в качестве механизма управления сценариями командной строки применялись операторы Goto и Call. Однако в других языках сценариев в качестве предпочтительного метода управления логикой используется условный оператор If.

Переполнение SID

Я написал GetGroupStats.bat для решения проблемы, которую называют SID token bloat (чрезмерное разрастание SID), описанной в статье Microsoft "Group Policy May Not Be Applied to Users Belonging to Many Groups" (http://support.microsoft.com/?kbid=263693). В этой статье речь идет о том, что Windows не смогла применить групповую политику для пользователя, который является прямым или неявным членом более 70-80 групп. Поскольку в нашей компании имели место случаи подобного сложного членства, я не мог определить, какие пользователи являются членами какого количества групп. Просматривая небольшую группу пользователей, нельзя с полной уверенностью сказать, имеются ли у компании потенциальные проблемы. Кроме того, у меня не было полного списка пользователей, поскольку сообщество пользователей состояло из множества организационных подразделений (OU), в которых я не являлся администратором. У меня был список компьютеров, на которых регистрировались пользователи, поэтому с помощью сценария надо было разобрать список имен компьютеров и узнать, кто из пользователей на нем зарегистрировался. Затем сценарий должен был создать табличный отчет о том, какому количеству групп принадлежит каждый из зарегистрированных пользователей. Впоследствии я использовал Microsoft Excel для сортировки данных отчета.

Другой целью применения GetGroupStats.bat может быть определение слишком большого количества членов в группе и идентификация связанных с этим проблем безопасности. Допустим, если известно, что большинство пользователей (не администраторов) являются членами 10 групп, и обнаружен пользователь, принадлежащий 25 или 30 группам, придется разобраться с этой ситуацией. Возможно, пользователь получил дополнительное членство после того, как был переведен в новое подразделение, или по неопытности администратор учетных записей предоставил пользователю слишком широкие права доступа. Мы можем идентифицировать потенциальные проблемы путем сортировки столбцов в выходном файле сценария, сохраненном в формате Excel (.TSV tab-separated value).

Утилиты PsLoggedOn и MemberOf

Сценарий GetGroupStats.bat для определения зарегистрировавшегося пользователя задействует утилиту PsLoggedOn компании Sysinternals. Также в сценарии используется утилита MemberOf, созданная Joe Richard. При помощи этой утилиты сценарий определяет, какому количеству групп принадлежит пользователь. В Windows NT 4.0 были утилиты Findgrp и IfMember, перечисляющие членство в группах, но в случае наличия вложенных локальных групп в окружении эти утилиты не могли правильно отразить действительное количество членов в группах. MemberOf предоставляет имена групп и их типы. Сценарий GetGroupStats.bat использует утилиту только для сбора информации о том, в каком количестве групп пользователи являются членами.

Nbtstat или Ping

Вы можете применять команды Nbtstat и Ping, чтобы определять, включена система или нет. Необходимо всегда проверять, включена ли система, перед выполнением каких-либо действий и запросов, поскольку некоторые команды имеют продолжительные периоды ожидания, что может привести к значительным задержкам в случае, если система не отвечает. Далее приведен пример основной команды Nbtstat, определяющей, включен ли компьютер с именем workst1.

Nbtstat -a workst1

Ключ -а возвращает таблицу имен заданной удаленной машины. После вставки Nbtstat в цикл For сценарий просматривает строки, которые являются частью таблицы, выведенной Nbtstat, возвращающей информацию о включенной системе. Блок кода выглядит примерно так, как показано в листинге 2. Код, приведенный в листинге 3, показывает использование утилиты PsLoggedOn для определения зарегистрированного пользователя.

Распрощайтесь с командами Call и Goto

Комнды Call и Goto позволяют перенаправить поток исполнения и работать подобно конструкции If. Then. Else, которая присутствует в VBScript. Если вы пишете собственный сценарий командной строки, то обычно используете команду For для установки значений переменных окружения команды и Call или Goto для передачи управления следующей команде. Команды Call и Goto также часто используются в условном операторе If для осуществления вызовов и переходов.

Стоит отметить, что большинство сценариев состоит из нескольких блоков кода, подобных сценарию, представленному в листинге 2. Использование команд Call и Goto в блоках, подобных приведенному, делает отслеживание логики затруднительным, поскольку приходится пролистывать страницы кода, чтобы понять, куда перенаправлено управление и в каком порядке будет выполняться код. Более того, команда Call отсылает поток в точку, следующую за строкой вызова Call. Команда Goto перебрасывает поток и никогда не возвращает его обратно к перенаправившей его команде Goto. По мере того, как сценарий становится все более длинным и сложным, вам требуется все больше и больше времени на отслеживание всевозможных переходов в случае, когда сценарий по каким-либо причинам не работает.

Вы можете использовать в своих сценариях более эффективную команду интерпретатора Setlocal ENABLEDELAYEDEXPANSION, поддерживаемую в Windows 2000 и более поздних версиях. Код, представленный в листинге 4, подобен коду листинга 2, но без команд Goto и Call.

Последний сценарий совсем не похож на сценарий предыдущего варианта. Заметим, что в сценарии листинга 4 имеется вложенная команда For и используется команда Setlocal ENABLEDELAYEDEXPANSION, позволяющая определить переменную и начать использовать ее немедленно, пока она еще в цикле команды For. Возможность использования переменных внутри команды For без применения Call для перехода к другой части кода программы очень полезна. Это свойство делает ваши сценарии командной строки пригодными для использования в других языках сценариев, которые вы, возможно, захотите изучить в будущем. К тому же сценарии станут более простыми для чтения и трассировки. Информацию об использовании Setlocal и возможностях этой технологии локализации изменений среды можно получить, открыв командную строку и набрав

📎📎📎📎📎📎📎📎📎📎