Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Работа с журналом событий, управление системными службами, использование WMI и управление разрешениями файловой системы в Windows Monad Shell

Работа с журналом событий (Event Log)

В то время как eventvwr.exe позволяет администратору просматривать, сортировать и фильтровать события через графический интерфейс, MSH обеспечивает команд-лет get-eventlog. Структура файла регистрации событий расширяема, и это означает, что приложения и дополнительные компоненты операционной системы могут создать собственные файлы регистрации. MSH создает MonadLog - файл регистрации событий, используемый для того, чтобы зафиксировать запуск, завершение и другие важные события, связанные с оболочкой.

Поскольку файлы регистрации событий могут потенциально содержать много тысяч записей, удобно и эффективно ограничить число возвращаемых записей:

get-eventlog Security -newest 10

Разумеется, можно фильтровать данные и сводить результаты в таблицу. В следующем примере мы будем искать только те события, которые представляют запуск MSH и отображать в таблице время и текст сообщения:

MSH> get-eventlog MonadLog -newest 1000 |
>> where-object { $_.EventID -eq 400 } | format-table TimeGenerated,Message

Ещё один пример - получение списка ошибок:

MSH> get-eventlog System -newest 1000 |
>> where-object { $_.EntryType -eq "Error"}

Получение записей с ограничением по временному интервалу:

MSH> get-eventlog System | where-object {
>> ($_.TimeGenerated -gt "2006-1-01") -and ($_.TimeGenerated -lt "2006-1-05") }

Получение записей за последние сутки:

MSH> get-eventlog System | where-object {
>> $_.TimeGenerated -gt (get-date).AddHours(-24) }

Не забывайте, что можно использовать команд-лет get-member, чтобы обнаружить доступные поля журналов. Кроме того, команд-лет out-file позволит сохранить полученную информацию в отдельный файл (см. примеры использования этих команд-летов в предыдущих статьях).

.NET Framework позволит сделать запись в журнал (в данном случае - Application log):

MSH> [System.Diagnostics.EventLog]::WriteEntry ("ИмяСкрипта.msh", "Текст уведомления!")

Можно создать свой собственный журнал и работать с ним (он появится и в eventvwr.exe):

[System.Diagnostics.EventLog]::CreateEventSource("MyScript.msh", "LogName")

Удаление созданного журнала:

[System.Diagnostics.EventLog]::Delete("LogName")

Управление системными службами

MSH предлагает несколько команд-летов, которые дополняют существующие инструментальные средства управления и позволяют сценариям обнаруживать, опрашивать службы и управлять состоянием служб.

Команд-лет get-service, вызванный без параметров, генерирует список всех зарегистрированных служб, отображая их состояние. Удобно использовать where-object или групповые символы, чтобы уменьшить список:

get-service | where-object { $_.Status -eq "Running" }
get-service t*

Можно получить информацию о конкретной службе, например:

$sql = get-service mssqlserver
$sql | format-list

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

MSH> foreach ($dependency in $sql.ServicesDependedOn) {
>> write-host "$($dependency.Name) is $($dependency.Status)" }

Команд-лет set-service служит для изменения конфигурации службы, например, способа запуска:

set-service mssqlserver -StartupType Manual

Команд-леты start-service и stop-service служат для запуска и останова служб:

start-service mssqlserver
stop-service -Force mssqlserver

В дополнение к упомянутым команд-летам есть также команд-леты для того, чтобы перезапустить (restart-service), приостановить (suspend-service) и зарегистрировать службу (new-service).

Следующий пример проверяет состояние указанных служб, и если какая-то из них не запущена, завершает сценарий:

$requiredServices = @("mssqlserver", "SQLBrowser")
foreach ($serviceName in $requiredServices)
{
    $service = get-service $serviceName
    if ($service.Status -ne "Running")
    {
        "$serviceName not running!"
        exit
    }
}
# дальнейший текст скрипта...

Использование WMI

MSH делает доступной информацию WMI посредством команд-лета get-wmiobject, например:

get-wmiobject Win32_Processor

Для вывода можно использовать format-list:

get-wmiobject Win32_Processor | format-list Name,Description,ProcessorID

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

MSH> get-wmiobject Win32_PhysicalMemory |
>> format-table Tag,BankLabel,DeviceLocator,Capacity

WMI без проблем выходит за границы текущей машины. Команд-лет get-wmiobject принимает опцию -ComputerName, которая может использоваться, чтобы сделать запрос к WMI другой системы в местной сети. Если это объединить с маленьким foreach-циклом, можно обойти ряд компьютеров:

$machines = @("oneComputerName", "twoComputerName")
$(
    foreach ($machine in $machines)
    {
        get-wmiobject Win32_Processor -ComputerName $machine
    }
) | format-table SystemName,Name

Команда get-wmiobject -list выведет список всех доступных WMI-объектов (этот список огромен) в текущем пространстве имён. В некоторых случаях get-wmiobject по умолчанию отображает не все свойства класса. Используйте get-wmiobject ClassName | format-list *, чтобы увидеть полную информацию. В MSH WMI является хранилищем данных только для чтения.

Управление разрешениями файловой системы

MSH предлагает два команд-лета - get-acl и set-acl, которые дают возможность в сценариях обращаться к Access Control Lists (ACLs, контрольные списки доступа, т.е. списки лиц с полномочиями на доступ).

Команд-лет get-acl в качестве аргумента получает путь к файлу. Свойство Access списка доступа, который возвращается команд-летом get-acl, содержит коллекцию разрешений, связанных с файлом, включая явные и унаследованные разрешения:

$(get-acl c:\test.txt).Access

Данную коллекцию разрешений вы можете просмотреть с помощью графического интерфейса в свойствах файла: вкладка "Безопасность", кнопка "Дополнительно", вкладка "Разрешения". Просмотр коллекции разрешений и владельца файла в скрипте:

$acl = get-acl c:\test.txt
$acl.owner # владелец
$list = $acl.access
foreach ($elem in $list){
    $elem.IdentityReference # Имя объекта (например, пользователь)
    $elem.IsInherited # Этот элемент унаследован из родительского объекта (булево)
    $elem.AccessControlType # Тип элемента - разрешение или запрет (Deny или Allow)
    $elem.FileSystemRights # Флаги разрешений
    
    # Выпадающий список "Применять" в свойствах элемента, доступный для папок.
    # Возможные значения:
    # None (только эта папка), ContainerInherit (включая подпапки),
    # ObjectInherit (включая файлы)
    $elem.InheritanceFlags
    
    # Флажок "Применять эти разрешения к объектам и контейнерам
    # только внутри этого контейнера", доступный для папок.
    # Возможные значения: None (снят), NoPropagateInherit (установлен),
    # InheritOnly (выпадающий список "Применять" настроен только для
    # вложенных элементов, папок и/или файлов)
    $elem.PropagationFlags
}

Копирование разрешений:

$acl = get-acl c:\test.txt
set-acl c:\test2.txt $acl

Людоговский Александр

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.