![](https://habrastorage.org/storage2/eef/1be/c68/eef1bec6878c24a31ad68b76ed06356e.jpg)
С помощью PowerShell можно гораздо быстрее решить множество задач управление Windows Server 2008, нежели это предполагается GUI. В прошлой статье были рассмотрены наиболее распространенных задач, которые могут быть реализованы с помощью PowerShell. Сегодня рассматриваем оставшиеся 4.
6. Получаем 10 последних ошибок журнала событий
7. Сбрасываем контроль доступа к папке
8. Вычисляем время работы сервера (uptime)
9. Получаем информацию о Service Pack
Оригинал статьи здесь. Заинтересованных приглашаем под кат.
6. Получаем 10 последних ошибок журнала событий
Каждое утро, вы возможно просматриваете журналы событий в поисках 10 последних ошибок в системном журнале событий на одном или нескольких компьютерах. Упростить эту задачу можно с помощью командлета Get-EventLog.
Нужно уточнить имя журнала событий и тип записи. Типичная команда для конкретной задачи выглядит так:
![image](https://habrastorage.org/getpro/habr/post_images/13f/ac0/79e/13fac079ecf89523e8ec3a877869224a.png)
В нашем случае взят журнал событий ‘system’ и тип записи ‘Error”. Если мы не уточняем имя компьютера, информация собирается с локальной машины.
Обратите внимание на сообщения (Колонка Message), которые выведены не полностью. Давайте немного изменим команду, что бы мы могли их видеть полностью.
![image](https://habrastorage.org/getpro/habr/post_images/62f/dca/010/62fdca0103ddacd84786e25c2a6058b8.png)
Мы просто передали выход предыдущей команды в ft, сокращение для Format-Table и задали отображения для таблицы следующих свойств: Timewritten, Source, EventID и Message. Мы также добавили -wrap и -auto для более красивого отображения. -wrap активирует обтекание текстов, а -auto – автоматическое форматирование.
Как это выглядит:
![image](https://habrastorage.org/getpro/habr/post_images/e50/f95/ad7/e50f95ad79997253aa581e95ee43356f.png)
Создадим еще один вариант данной команды. Она сортирует свойства по Source и затем осуществляет их группировку. Вывод передается в more для отображения только того, что помещается на экран.
![image](https://habrastorage.org/getpro/habr/post_images/365/bd9/880/365bd9880d207b0970ca6935bfc75d43.png)
Пример:
![image](https://habrastorage.org/getpro/habr/post_images/4dd/cc5/dd1/4ddcc5dd1bb84930a5cf92fb64f19ad7.png)
Обратите внимание, что элементы сгруппированы по источнику. Сначала идет EventLog, затем Microsoft-Windows-GroupPolicy. — More – указывает на завершения отображения, необходимо нажать любую клавишу для того, чтобы посмотреть дополнительную информацию.
Все эти Get-EventLog команды, которые были продемонстрировали, запущены на локальном компьютере. Теперь покажем, как это сделать на удаленной машине.
Например, мне необходимо посмотреть 5 последний ошибок на контроллерах домена в офисе в Чикаго (имена компьютеров chi-dc01 и chi-dc02). Предположим, что мне необходимо отсортировать и сгруппировать результаты по Machine Name. Я также хотел бы отобразить следующие свойства Timewritten, Source, EventID и Message. И снова добавляю -wrap, -auto и more “для красоты”.
![image](https://habrastorage.org/getpro/habr/post_images/822/a1f/37b/822a1f37b4027d6df6ca664a488fb218.png)
Получаем на выходе.
![image](https://habrastorage.org/getpro/habr/post_images/6e0/861/2f7/6e08612f7591a887c0a7ee0aadd0dfdd.png)
В предыдущем посте, рассматривая задачу №5 (получение информации по свободному месту на дисках), мы рассматривали как можно сделать HTML отчет и выложить его на Интернет сервер; то же можно сделать и с данной задаче.
7. Сброс контроля доступа к папке
Примеров, когда NTFS права на папку настроены не так, как надо, множество. Если это случается, вы, возможно, захотите, спросить контроль доступа к этой папке. Это реализуется с помощью командлета Set-Acl (Set-ACL).
Самый просто подход – использовать Get-Acl для извлечения ACL (Access Control List) из “хорошей” папки и копировать его в проблематичную папку. Произведется замена имеющегося ACL. Хотя и можно создать ACL объект с нуля, первый метод (копирование) желателен, и сейчас я продемонстрирую почему.
Предположим, что имеется на компьютере CHI-FP01 папка sales и у этой папки есть “хорошая” копия ACL. Копируем ACL и сохраняем в переменную $acl.
![image](https://habrastorage.org/getpro/habr/post_images/3be/7cb/88e/3be7cb88e18c4db2edd882ac679cf555.png)
Давайте взглянем на информацию в ACL:
![image](https://habrastorage.org/getpro/habr/post_images/d67/8cc/9ff/d678cc9ffdf134c4e87767d5903f6196.png)
Видите свойство Access справа? Фактически это другой объект. Чтобы посмотреть его содержимое, выполним команду:
![image](https://habrastorage.org/getpro/habr/post_images/2f7/14c/f93/2f714cf937ac3b4fa4fa72e957a82ea4.png)
Что внутри:
![image](https://habrastorage.org/getpro/habr/post_images/02f/28b/4f3/02f28b4f30938c245163e145aa8b5d32.png)
Как Вы видите, это записи контроля доступа. Если Вы хотите видеть только ссылки (identity references), чьи имена совпадают с “Sales”, то выполните следующую команду:
![image](https://habrastorage.org/getpro/habr/post_images/6f2/264/0be/6f22640bedeed27a0fe3d774703027f8.png)
Теперь если мы используем ту же команду, чтобы посмотреть содержимое свойства Access, принадлежащего созданной папке chicagosales, мы ничего не получим. Обратите внимание на использование сокращений:
![image](https://habrastorage.org/getpro/habr/post_images/e20/775/7e3/e207757e3a9bb7ee58c645e60af1afd5.png)
Одной из возможных причин, почему значения не выводятся, может быть некорректная выдача NTFS прав.
Очевидно, что решение этой проблемы – копировать “хороший” ACL в “плохой”. Но для начала нужно получить текущие NTFS права папки chicagosales и сохранить в XML файл. Это необходимо для восстановления ACL, если вдруг что-то пойдет не так (импортируем XML файл).
![image](https://habrastorage.org/getpro/habr/post_images/24d/149/7f9/24d1497f9ada3ecdeeeb2513a77a15b8.png)
После того, как это сделано, запускаем команду Set-Acl для chicagosales, используя $acl, скопированную из хорошей папки.
![image](https://habrastorage.org/getpro/habr/post_images/48d/0de/c60/48d0dec60acbc119f6bb65e24d3d7ca5.png)
Проверим, успешно ли осуществлена процедура: Используем ту же команду, которую мы использовали ранее для отображения ссылок на тех, чьи имена совпадают с “Sales”.
![image](https://habrastorage.org/getpro/habr/post_images/dcb/852/f78/dcb852f781a1c708eb212a0e316cb5f6.png)
Теперь chicagosales NTFS разрешения те же, что и для папки sales. Таким образом, у вас есть простой способ управления разрешениями, позволяющий оперативно разрешить проблемы контроля доступа.
8. Получение информации о времени работы сервера (uptime)
Вашем руководству возможно будет интересно регулярно получать информацию о времени работы сервера. Используем для этого WMI класс Win32_OperatingSystem. Он выведет время работы. Возможен локальный и удаленный запуск команды. Свойство, которое нас интересует, LastBootUpTime. Но так как оно отображается в WMI формате, нам нужно будет конвертировать в более приемлемый формат.
Начнем с примера запуска локально под Windows 7.
Сначала сохраним результаты GetWmiObject в переменную $wmi.
![image](https://habrastorage.org/getpro/habr/post_images/0ef/279/00d/0ef27900d73fb1c35a07c287332ab502.png)
В $wmi присутствует несколько свойств, с которыми мы будем работать, а именно CSName (имя компьютера) и LastBootUpTime.
![image](https://habrastorage.org/getpro/habr/post_images/16e/6d8/162/16e6d81622d21746b19f82790c94d9de.png)
LastBootUpTime отображается WMI формате, поэтому его нужно отконвертировать. Сохраним отконвертированное значение в переменную $boot.
![image](https://habrastorage.org/getpro/habr/post_images/582/4fe/2db/5824fe2dbe799e25076eac313fbc10be.png)
Мы используем метод ConverToDateTime, который включен во все WMI объекты, которые вы получаете, когда запускаете GetWmiObject. Параметр, который вы передаете в этот метод — свойство LastBootUpTime WMI объекта $wmi.
Запросив информацию о $boot, вы получите следующее, что гораздо нагляднее предыдущего варианта LastBootUpTime:
![image](https://habrastorage.org/getpro/habr/post_images/996/7b0/c0b/9967b0c0bf1d9ad94592030059fb1a4f.png)
Для определения времени работы машины, вычитываем $boot из текущих даты/времени, которые могут быть получены с помощью Get-Date.
![image](https://habrastorage.org/getpro/habr/post_images/74e/98f/b29/74e98fb2900bbdfbcead13ac8392d3d2.png)
Результат выводится как TimeSpan объект. Отконвертируем его в строку для более наглядного представления с помощью ToString().
![image](https://habrastorage.org/getpro/habr/post_images/d3e/c04/e60/d3ec04e601faec0794a51f1687996a5e.png)
Мы видим, что машина была запущена 2 дня 5 часов 46 минут и т.д.
А теперь все, что мы рассмотрели, запишем в виде функции под названием get-boot. Сначала посмотрим на нее полностью.
![image](https://habrastorage.org/getpro/habr/post_images/f71/cec/ba6/f71cecba67689eaf6a4f86b01dba1f6c.png)
У функции есть параметр, который берет имя компьютера и делает его именем локального компьютера по умолчанию.
![image](https://habrastorage.org/getpro/habr/post_images/d53/c8c/470/d53c8c470b0d9ac04760483cc2ad3195.png)
Затем мы используем фрагмент скрипта Process, где свойство “имя компьютера” передается в функцию. “$_” указывает, что имя компьютера задается как переменная. В противном случае имя компьютера как будет воспринято как параметр.
![image](https://habrastorage.org/getpro/habr/post_images/188/e57/bc5/188e57bc5d1fc4a5122a897eec6aa225.png)
Включенное в фрагмент скрипта Process выражение GetWmiObject уточняет имя удаленного компьютера.
![image](https://habrastorage.org/getpro/habr/post_images/c38/101/173/c3810117316da917e36afc9b3efd7a4d.png)
Здесь также будет несколько хеш-таблиц. Свойство CSName поменяем на Computername, так мы сможем получить более наглядное отображение. Свойство LastBoot представляет собой значение LastBootUpTime, отконвертированное с использование метода ConvertToDateTime(). И еще есть свойство Uptime, которое представляет собой TimeSpan объект, показывающий, как долго машина была запущена.
![image](https://habrastorage.org/getpro/habr/post_images/529/d43/27d/529d4327df02bf83108758bf42e016df.png)
Если мы запускаем скрипт локально (например, нам не нужно уточнять имя компьютера), функция по умолчанию берет имя локального компьютера. Вот что получится на выходе:
![image](https://habrastorage.org/getpro/habr/post_images/cae/a07/ecb/caea07ecbd56c17c7ee8f60bf1e1f177.png)
Как в случае с задачей 2 предыдущего поста (“Перезагрузка или выключение сервера”), Вы можете сохранить имена серверов в текстовый файл, обрабатывать те, которые пингуются и передавать их имена в функцию get-boot.
![image](https://habrastorage.org/getpro/habr/post_images/224/0f1/eac/2240f1eac7a1bf0aa58a7c43e148b710.png)
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](https://habrastorage.org/getpro/habr/post_images/732/070/b01/732070b01f2d35a8158d04528f7d83e0.png)
Как мы видим эта машина под Windows 7 не использует ни один SP, поэтому ServicePackMajorVersion равно 0, а CSDVersion пусто.
Создадим функцию Get-SP. В качестве параметра возьмем имя компьютера, по умолчанию совпадающее с именем локального компьютера.
![image](https://habrastorage.org/getpro/habr/post_images/068/afa/823/068afa823fa3f92505e7eb4a27ba723a.png)
И снова мы используем блок скрипта Process. Так что если имя компьютера передается, переменная $computername будет установлена в качестве передаваемого объекта. Основная часть функции – выражение класса Get-Wmiobject/Win32_operatingsystem.
Как и прежде, создадим пару хеш-таблиц. CSName переведем в ComputerName. Вместо свойства Caption используем Operating System. А вместо CSDVersion — SPName. Наконец, вместо ServicePackMajorVersion используем просто Version.
![image](https://habrastorage.org/getpro/habr/post_images/9b8/82c/b41/9b882cb41167458604df3d33df1b2bfd.png)
Вот пример функции, запущенной локально:
![image](https://habrastorage.org/getpro/habr/post_images/118/c33/170/118c33170af3ee7bf8544a4e24658f70.png)
Теперь можно взять компьютеры из текстового файла, пропинговать их и передать их имена в созданную функцию get-sp. Результат:
![image](https://habrastorage.org/getpro/habr/post_images/5eb/634/298/5eb634298c295e72fcb10c06d8add4f7.png)
Можно видеть, что у CHI-DC02 отсутствует Service Pack 1, который только недавно был выпущен для Server 2008 R2. А это дает основания задуматься об обновлении Service Pack на этом компьютере.
Upd:
В посте приведен перевод статьи с портала petri.co.il
Top 10 Server 2008 Tasks done with PowerShell – Part 2