С помощью PowerShell можно гораздо быстрее решить множество задач управление Windows Server 2008, нежели это предполагается GUI. В прошлой статье были рассмотрены наиболее распространенных задач, которые могут быть реализованы с помощью PowerShell. Сегодня рассматриваем оставшиеся 4.
6. Получаем 10 последних ошибок журнала событий
7. Сбрасываем контроль доступа к папке
8. Вычисляем время работы сервера (uptime)
9. Получаем информацию о Service Pack
Оригинал статьи здесь. Заинтересованных приглашаем под кат.
6. Получаем 10 последних ошибок журнала событий
Каждое утро, вы возможно просматриваете журналы событий в поисках 10 последних ошибок в системном журнале событий на одном или нескольких компьютерах. Упростить эту задачу можно с помощью командлета Get-EventLog.
Нужно уточнить имя журнала событий и тип записи. Типичная команда для конкретной задачи выглядит так:
В нашем случае взят журнал событий ‘system’ и тип записи ‘Error”. Если мы не уточняем имя компьютера, информация собирается с локальной машины.
Обратите внимание на сообщения (Колонка Message), которые выведены не полностью. Давайте немного изменим команду, что бы мы могли их видеть полностью.
Мы просто передали выход предыдущей команды в ft, сокращение для Format-Table и задали отображения для таблицы следующих свойств: Timewritten, Source, EventID и Message. Мы также добавили -wrap и -auto для более красивого отображения. -wrap активирует обтекание текстов, а -auto – автоматическое форматирование.
Как это выглядит:
Создадим еще один вариант данной команды. Она сортирует свойства по Source и затем осуществляет их группировку. Вывод передается в more для отображения только того, что помещается на экран.
Пример:
Обратите внимание, что элементы сгруппированы по источнику. Сначала идет EventLog, затем Microsoft-Windows-GroupPolicy. — More – указывает на завершения отображения, необходимо нажать любую клавишу для того, чтобы посмотреть дополнительную информацию.
Все эти Get-EventLog команды, которые были продемонстрировали, запущены на локальном компьютере. Теперь покажем, как это сделать на удаленной машине.
Например, мне необходимо посмотреть 5 последний ошибок на контроллерах домена в офисе в Чикаго (имена компьютеров chi-dc01 и chi-dc02). Предположим, что мне необходимо отсортировать и сгруппировать результаты по Machine Name. Я также хотел бы отобразить следующие свойства Timewritten, Source, EventID и Message. И снова добавляю -wrap, -auto и more “для красоты”.
Получаем на выходе.
В предыдущем посте, рассматривая задачу №5 (получение информации по свободному месту на дисках), мы рассматривали как можно сделать HTML отчет и выложить его на Интернет сервер; то же можно сделать и с данной задаче.
7. Сброс контроля доступа к папке
Примеров, когда NTFS права на папку настроены не так, как надо, множество. Если это случается, вы, возможно, захотите, спросить контроль доступа к этой папке. Это реализуется с помощью командлета Set-Acl (Set-ACL).
Самый просто подход – использовать Get-Acl для извлечения ACL (Access Control List) из “хорошей” папки и копировать его в проблематичную папку. Произведется замена имеющегося ACL. Хотя и можно создать ACL объект с нуля, первый метод (копирование) желателен, и сейчас я продемонстрирую почему.
Предположим, что имеется на компьютере CHI-FP01 папка sales и у этой папки есть “хорошая” копия ACL. Копируем ACL и сохраняем в переменную $acl.
Давайте взглянем на информацию в ACL:
Видите свойство Access справа? Фактически это другой объект. Чтобы посмотреть его содержимое, выполним команду:
Что внутри:
Как Вы видите, это записи контроля доступа. Если Вы хотите видеть только ссылки (identity references), чьи имена совпадают с “Sales”, то выполните следующую команду:
Теперь если мы используем ту же команду, чтобы посмотреть содержимое свойства Access, принадлежащего созданной папке chicagosales, мы ничего не получим. Обратите внимание на использование сокращений:
Одной из возможных причин, почему значения не выводятся, может быть некорректная выдача NTFS прав.
Очевидно, что решение этой проблемы – копировать “хороший” ACL в “плохой”. Но для начала нужно получить текущие NTFS права папки chicagosales и сохранить в XML файл. Это необходимо для восстановления ACL, если вдруг что-то пойдет не так (импортируем XML файл).
После того, как это сделано, запускаем команду Set-Acl для chicagosales, используя $acl, скопированную из хорошей папки.
Проверим, успешно ли осуществлена процедура: Используем ту же команду, которую мы использовали ранее для отображения ссылок на тех, чьи имена совпадают с “Sales”.
Теперь chicagosales NTFS разрешения те же, что и для папки sales. Таким образом, у вас есть простой способ управления разрешениями, позволяющий оперативно разрешить проблемы контроля доступа.
8. Получение информации о времени работы сервера (uptime)
Вашем руководству возможно будет интересно регулярно получать информацию о времени работы сервера. Используем для этого WMI класс Win32_OperatingSystem. Он выведет время работы. Возможен локальный и удаленный запуск команды. Свойство, которое нас интересует, LastBootUpTime. Но так как оно отображается в WMI формате, нам нужно будет конвертировать в более приемлемый формат.
Начнем с примера запуска локально под Windows 7.
Сначала сохраним результаты GetWmiObject в переменную $wmi.
В $wmi присутствует несколько свойств, с которыми мы будем работать, а именно CSName (имя компьютера) и LastBootUpTime.
LastBootUpTime отображается WMI формате, поэтому его нужно отконвертировать. Сохраним отконвертированное значение в переменную $boot.
Мы используем метод ConverToDateTime, который включен во все WMI объекты, которые вы получаете, когда запускаете GetWmiObject. Параметр, который вы передаете в этот метод — свойство LastBootUpTime WMI объекта $wmi.
Запросив информацию о $boot, вы получите следующее, что гораздо нагляднее предыдущего варианта LastBootUpTime:
Для определения времени работы машины, вычитываем $boot из текущих даты/времени, которые могут быть получены с помощью Get-Date.
Результат выводится как TimeSpan объект. Отконвертируем его в строку для более наглядного представления с помощью ToString().
Мы видим, что машина была запущена 2 дня 5 часов 46 минут и т.д.
А теперь все, что мы рассмотрели, запишем в виде функции под названием get-boot. Сначала посмотрим на нее полностью.
У функции есть параметр, который берет имя компьютера и делает его именем локального компьютера по умолчанию.
Затем мы используем фрагмент скрипта Process, где свойство “имя компьютера” передается в функцию. “$_” указывает, что имя компьютера задается как переменная. В противном случае имя компьютера как будет воспринято как параметр.
Включенное в фрагмент скрипта Process выражение GetWmiObject уточняет имя удаленного компьютера.
Здесь также будет несколько хеш-таблиц. Свойство CSName поменяем на Computername, так мы сможем получить более наглядное отображение. Свойство LastBoot представляет собой значение LastBootUpTime, отконвертированное с использование метода ConvertToDateTime(). И еще есть свойство Uptime, которое представляет собой TimeSpan объект, показывающий, как долго машина была запущена.
Если мы запускаем скрипт локально (например, нам не нужно уточнять имя компьютера), функция по умолчанию берет имя локального компьютера. Вот что получится на выходе:
Как в случае с задачей 2 предыдущего поста (“Перезагрузка или выключение сервера”), Вы можете сохранить имена серверов в текстовый файл, обрабатывать те, которые пингуются и передавать их имена в функцию get-boot.
9. Получение информации о service pack
Получать информацию о service pack важно по ряду причин. Во-первых, вы можете быть в процессе установки обновления и вам важно нужно найти компьютеры с определённым SP. Во-вторых, вы можете осуществлять инвентаризацию или аудит ваших компьютеров, поэтому информация о SP вам будет нужна.
Для этого мы снова будет использовать WMI и класс Win32_Operating System. Обратите внимание на некоторые свойства: the ServicePackMajorVersion – целое число (1, 2 или 0); ServicePackMinorVersion и CSDVersion, которое выводит информацию в строку, например, “Service Pack 1”.
При работе нас интересуют в первую очередь свойства CSName (имя компьютера), Caption (ОС), CSDversion и ServicePackMajorVersion.
Типичное выражение выглядит следующим образом:
Как мы видим эта машина под Windows 7 не использует ни один SP, поэтому ServicePackMajorVersion равно 0, а CSDVersion пусто.
Создадим функцию Get-SP. В качестве параметра возьмем имя компьютера, по умолчанию совпадающее с именем локального компьютера.
И снова мы используем блок скрипта Process. Так что если имя компьютера передается, переменная $computername будет установлена в качестве передаваемого объекта. Основная часть функции – выражение класса Get-Wmiobject/Win32_operatingsystem.
Как и прежде, создадим пару хеш-таблиц. CSName переведем в ComputerName. Вместо свойства Caption используем Operating System. А вместо CSDVersion — SPName. Наконец, вместо ServicePackMajorVersion используем просто Version.
Вот пример функции, запущенной локально:
Теперь можно взять компьютеры из текстового файла, пропинговать их и передать их имена в созданную функцию get-sp. Результат:
Можно видеть, что у CHI-DC02 отсутствует Service Pack 1, который только недавно был выпущен для Server 2008 R2. А это дает основания задуматься об обновлении Service Pack на этом компьютере.
Конец перевода.
Автор: NetWrixRU