|
МУ_ЛР_БОС. А. С. Новиковым и обсуждены на заседании кафедры
Лабораторная работа № 13. Windows PowerShell: управление компьютером
1. Цель работы
Получение практических навыков управления компьютером при помощи средства автоматизации Windows PowerShell:
− управление сеансами пользователей;
− управление питанием;
− сбор информации о системе;
− управление сервисами;
− управление процессами. 2. Теоретические сведения
Управление сеансами пользователей Ни для кого не секрет что администратору приходится часто, если не сказать регулярно, заниматься завершением сеансов пользователей. Вы скажете – настройте автоматическое завершение сеанса и забудьте об этом…
Я бы с радостью настроил, но не всегда получается договориться с теми кого «настраиваешь» и часто возникают ситуации когда «один зашел и ушел на обед», второй забыл свой пароль, третий сделал дисконнект и ушел в отпуск и многие другие.
Что можно предпринять для решения этой проблемы?
Рецепт не относится к PowerShell, но он помогает…
Открываем командную строку и вводим:
quser /SERVER:SERVER_NAME
Видим табличку с теми пользователями которые зашли на сервер SERVER_NAME. Для того что бы завершить сеанс пользователя смотрим ID нужной сессии и вводим.
logoff Session_ID /SERVER:SERVER_NAME
Второй метод заключен в использовании утилит qwinsta и rwinsta у них немного больше возможностей, вы можете с ними ознакомится указав ключ «/?», но смылс тот же.
qwinsta /server:SERVER_NAME
rwinsta Session_ID /server:SERVER_NAME
И последний инструмент о котором хочется рассказать – две команды которые по умолчанию недоступны, но после регистрации библиотеки query.dll
regsvr32 query.dll
появляется возможность использовать команды query и reset
query session /server:SERVER_NAME
reset session 4 /server:SERVER_NAME
Управление питанием Второй и немаловажный пункт – управление питанием.
Что может быть важнее чем вырубить нафиг компы сотрудников ушедших на новогодние праздники и проигнорировавших призыв к экономии электричества?
Тут нам поможет утилита shutdown.exe. Синтаксис у нее простой. Для срочной перезагрузки хоста достаточно будет указать.
shutdown /r /f /m \\HOST_NAME /t 0
Для выключения укажите.
shutdown /s /f /m \\HOST_NAME /t 0
Сбор информации о системе Основным источником информации об операционной системе служит класс Win32_OperatingSystem. Сам по себе вызов
Get-WMIObject-Class Win32_OperatingSystem
Дает немного информации, но если обратиться к этому классу запросив его участников
Get-WMIObject-Class Win32_OperatingSystem |Get-Member
То получается довольно обширный список свойств которые нам могут быть полезны. Для примера можно привести следующие
(Get-WMIObject-Class Win32_OperatingSystem).Caption # названиеоперационнойсистемы
(Get-WMIObject-Class Win32_OperatingSystem).CSDVersion # установленныйсервиспак
(Get-WMIObject-Class Win32_OperatingSystem).CSName # имякомпьютера
(Get-WMIObject-Class Win32_OperatingSystem).OSLanguage # языкоперационнойсистемы 1033 – английский, 1049 – русский
…
Где это может пригодится?
При состравлении отчета по имеющимся рабочим местам (ОС, язык и пр). Сбор данных по объему установленной памяти (какие плашки памяти установлены вы не увидите, но объем получить можно) Куда установлена ОСь (особенно полезно, когда вам в наследство достался зоопарк).
Получение данных об установленных приложениях и заплатках Ни для кого не секрет что эпоха пиратских приложений, установленного левого PhotoShop-а, одновременно установленные пять версий автокада и CorelDraw-а, уже в прошлом и нужен контроль за тем что стоит на рабочих местах. Ну или хотя бы понимание того что установлено.
Для сбора информации об установленных приложениях средствами PowerShell используется класс WMI - Win32_Product.
Результатом работы кода:
Get-WmiObject-Class Win32_Product |Sort-Object Vendor, Name |
Format-Table Vendor, Name, Version
Будет таблица содержащая сведения об установленном программном обеспечении. В случае, если потребуется получить данные об определенном пакете то потребуется несколько видоизменить запрос:
Get-WmiObject-Class Win32_Product -ComputerName . -Filter"Name=’DeviceLock’"|Format-List-Property*
Вторая головная боль это заплатки. От их своевременной установки или НЕсвоевременной установки непротестированных патчем может зависить очень многое.
Для сбора информации об установленных обновлениях используется класс WMI - Win32_QuickFixEngineering. Обращение к нему для получения списка установленных заплаток выполняется следующим образом.
Get-WmiObject-Class Win32_QuickFixEngineering -ComputerName"."
Сразу напрашивается вопрос о том, как можно найти определенную заплатку.
Ответ прост, вводим команду представленную ниже.
Get-WmiObject-Class Win32_QuickFixEngineering -ComputerName"."|where-object{$_.hotfixid -eq"KB2570791"}
Того же эффекта можно достичь используя командлет Get-HotFix.
$a = get-content servers.txt
$a | foreach { if (!(get-hotfix -id KB2570791 -computername $_))
{ add-content $_ -path Missing-KB2570791.tx}}
Для поиска определенных патчей на множестве компьютеров справедливо можно использовать следующий скрипт.
$computers = Get-Content "hostlist.txt"
$kb = "KB2570791"
foreach ($computer in $computers) {
Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName
$computer | where {$_.hotfixid -like "*$kb*" -OR $_.description –
like "*$kb*" }
}
Установка ПО WMI класс Win32_Product можно использовать для удаленной или локальной установки пакетов в формате MSI.
Примечание: В случае удаленной установки необходимо указать UNC-путь к устанавливаемому пакету.
Например, для установки пакета tools.msi, расположенного на общем сетевом ресурсе \\SERVER_NAME\Deploy\Package_01 на удаленном компьютере host-01, введите в командной строке Windows PowerShell следующую команду:
(Get-WMIObject-ComputerName"host-01"-List|Where-Object
-FilterScript{$_.Name -eq"Win32_Product"}).Install
(\\SERVER_NAME\Deploy\Package_01\tools.msi)
Или воспользоваться более производительным вариантом скрипта
([wmiclass]"\\HOST-01\root\cimv2:win32_product").Install
("\\SERVER_NAME\Deploy\Package_01\tools.msi")
Обновление ПО Для обновления приложения необходимо знать имя обновляемого приложения и путь к пакету обновления приложения. При наличии этих сведений обновление приложения осуществляется в Windows PowerShell при помощи одной команды:
(Get-WmiObject-Class Win32_Product -ComputerName . -Filter
Name=‘OldTools’").Upgrade(\\SERVER_NAME\Deploy\Package_01\OldTools.msi)
Удаление ПО Удаление пакета, установленного при помощи установщика Windows, происходит приблизительно так же, как и установка пакета. В примере выбор пакета для удаления производится на основе его имени:
(Get-WmiObject-Class Win32_Product -Filter"Name=’Devicelock’"-ComputerName".").Uninstall()
Управление сервисами
Просмотр списка служб Для просмотра служб установленных на локальном компьютере служит команда Get-Service, она используется для получения информации как по локальным так и по службам на удаленном компьютере.
# получить список всех сервисов начинающихся с SE
Get-Service-Name se*
# запросить все сервисы начинающиеся с WIN но исключить названия соответсвующие WINRM
Get-Service-Name win*-exclude winrm
# запроситьнесколькосервисов
Get-Service-DisplayName"Remote Registry", Server
(Get-Service-Name bits).status
Для удобства отображения информации будет не лишним ее отсортировать
# отсортироватьсервисы s* постатусу
Get-Service s*|sort-object status
# Тожесамоетольконаоборот
Get-Service s*|sort-object status -descending
Можно использовать дополнительные ключи -RequiredServices и -DependentServices для отображения требуемых служб и зависимых служб.
Get-Service-Name LanmanWorkstation –RequiredServices
Get-Service-Name LanmanWorkstation -DependentServices
Возможна фильтрация служб по статусу
# показатьслужбывсостоянии stopped
Get-Service|Where-Object{$_.status -eq"stopped"}
# показатьслужбывсостоянии running
Get-Service|Where-Object{$_.status -eq"running"}
Для получения информации с удаленного хоста используйте ключ -ComputerName или -comp.
# запросить список служб с удаленного хоста Server01
Get-Service-ComputerName Server01
# поставитьсервис schedule напаузунахостах SRV1 и SRV2
Get-Service schedule -ComputerName SRV1, SRV2 |Set-Service-Status paused
Команда Start-Service служит для запуска сервисов.
# запускаемсерверпечати
Start-Service-Name spooler
# запускаем сервер печати с выводом информации на экран
Start-Service-Name spooler -PassThru
Команда Stop-Service служит для остановки сервисов.
# Остановить службу сервера печати
Stop-Service-Name spooler
# Выключить службу сервера печати
Stop-Service-Name spooler -Force
Примечание: По умолчанию команда Stop-Service не выводит на экран никаких данных по причине того что объекты соответствующие останавливаемым сервисам не передаются далее по конвееру)
Для того что бы оценить результат выполнения команды введите
Stop-Service-Name spooler -Force-PassThru
Команда Suspend-Service позволяет приостановить работу одной или нескольких служб.
Suspend-Service-Name spooler
Примечание: Приостановить можно только те службы, которые имеют логическое свойство CanPauseAndContinue
Что бы посмотреть список служб которые подлежат приостановке введите.
Get-Service | Where-Object {$_.CanPauseAndContinue}
Команда Restart-Service служит для перезапуска сервисов.
Restart-Service-Name spooler
Примечание: При необходимости использовать отличные от ваших имя пользователя и пароль необходимо воспользоваться командой Get-Credential.
Get-WMIObject-Class"Win32_service"-ComputerName"SRV01"-Credential(Get-Credential"DOMAIN\UserName")
Практика Типовая задача, которую можно встретить почти везде, состоит в периодическом перезапуске сервисов. Желательно с отчетом о результате выполнения и пр.
Собственно данная логика легко реализуется с помощью следующего скрипта.
# функция перезапуска сервиса
functionrestart-service{
# парамет вызова – имя сервиса
param($srvName)
# Останавливаемсервис
Stop-Service$srvName
$service=get-service$srvName
# читаемегосостояние
if($service.status -ne"Stopped"){
# если не удалось остановить сервис то отправляем сообщение
send-email($srvName+" has failed to stop, please manually stop and restart.")
Write-Host($srvName+" has failed to stop, please manually start.")
}
# Запускаемсервис
start-Service$srvname
$service=get-service$srvName
if($service.status -ne"Running"){
# если не удалось запустить сервис то отправляем сообщение
send-email ($srvName+" has failed to start, please manually start.")
Write-Host($srvName+" has failed to start, please manually start.")
}else{
Write-Host($srvName+" has started.")
}
}
# функция отправки сообщения
functionsend-email{
param($body)
# откого
$From=report@example.com
# кому
$To=admin@example.com
# тема сообщения
$Subject="Service problem on server – SRV01"
# указываемимя SMTP сервера
$SMTPServer="SMTP_HOST_NAME"
$SMTPMessage=New-Object System.Net.Mail.MailMessage $From,$To,$Subject,$Body
$SMTPClient=New-Object System.Net.Mail.SMTPClient $SMTPServer
$SMTPClient.Send($SMTPMessage)
}
# перестартовываемсервис BITS
restart-service Bits
Настройка сервисов Не буду вдаваться во все нюансы настройки и приведу только основные примеры.
Смотрим каковы имена и типы запуска сервисов
# вывести список сервисов и их режимом запуска
Get-WmiObject-Class Win32_Service |format-table Name, StartMode –autosize
# вывести только отключенные сервисы
Get-WmiObject-Class Win32_Service |Where-Object{$_.StartMode -eq‘Disabled’}
Настройка типа запуска сервиса «вручную», «автоматически», «отключено» производится следующими командами.
Set-Service service_name -StartupType Manual
Set-Service service_name -StartupType Automatic
Set-Service service_name -StartupType Disabled
Для того что бы сразу на нескольких хостах поставить сервис на паузу воспользуемся командой.
Get-Service-name Schedule -computername SRV1, SRV2 |Set-Service-Status paused
Управление процессами
За получение списка процессов в PowerShell отвечает команда Get-Process. Можно запрашивать процесс или список процессов по имени или по маске:
# Запрашиваем процесс по имени
Get-Process cmd
# или запрашиваем процесс по маске. Будут найдены процессы по маске "c*"
Get-Process c*
# Запрашиваем несколько процессов по маскам "cm*" и "po*"
Get-Process cm*, po*
Полученный результат подлежит форматированию.
# В виде таблицы т.е. его задавать не надо т.к. отображается по умолчанию.
Get-Process p*|Format-Table
# Ввидесписка
Get-Process p*|Format-List
# В "растянутом" виде
Get-Process p*|Format-Wide
Так же результат можно вывести в файл.
Get-Process p*|Format-List|Out-File D:\Script\Result.txt
На выходе команды Get-Process всегда получается объект имеющий набор стандартных свойств. Для получения их списка вводим команду.
Get-Process|Get-Member
TypeName: System.Diagnostics.Process
Name MemberType Definition
(…)
Handles AliasProperty Handles = Handlecount
Name AliasProperty Name = ProcessName
(…)
Записываем нужные нам для работы свойства. Например Name, Handles, ID, Company и прочие.
Теперь мы совершенно легко можем найти процессы у которых handlecount больше чем 500.
Get-Process|where{$_.handlecount -gt500}
Или найти все процессы от отпеределенного производителя.
Get-Process|Where{$_.company -eq"Oracle Corporation"}
Работа с процессами на удаленном компьютере почти не отличается от работы с локальными процессами, вам необходимо только указать параметр -comp или -ComputerName.
Запрос процессов на удаленном компьютере выглядит так.
# Запрашиваем список процессов по маске "svchost*"
Get-Process-comp remote-host |where{$_.name -like"svchost*"}
# Запрашиваем список процессов по маске "svchost*" или "wmiprvse*"
Get-Process-comp remote-host |where{$_.name -like"svchost*"-or$_.name -like"wmiprvse*"}
# Можно упростить ввод и воспользоваться командой
Get-Process svchost*, wmiprvse*-comp remote-host
# Или искать сразу на нескольких хостах
Get-Process svchost*, wmiprvse*-comp remote-host1, remote-host2
Второй метод запроса процессов заключается в использовании WMI класса Win32_Process.
Get-WMIObject-Class Win32_Process -ComputerName"REMOTE-HOST"|Select ProcessName, ProcessId
Команда Start-Process запускает процессы.
# Запуск экземпляра cmd.exe
Start-Process cmd.exe
# Запуск экземпляра cmd.exe от имени другого пользователя
Start-Process cmd.exe -Credential(Get-Credential)
Команда Stop-Process останавливает процесс. Для примера можно привести закрытие всех запущенных сеансов cmd.exe.
# Остановка всех найденных экземпляров cmd.exe
Get-Process cmd |Stop-Process
# то же самое что и первое
Stop-Process –Name cmd
# Остановка процесса по его ID
Stop-Process –Id2268
Примечание: Для надежности используйте ключи -WhatIf и -Confirm для получения списка предпринимаемых действий (тестирование того что будет сделано) и запроса подтверждения действия команды.
Get-Process cmd |Stop-Process –WhatIf
Get-Process cmd |Stop-Process –Confirm
Главное не пробовать сделать так:
Get-Process | Stop-Process
Информация представленная выше была, что называется поверхностной. Теперь давайте посмотрим что происходит ниже, под поверхностью.
Командлеты Get-Process, Start-Process, Stop-Process для своей работы используют .NET класс [System.Diagnostics.Process]. Он имеет несколько статичных методов которые можно посмотреть с помощью команды.
[System.Diagnostics.Process]|Get-Member-Static-MemberType method
Вызов методов из полученного списка производится по имени следующим образом.
[System.Diagnostics.Process]::StaticMethodName(<args>)
Для демонстрации можно привести следующий пример
$computer="SERVER-01"
$process=[System.Diagnostics.Process]
# запрашиваемсписокпроцессов
$process::GetProcesses($computer)
Посмотрев список полученных процессов идем дальше.
Для получения списка доступных методов вводим.
$process::GetProcessById(2008,$computer)|Get-Member-Member method
Первое что бросается в глаза это
Kill Method System.Void Kill()
Им мы и воспользуемся для завершения процесса по его ID.
$process::GetProcessById(2008,$server).Kill()
Примечание: Переменная $computer должна указывать на локальный сервер т.к. метод kill не поддерживается для работы с удаленными ПК.
Для завершения процессов на удаленных хостах поддерживается и вполне работоспособен вот такой вызов метода Terminate().
(Get-WMIObject Win32_Process -Filter"Name=’cmd.exe’"-ComputerName"REMOTEHOST").Terminate()
__GENUS : 2
__CLASS : __PARAMETERS
__SUPERCLASS :
__DYNASTY : __PARAMETERS
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ReturnValue : 0
Результаты его работы можно оценить по полученному коду завершения операции.
0 – Successful Completion. Процесс прибит успешно 2 – Access Denied. Отказано в доступе 3 – Insufficient Privilege. Не хватило прав 8 – Unknown Failure. Непонятный отбой 9 – Path Not Found. Нет такого процесса 21 – Invalid Parameter. Неверно задан параметр
Создание локальных процессов Для создания локальных процессов применяется метод Start. Синтаксис выглядит следующим образом
[System.Diagnostics.Process]::Start("notepad")
Что бы создать процесс и указать ему параметр создания необходимо выполнить команду.
[System.Diagnostics.Process]::Start("notepad","c:\Script\script01.ps1")
Создание удаленных процессов Для создания процессов на удаленных компьютерах придется воспользоваться WMI.
Создаем процесс на компьютере $computer:
([WMICLASS]"\\$computer\ROOT\CIMV2:win32_process").Create("notepad")
Примечание: из соображений безопасности Win32_Process.Create метод не может быть использован для интерактивного запуска процессов, они запускаются только в фоновом режиме.
Завершение неотвечающих процессов Для завершения «неотвечающих» процессов необходимо использовать свойство Responding объекта System.Diagnosting.Process
Get-Process|Where-Object{-not$_.Responding }|Stop-Process 3. Оборудование
Персональный компьютер с установленной операционной системой MSWindows 2000 SP4, XPSP2, Vista или 7. 4. Задание на работу
Используя Windows PowerShell выполнить последовательность действий, описанных в теоретических положениях данной лабораторной работы:
1. Реализовать управление сеансами пользователей.
2. Реализовать выключение и перезагрузку компьютера.
3. Собрать сведения о компьютере: информация об ОС, об установленном ПО и заплатках.
4. Реализовать удаление ПО.
5. Промотреть список служб, установленных на компьютере.
6. Реализовать остановку и запуск сервисов.
7. Получить список процессов в системе.
8. Запустить и остановить процессы в системе. 5. Оформление отчета
Отчет должен содержать:
название и цель работы; краткие теоретические сведения о лабораторной работе; описание последовательности действий, совершенных в ходе выполнения лабораторной работы; скриншоты, иллюстрирующие проделанную работу.
6 Контрольные вопросы
6.1. Каким образом можно управлять сеансами пользователей с использованием Windows PowerShell?
6.2. Как реализуется управление питанием с использованием Windows PowerShell?
6.3. Как получить сведения о системе с использованием Windows PowerShell?
6.4. Каким образом можно проверить, установлена ли в системе определенная заплатка, с использованием Windows PowerShell?
6.5. Как можно установить и удалить программное обеспечение с использованием Windows PowerShell?
6.6. Как можно просмотреть список служб установленных в системе, используя Windows PowerShell?
6.7. Как, используя Windows PowerShell, останавливать и запускать сервисы в ОС Windows?
6.8. Как получить список запущенных в системе процессов, используя Windows PowerShell?
6.9. Каким образом можно реализовать запуск и остановку процессов, используя Windows PowerShell? 7. Библиографический список
1. Олифер В.Г. Сетевые операционные системы: Учеб. пособие для вузов / В.Г. Олифер, Н.А. Олифер .— М.: Питер, 2003. — 544с.
2. Таненбаум Э. Современные операционные системы / Э. Таненбаум.— 2-е изд. — М.: Питер, 2006 .— 1038с.
3. Монадьеми П. Защита от хакеров в Windows XP/ П. Монадьеми, Б. Мюллер; пер. с нем. под ред. С.Н. Банникова.— М.: БИНОМ, 2005 .— 320с.
4. Немет Э. UNIX: Руководство системного администратора/ Э. Немет, Г. Снайдер, С. Сибасс, Т.Р. Хейн. 3-е изд. — М.: Питер, 2003 .— 925с.
|
|
|