Перейти на главную страничку сайта (список статей, файлы для скачивания)
В то время как 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 } } # дальнейший текст скрипта...
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 При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.