Главная страница
Навигация по странице:

  • 2. Теоретические сведения

  • Win32_QuickFixEngineering

  • Управление сервисами

  • -RequiredServices и -DependentServices

  • -ComputerName

  • Управление процессами

  • Get-Process, Start-Process, Stop-Process

  • Win32_Process.Create

  • Responding

  • 7. Библиографический список

  • МУ_ЛР_БОС. А. С. Новиковым и обсуждены на заседании кафедры


    Скачать 1.1 Mb.
    НазваниеА. С. Новиковым и обсуждены на заседании кафедры
    Дата15.03.2022
    Размер1.1 Mb.
    Формат файлаdoc
    Имя файлаМУ_ЛР_БОС.doc
    ТипЛабораторная работа
    #396953
    страница15 из 17
    1   ...   9   10   11   12   13   14   15   16   17

    Лабораторная работа № 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 – русский



    Где это может пригодится?

    1. При состравлении отчета по имеющимся рабочим местам (ОС, язык и пр).

    2. Сбор данных по объему установленной памяти (какие плашки памяти установлены вы не увидите, но объем получить можно)

    3. Куда установлена ОСь (особенно полезно, когда вам в наследство достался зоопарк).

    Получение данных об установленных приложениях и заплатках


    Ни для кого не секрет что эпоха пиратских приложений, установленного левого 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-ProcessId2268

    Примечание: Для надежности используйте ключи -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с.

    1   ...   9   10   11   12   13   14   15   16   17


    написать администратору сайта