Резюме: Microsoft Scripting Guy, Ed Wilson рассказывает об использовании PowerShell-модуля для аудита конфигурации серверов.
Исследуем модуль Best Practices
Сегодня я решил поиграться с модулем Best Practices на моем контроллере домена, работающем на Windows Server 2012. Для определения доступных командлетов я использовал команду Get-Command с указанием модуля Best Practices.
PS C:\> Get-Command -Module bestpractices
CommandType Name ModuleName
———— —- ———-
Cmdlet Get-BpaModel BestPractices
Cmdlet Get-BpaResult BestPractices
Cmdlet Invoke-BpaModel BestPractices
Cmdlet Set-BpaResult BestPractices
Сначала определим доступные модели
Первое, что нужно сделать – это определить доступные модели Best Practices. Это можно сделать, запустив командлет Get-BPFModel без каких-либо параметров. Он возвращает всю информацию, которую может найти.
PS C:\> Get-BpaModel
Id : Microsoft/Windows/ADRMS
Company : Microsoft Corporation
Name : RightsManagementServices
Version : 1.0
LastScanTime : Never
LastScanTimeUtcOffset :
SubModels :
Parameters :
ModelType : SingleMachine
SupportedConfiguration :
Id : Microsoft/Windows/CertificateServices
Company : Microsoft Corporation
Name : CertificateServices
Version : 1.0
LastScanTime : Never
LastScanTimeUtcOffset :
SubModels :
Parameters :
ModelType : SingleMachine
SupportedConfiguration : Win8
Для меня наибольшую ценность представляют поля ID и LastScanTime. Они так важны потому, что командлет Invoke-BPAModel требует указания ID, и кроме того я хочу знать, когда последний раз (если вообще) запускалась определенная модель.
PS C:\> Get-BpaModel | select id, lastscantime
Id LastScanTime
— ————
Microsoft/Windows/ADRMS Never
Microsoft/Windows/CertificateServices Never
Microsoft/Windows/DHCPServer Never
Microsoft/Windows/DirectoryServices 11/18/2012 11:57:12 AM
Microsoft/Windows/DNSServer Never
Microsoft/Windows/FileServices Never
Microsoft/Windows/Hyper-V Never
Microsoft/Windows/LightweightDirectoryS… Never
Microsoft/Windows/NPAS Never
Microsoft/Windows/RemoteAccessServer Never
Microsoft/Windows/TerminalServices Never
Microsoft/Windows/UpdateServices Never
Microsoft/Windows/VolumeActivation Never
Microsoft/Windows/WebServer Never
Чтобы сконцентрироваться на какой-то одной модели, используете ее ID из вывода выше. Чтобы избежать долгого ввода, я воспользовался буфером обмена. Как видно из примера ниже, командлет Invoke-BPAModel не поддерживает использование символов подстановки.
PS C:\> Invoke-BpaModel -Id *dir*
Invoke-BpaModel: There has been a Best Practice Analyzer error for Model Id ‘*dir*’. The Model is not installed.
At line:1 char:1
+ Invoke-BpaModel -Id *dir*
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (:) [Invoke-BpaModel], CommandLetException
+ FullyQualifiedErrorId : ModelNotFound,Microsoft.BestPractices.Cmdlets.RunScan Command
Итак, я воспользовался буфером обмена для указания ID BPA-модели Directory Services в командлете Invoke-BPAModel.
PS C:\> Invoke-BpaModel -Id Microsoft/Windows/DirectoryServices
ModelId : Microsoft/Windows/DirectoryServices
SubModelId :
Success : True
ScanTime : 11/18/2012 12:28:33 PM
ScanTimeUtcOffset : -05:00:00
Detail : {DC1, DC1}
Получаем данные из Анализатора соответствия рекомендациям (Best Practices Analyzer)
Для получения результатов после запуска командлета Invoke-BPAModel нужно воспользоваться командой Get-BPAResults.
Get-BpaResult -Id Microsoft/Windows/DirectoryServices
Получаемая информация довольно обширная, и если ее не фильтровать, она может выходить страница за страницей. Это потому, что командлет предоставляет множество информации о каждой проверке. Результаты команды и два первых теста приведены на рисунке.
Ну, я может и не эксперт по анализатору соответствия рекомендациям, но я знаю PowerShell. И я могу привести вывод в более читаемый вид. Для начала я передам результаты командлету Group-Object и отсортирую по количеству. Таким образом я получу общее представление об результатых проверки.
PS C:\> Get-BpaResult -Id Microsoft/Windows/DirectoryServices | group severity -NoElement | sort count
Count Name
—— —-
1 Error
8 Warning
34 Information
Все не так уж и плохо. Пожалуй, сначала я посмотрю на ошибки. Я отфильтрую их посредством командлета Where-Object. Так как я работаю на Windows Server 2012, я использую Windows PowerShell 3.0 и могу воспользоваться новым синтаксисом этой команды.
Get-BpaResult -Id Microsoft/Windows/DirectoryServices | where severity -eq error
Вывод даже для одной этой ошибки представляет из себя довольно большое количество текста. Он представлен на следующем рисунке.
После просмотра его содержимого, я пришел к выводу, что больше всего меня интересуют поля Title, Impact и Resolution. Исправленный вывод приведен на рисунке.
Из результатов прошлой команды, в которой я группировал результаты по полю severity, я знаю, что кроме ошибки у меня есть еще 8 предупреждений (warning). Теперь я хочу просмотреть их. Я нажимаю кнопку со стрелкой вверх и заменяю слово error на warning.
Get-BpaResult -Id Microsoft/Windows/DirectoryServices | where severity -eq warning | fl title, impact, Resolution
Было бы неплохо так же распределить результаты по категориям. Следующая команда показывает, что большая часть предупреждений относится к конфигурации.
PS C:\> Get-BpaResult -Id Microsoft/Windows/DirectoryServices | group category -NoElement
Count Name
—— —-
42 Configuration
1 Operation
Если меня заинтересует, что относится к категории operation, я воспользуюсь следующей командой.
Get-BpaResult -Id Microsoft/Windows/DirectoryServices | where category -eq ‘operation’
Для беглого ознакомления с существующими предупреждениями я воспользуюсь следующей командой.
Get-BpaResult -Id Microsoft/Windows/DirectoryServices | where severity -eq warning | fl title
Команда и ее результаты приведены на рисунке.
Похоже, что большинство предупреждений из за того, что у меня не сконфигурировано резервное копирование. Отфильтруем события, относящиеся к резервному копированию и посмотрим, что останется.
PS C:\> Get-BpaResult -Id Microsoft/Windows/DirectoryServices | ? { $_.title -notmatch ‘backed up’ -AND $_.severity -eq ‘warning’} | select title
Title
——
All domains should have at least two domain controllers for redundancy
All OUs in this domain should be protected from accidental deletion
The domain controller dc1.nwtraders.msft should comply with the recommended best …
Естественно это не вся информация по работе с модулем Best Practices. Кроме того, вы можете загрузить дополнительные модули для анализатора соответствия рекомендациям. Но на сегодня все.
Автор:
Ed Wilson, Microsoft Scripting Guy
Оригинал:
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell