Pull to refresh
0

Решаем 9 задач управления Windows Server 2008 с помощью PowerShell. Часть 2

Reading time 6 min
Views 19K
Original author: Jeff Hicks

С помощью PowerShell можно гораздо быстрее решить множество задач управление Windows Server 2008, нежели это предполагается GUI. В прошлой статье были рассмотрены наиболее распространенных задач, которые могут быть реализованы с помощью PowerShell. Сегодня рассматриваем оставшиеся 4.

6. Получаем 10 последних ошибок журнала событий
7. Сбрасываем контроль доступа к папке
8. Вычисляем время работы сервера (uptime)
9. Получаем информацию о Service Pack

Оригинал статьи здесь. Заинтересованных приглашаем под кат.


6. Получаем 10 последних ошибок журнала событий



Каждое утро, вы возможно просматриваете журналы событий в поисках 10 последних ошибок в системном журнале событий на одном или нескольких компьютерах. Упростить эту задачу можно с помощью командлета Get-EventLog.
Нужно уточнить имя журнала событий и тип записи. Типичная команда для конкретной задачи выглядит так:

image

В нашем случае взят журнал событий ‘system’ и тип записи ‘Error”. Если мы не уточняем имя компьютера, информация собирается с локальной машины.
Обратите внимание на сообщения (Колонка Message), которые выведены не полностью. Давайте немного изменим команду, что бы мы могли их видеть полностью.

image

Мы просто передали выход предыдущей команды в ft, сокращение для Format-Table и задали отображения для таблицы следующих свойств: Timewritten, Source, EventID и Message. Мы также добавили -wrap и -auto для более красивого отображения. -wrap активирует обтекание текстов, а -auto – автоматическое форматирование.
Как это выглядит:

image

Создадим еще один вариант данной команды. Она сортирует свойства по Source и затем осуществляет их группировку. Вывод передается в more для отображения только того, что помещается на экран.

image

Пример:

image

Обратите внимание, что элементы сгруппированы по источнику. Сначала идет EventLog, затем Microsoft-Windows-GroupPolicy. — More – указывает на завершения отображения, необходимо нажать любую клавишу для того, чтобы посмотреть дополнительную информацию.
Все эти Get-EventLog команды, которые были продемонстрировали, запущены на локальном компьютере. Теперь покажем, как это сделать на удаленной машине.
Например, мне необходимо посмотреть 5 последний ошибок на контроллерах домена в офисе в Чикаго (имена компьютеров chi-dc01 и chi-dc02). Предположим, что мне необходимо отсортировать и сгруппировать результаты по Machine Name. Я также хотел бы отобразить следующие свойства Timewritten, Source, EventID и Message. И снова добавляю -wrap, -auto и more “для красоты”.

image

Получаем на выходе.

image

В предыдущем посте, рассматривая задачу №5 (получение информации по свободному месту на дисках), мы рассматривали как можно сделать HTML отчет и выложить его на Интернет сервер; то же можно сделать и с данной задаче.

7. Сброс контроля доступа к папке

Примеров, когда NTFS права на папку настроены не так, как надо, множество. Если это случается, вы, возможно, захотите, спросить контроль доступа к этой папке. Это реализуется с помощью командлета Set-Acl (Set-ACL).
Самый просто подход – использовать Get-Acl для извлечения ACL (Access Control List) из “хорошей” папки и копировать его в проблематичную папку. Произведется замена имеющегося ACL. Хотя и можно создать ACL объект с нуля, первый метод (копирование) желателен, и сейчас я продемонстрирую почему.
Предположим, что имеется на компьютере CHI-FP01 папка sales и у этой папки есть “хорошая” копия ACL. Копируем ACL и сохраняем в переменную $acl.

image

Давайте взглянем на информацию в ACL:

image

Видите свойство Access справа? Фактически это другой объект. Чтобы посмотреть его содержимое, выполним команду:

image

Что внутри:

image

Как Вы видите, это записи контроля доступа. Если Вы хотите видеть только ссылки (identity references), чьи имена совпадают с “Sales”, то выполните следующую команду:

image

Теперь если мы используем ту же команду, чтобы посмотреть содержимое свойства Access, принадлежащего созданной папке chicagosales, мы ничего не получим. Обратите внимание на использование сокращений:

image

Одной из возможных причин, почему значения не выводятся, может быть некорректная выдача NTFS прав.
Очевидно, что решение этой проблемы – копировать “хороший” ACL в “плохой”. Но для начала нужно получить текущие NTFS права папки chicagosales и сохранить в XML файл. Это необходимо для восстановления ACL, если вдруг что-то пойдет не так (импортируем XML файл).

image

После того, как это сделано, запускаем команду Set-Acl для chicagosales, используя $acl, скопированную из хорошей папки.

image

Проверим, успешно ли осуществлена процедура: Используем ту же команду, которую мы использовали ранее для отображения ссылок на тех, чьи имена совпадают с “Sales”.

image

Теперь chicagosales NTFS разрешения те же, что и для папки sales. Таким образом, у вас есть простой способ управления разрешениями, позволяющий оперативно разрешить проблемы контроля доступа.

8. Получение информации о времени работы сервера (uptime)

Вашем руководству возможно будет интересно регулярно получать информацию о времени работы сервера. Используем для этого WMI класс Win32_OperatingSystem. Он выведет время работы. Возможен локальный и удаленный запуск команды. Свойство, которое нас интересует, LastBootUpTime. Но так как оно отображается в WMI формате, нам нужно будет конвертировать в более приемлемый формат.
Начнем с примера запуска локально под Windows 7.
Сначала сохраним результаты GetWmiObject в переменную $wmi.

image

В $wmi присутствует несколько свойств, с которыми мы будем работать, а именно CSName (имя компьютера) и LastBootUpTime.

image

LastBootUpTime отображается WMI формате, поэтому его нужно отконвертировать. Сохраним отконвертированное значение в переменную $boot.

image

Мы используем метод ConverToDateTime, который включен во все WMI объекты, которые вы получаете, когда запускаете GetWmiObject. Параметр, который вы передаете в этот метод — свойство LastBootUpTime WMI объекта $wmi.
Запросив информацию о $boot, вы получите следующее, что гораздо нагляднее предыдущего варианта LastBootUpTime:

image

Для определения времени работы машины, вычитываем $boot из текущих даты/времени, которые могут быть получены с помощью Get-Date.

image

Результат выводится как TimeSpan объект. Отконвертируем его в строку для более наглядного представления с помощью ToString().

image

Мы видим, что машина была запущена 2 дня 5 часов 46 минут и т.д.
А теперь все, что мы рассмотрели, запишем в виде функции под названием get-boot. Сначала посмотрим на нее полностью.

image

У функции есть параметр, который берет имя компьютера и делает его именем локального компьютера по умолчанию.

image

Затем мы используем фрагмент скрипта Process, где свойство “имя компьютера” передается в функцию. “$_” указывает, что имя компьютера задается как переменная. В противном случае имя компьютера как будет воспринято как параметр.

image

Включенное в фрагмент скрипта Process выражение GetWmiObject уточняет имя удаленного компьютера.

image

Здесь также будет несколько хеш-таблиц. Свойство CSName поменяем на Computername, так мы сможем получить более наглядное отображение. Свойство LastBoot представляет собой значение LastBootUpTime, отконвертированное с использование метода ConvertToDateTime(). И еще есть свойство Uptime, которое представляет собой TimeSpan объект, показывающий, как долго машина была запущена.

image

Если мы запускаем скрипт локально (например, нам не нужно уточнять имя компьютера), функция по умолчанию берет имя локального компьютера. Вот что получится на выходе:

image

Как в случае с задачей 2 предыдущего поста (“Перезагрузка или выключение сервера”), Вы можете сохранить имена серверов в текстовый файл, обрабатывать те, которые пингуются и передавать их имена в функцию get-boot.

image

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.
Типичное выражение выглядит следующим образом:

image

Как мы видим эта машина под Windows 7 не использует ни один SP, поэтому ServicePackMajorVersion равно 0, а CSDVersion пусто.
Создадим функцию Get-SP. В качестве параметра возьмем имя компьютера, по умолчанию совпадающее с именем локального компьютера.

image

И снова мы используем блок скрипта Process. Так что если имя компьютера передается, переменная $computername будет установлена в качестве передаваемого объекта. Основная часть функции – выражение класса Get-Wmiobject/Win32_operatingsystem.
Как и прежде, создадим пару хеш-таблиц. CSName переведем в ComputerName. Вместо свойства Caption используем Operating System. А вместо CSDVersion SPName. Наконец, вместо ServicePackMajorVersion используем просто Version.

image

Вот пример функции, запущенной локально:

image

Теперь можно взять компьютеры из текстового файла, пропинговать их и передать их имена в созданную функцию get-sp. Результат:

image

Можно видеть, что у CHI-DC02 отсутствует Service Pack 1, который только недавно был выпущен для Server 2008 R2. А это дает основания задуматься об обновлении Service Pack на этом компьютере.

Upd:
В посте приведен перевод статьи с портала petri.co.il
Top 10 Server 2008 Tasks done with PowerShell – Part 2
Tags:
Hubs:
+4
Comments 0
Comments Leave a comment

Articles

Information

Website
www.netwrix.ru
Registered
Founded
2006
Employees
101–200 employees
Location
США