Windows PowerShell


              Илья Бреев

                 Синтек
Что это такое?
 Оболочка командной
       строки


   Язык сценариев


 Среда разработки на
основе .NET Framework
Что оно может?
• Всевозможные рутинные операции
• Общие задачи администрирования
• Управление любыми типами хранилищ
  привычными методами
• Управление службами и процессами
• Работа с объектами прямо в командной
  строке
Немного истории…



Monad    1.0                 2.0          3.0
2003     2006               2009          2012




           А теперь обо всем по порядку
Команды и командлеты
        • встроенные в оболочку
        • специальные .NET классы
        • отдельные задачи – отдельные процессы
        • можно создавать собственные
        • … но уже есть ~200 стандартных
        • формат глагол-существительное
        • «Используй объекты, Люк!»


          Get-Command Write-*

          Set-ExecutionPolicy

          Write-Host
Конвейер
                 Get-Item * | Where { $_.PSIsContainer }




или даже так…
                ls | foreach { $_.GetType().FullName}
Функции

function TopBots {
     Write-Host "Top 5 bots:"
     & $parser -stats:OFF -q:ON
"SELECT TOP 5
   SUBSTR(cs(User-Agent), 0, 100) AS user_agent,
   COUNT(*) AS cnt
 FROM $log
 WHERE user_agent LIKE '%bot%' OR
        user_agent LIKE '%spider%'
 GROUP BY user_agent
 ORDER BY cnt DESC"
}
Скрипты
Можно легко передавать параметры, делая их обязательными:

param([string] $parser=$(throw “I need my parser”),
      [string] $log=$(throw “I need my log”)
)

Файлы скриптов *.ps1 интерпретируются вызовом powershell.exe
        … в том числе, из самого powershell

& powershell.exe myscript.ps1
Рутинные задачи
Еще немного рутины…
Я СДЕЛАЮ ЭТО
     на bash
в 2 раза быстрее!
А как насчет…
                    Транзакции
                  (все или ничего)

                   Start-PSTransaction

New-ItemProperty –path HKCU:Test –name Name –value “Test”
                       –useTransaction

       Get-ItemProperty HKCU:Test –useTransaction

                  Complete-PSTransaction
События
   Использование привычной событийной
             модели в скриптах!

$timer = New-Object System.Timers.Timer
$timer.Interval = 3000
$timer.Enabled = true
Register-ObjectEvent $timer “Elapsed”
  -SourceIdentifier “Timer.Elapsed” –Action
{
  Write-Host Elapsed!
  Unregister-PsEvent “Timer.Elapsed”
}
Try-Catch-Finally
$wc = New-Object System.Net.WebClient
$urls = “http://getdev.net”, “http://sintek.biz”
foreach ($url in $urls)
{
  try
  {
      $url
      $result = $wc.DownloadString($url)
  }
  catch [System.Net.WebException]
  {
      $_.Exception.ToString()
  }
}
Отладка скриптов
function Test-Cmdlet
{
  Write-Host “Test!” }
}

Set-PSBreakpoint –command Test-Cmdlet
Test-Cmdlet

А также… Disable-PsBreakpoint, Get-PsBreakpoint,
   Remove-PsBreakpoint, Set-PsDebug, Set-Strictmode,
   Write-Debug, Write-Verbose, Enable-PsBreakpoint,
   Get-PsCallStack
Фоновые задачи
$j = Start-Job -scriptblock { Get-Process }
$result = Receive-Job -Job $j
$result

Продолжаем решать насущные задачи в том же сеансе, сбросив что-то
  тяжелое в фон

Get-Job    - можем быстро посмотреть список фоновых задач

Receive-Job –Id 1 – или посмотреть результаты по Id задачи
Собственная ISE
Integrated Scripting Environment
Общий вид               Возможности



                •   Подсветка синтаксиса
                •   Отладка
                •   Консоль
                •   Несколько лэйаутов
                •   Удаленный Shell
И это всё Powershell 2.0…

       А как же 3.0?
3.0
•   Улучшение синтаксиса
•   2000+ стандартных командлетов
•   Запланированные задания
•   Вечноживые сессии
•   Работа через веб
•   Делегирование
Как упростился синтаксис?
                Стало
   Get-Process | Where PM –gt 100MB
      Get-Process | Foreach Name
                 Было
Get-Process | Where { $_.PM –gt 100MB }
   Get-Process | Foreach { $_.Name }
Работа с планировщиком!
$trigger = New-JobTrigger –Daily –At 3am
Register-ScheduledJob –Name MyJob –Trigger $trigger
  –ScriptBlock
{
…
}
Покажите мне что-нибудь
       вкусное!
Это все было как-то неинтересно
Обычный Out-GridView
А кнопки Ok и Cancel предназначены для перенаправления
отфильтрованной таблицы дальше по пайпу!
Нет, правда. Удивите меня!

  Демонстрация экзотического
     скрипта на Powershell
Выглядит красиво
А как мне пользоваться моим скриптом?
Раньше исполнять скрипт было просто:

$ cat > script.sh << “EOF”
#!/bin/bash
echo Hello from my script
EOF
$ cmhod u+x script.sh
$ ./script.sh
А теперь?
Достаточно вызвать

> powershell.exe script.ps1


• На целевой для скрипта машине должна быть выставлена
  соответствующая политика исполнения скриптов
• При определенных условиях скрипт должен обладать
  цифровой подписью и издатель сертификата должен
  находиться в списке доверенных
Политики исполнения
> Get-ExecutionPolicy
> Set-ExecutionPolicy

• Restricted - политика по умолчанию – нельзя выполнять
  скрипты
• AllSigned – все скрипты должны быть подписаны
• RemoteSigned – скрипты, загруженные из сети, должны быть
  подписаны
• Unrestricted – можно выполнять любые скрипты
• Bypass - Ничего не блокируется, и никакие предупреждения и
  запросы не появляются
• Undefined - если политика выполнения во всех областях имеет
  значение Undefined, действует политика выполнения
  Restricted.
Alternate Data Streams
• Метаданные, связанные с объектом
  файловой системы NTFS
• Используются AES (Attachment Execution
  Service) для сохранения данных об
  источнике загруженного файла
Полезные ссылки
• http://technet.microsoft.com/ru-ru/library/bb978526.aspx
  Windows Powershell на Technet
• http://blogs.msdn.com/b/powershell/ Блог разработчиков
  Powershell
• http://alexwhite.ru/wp-content/uploads/2011/06/posh.pdf
  Книга «Эффективное программирование в Windows
  Powershell»
• http://habrahabr.ru/post/137884/ Пост о подписывании
  скриптов для Powershell
• https://github.com/ilyabreev/ps-script-signing-sublime2
  Репозиторий плагина к Sublime Text 2 для подписывания
  скриптов
Спасибо за внимание!



              Илья Бреев, Синтек
• Email:     ilyabreev@gmail.com
• Twitter:   @ilyabreev
• Github:    https://github.com/ilyabreev

PowerShell

  • 1.
    Windows PowerShell Илья Бреев Синтек
  • 2.
    Что это такое? Оболочка командной строки Язык сценариев Среда разработки на основе .NET Framework
  • 3.
    Что оно может? •Всевозможные рутинные операции • Общие задачи администрирования • Управление любыми типами хранилищ привычными методами • Управление службами и процессами • Работа с объектами прямо в командной строке
  • 4.
    Немного истории… Monad 1.0 2.0 3.0 2003 2006 2009 2012 А теперь обо всем по порядку
  • 5.
    Команды и командлеты • встроенные в оболочку • специальные .NET классы • отдельные задачи – отдельные процессы • можно создавать собственные • … но уже есть ~200 стандартных • формат глагол-существительное • «Используй объекты, Люк!» Get-Command Write-* Set-ExecutionPolicy Write-Host
  • 6.
    Конвейер Get-Item * | Where { $_.PSIsContainer } или даже так… ls | foreach { $_.GetType().FullName}
  • 7.
    Функции function TopBots { Write-Host "Top 5 bots:" & $parser -stats:OFF -q:ON "SELECT TOP 5 SUBSTR(cs(User-Agent), 0, 100) AS user_agent, COUNT(*) AS cnt FROM $log WHERE user_agent LIKE '%bot%' OR user_agent LIKE '%spider%' GROUP BY user_agent ORDER BY cnt DESC" }
  • 8.
    Скрипты Можно легко передаватьпараметры, делая их обязательными: param([string] $parser=$(throw “I need my parser”), [string] $log=$(throw “I need my log”) ) Файлы скриптов *.ps1 интерпретируются вызовом powershell.exe … в том числе, из самого powershell & powershell.exe myscript.ps1
  • 9.
  • 10.
  • 11.
    Я СДЕЛАЮ ЭТО на bash в 2 раза быстрее!
  • 12.
    А как насчет… Транзакции (все или ничего) Start-PSTransaction New-ItemProperty –path HKCU:Test –name Name –value “Test” –useTransaction Get-ItemProperty HKCU:Test –useTransaction Complete-PSTransaction
  • 13.
    События Использование привычной событийной модели в скриптах! $timer = New-Object System.Timers.Timer $timer.Interval = 3000 $timer.Enabled = true Register-ObjectEvent $timer “Elapsed” -SourceIdentifier “Timer.Elapsed” –Action { Write-Host Elapsed! Unregister-PsEvent “Timer.Elapsed” }
  • 14.
    Try-Catch-Finally $wc = New-ObjectSystem.Net.WebClient $urls = “http://getdev.net”, “http://sintek.biz” foreach ($url in $urls) { try { $url $result = $wc.DownloadString($url) } catch [System.Net.WebException] { $_.Exception.ToString() } }
  • 15.
    Отладка скриптов function Test-Cmdlet { Write-Host “Test!” } } Set-PSBreakpoint –command Test-Cmdlet Test-Cmdlet А также… Disable-PsBreakpoint, Get-PsBreakpoint, Remove-PsBreakpoint, Set-PsDebug, Set-Strictmode, Write-Debug, Write-Verbose, Enable-PsBreakpoint, Get-PsCallStack
  • 16.
    Фоновые задачи $j =Start-Job -scriptblock { Get-Process } $result = Receive-Job -Job $j $result Продолжаем решать насущные задачи в том же сеансе, сбросив что-то тяжелое в фон Get-Job - можем быстро посмотреть список фоновых задач Receive-Job –Id 1 – или посмотреть результаты по Id задачи
  • 17.
    Собственная ISE Integrated ScriptingEnvironment Общий вид Возможности • Подсветка синтаксиса • Отладка • Консоль • Несколько лэйаутов • Удаленный Shell
  • 18.
    И это всёPowershell 2.0… А как же 3.0?
  • 19.
    3.0 • Улучшение синтаксиса • 2000+ стандартных командлетов • Запланированные задания • Вечноживые сессии • Работа через веб • Делегирование
  • 20.
    Как упростился синтаксис? Стало Get-Process | Where PM –gt 100MB Get-Process | Foreach Name Было Get-Process | Where { $_.PM –gt 100MB } Get-Process | Foreach { $_.Name }
  • 21.
    Работа с планировщиком! $trigger= New-JobTrigger –Daily –At 3am Register-ScheduledJob –Name MyJob –Trigger $trigger –ScriptBlock { … }
  • 22.
    Покажите мне что-нибудь вкусное! Это все было как-то неинтересно
  • 23.
    Обычный Out-GridView А кнопкиOk и Cancel предназначены для перенаправления отфильтрованной таблицы дальше по пайпу!
  • 24.
    Нет, правда. Удивитеменя! Демонстрация экзотического скрипта на Powershell
  • 25.
    Выглядит красиво А какмне пользоваться моим скриптом? Раньше исполнять скрипт было просто: $ cat > script.sh << “EOF” #!/bin/bash echo Hello from my script EOF $ cmhod u+x script.sh $ ./script.sh
  • 26.
    А теперь? Достаточно вызвать >powershell.exe script.ps1 • На целевой для скрипта машине должна быть выставлена соответствующая политика исполнения скриптов • При определенных условиях скрипт должен обладать цифровой подписью и издатель сертификата должен находиться в списке доверенных
  • 27.
    Политики исполнения > Get-ExecutionPolicy >Set-ExecutionPolicy • Restricted - политика по умолчанию – нельзя выполнять скрипты • AllSigned – все скрипты должны быть подписаны • RemoteSigned – скрипты, загруженные из сети, должны быть подписаны • Unrestricted – можно выполнять любые скрипты • Bypass - Ничего не блокируется, и никакие предупреждения и запросы не появляются • Undefined - если политика выполнения во всех областях имеет значение Undefined, действует политика выполнения Restricted.
  • 28.
    Alternate Data Streams •Метаданные, связанные с объектом файловой системы NTFS • Используются AES (Attachment Execution Service) для сохранения данных об источнике загруженного файла
  • 29.
    Полезные ссылки • http://technet.microsoft.com/ru-ru/library/bb978526.aspx Windows Powershell на Technet • http://blogs.msdn.com/b/powershell/ Блог разработчиков Powershell • http://alexwhite.ru/wp-content/uploads/2011/06/posh.pdf Книга «Эффективное программирование в Windows Powershell» • http://habrahabr.ru/post/137884/ Пост о подписывании скриптов для Powershell • https://github.com/ilyabreev/ps-script-signing-sublime2 Репозиторий плагина к Sublime Text 2 для подписывания скриптов
  • 30.
    Спасибо за внимание! Илья Бреев, Синтек • Email: ilyabreev@gmail.com • Twitter: @ilyabreev • Github: https://github.com/ilyabreev