PowerShell ver2について～ついにWindowsサーバー管理環境の主流へ～むたぐち（牟田口大介）

わんくま同盟 大阪勉強会 #30

牟田口大介の自己紹介• フリーライターおよびフリープログラマー– 2006～ チェック式 WSH入門（@IT）– 2008 Windows PowerShell ポケットリファレンス（技術評論社）– 2009 PowerShellサーバー管理書籍（共著）7月
発売予定–他• Microsoft MVP for PowerShell• http://winscript.jp/
わんくま同盟 大阪勉強会 #30

従来のWindows Server管理手法(GUI)• マウスでクリックしてキーボードで入力が基本
わんくま同盟 大阪勉強会 #30

従来のWindows Server管理手法（CUI,スクリプト）• コマンドプロンプト– CUIのシェル。コンソールにコマンドをキーボードから入力して動作を実行。cmd.exe• バッチファイル– コマンドプロンプトに入力することをあらかじめテキストファイルに書いておき一括実行。*.bat• WSH– VBScriptやJScriptを使ってテキストファイルにスクリプトを記述。*.vbsなど
わんくま同盟 大阪勉強会 #30

従来のWindows Server管理手法の問題点
•

•

GUI
– 繰り返し処理を行うには、何度もクリックやキー入力を手作業で繰り返す必要がある
CUI・スクリプト– コマンドプロンプト・バッチファイル• コマンドの種類が多様化、オプションもまちまちで分かりにくい• テキストベースなのでコマンドの連携が困難• 構文が貧弱なので複雑なことができない– WSH• 対話的な実行ができない（シェルとしての機能がない）• 単純なことをやるだけでもコード量が長くなる– 両者に共通の問題• セキュアではない、リモート実行が困難、開発環境が標準機能としてないetc

わんくま同盟 大阪勉強会 #30

PowerShell v1の登場• 2006年にリリース• コマンドプロンプトやUNIXシェルのような対話的コンソール、バッチファイルやWSHスクリプト、UNIXシェルスクリプトのような強力なスクリプト実行環境を併せ持つ、Windowsとしては初めての本格的コマンドラインシェルである。
• .NET Framework 2.0をベースに動く• Server 2003/XP/Vista用がDL可能– 数ヶ月前からWindows Updateでもオプションで入るようになりました• Server 2008では標準搭載（Server Coreでは使用不可）– サーバーマネージャの機能の追加• Exchange Server 2007などサーバー製品群に同梱• ただし特に国内での注目度は低かった（と思う）
わんくま同盟 大阪勉強会 #30

そしてPowerShell v2の登場• 2009年中に2008,2003,XP,Vista用がRTM予定• 現在はCTP3がDL可能• Windows Server 2008 R2 / Windows 7の標
準機能に• Windows Server 2008 R2 Server Coreでも使用可能に• さまざまな新機能
わんくま同盟 大阪勉強会 #30

PowerShell v2のインストール• v1と共存できないのでまずはアンインストール• .NET Framework 2.0以上をインストール– ISEとグリッドを使うなら3.5 sp1をインストール• バックグラウンドジョブとリモート機能を使うにはWinRM2.0をインストール（現在CTP3）• PowerShell ver.2をインストール（現在CTP3）• Win 2008 R2 RC, Win 7 RCでは特にインストール作業必要なし
わんくま同盟 大阪勉強会 #30

統一化されたコマンド～コマンドレット～• ネーミング規約– Verb-Noun• パラメータ– -【パラメータ名】 or -【パラメータ名】 【パラメータ】• 出力形式– 表、リスト、幅広い表、グリッドnew!
• 資源へのアクセス方法– ファイルシステム、レジストリ、環境変数などを統一的に扱える• エイリアス– コマンドプロンプト風味、UNIXシェル風味、動詞名詞の頭文字

わんくま同盟 大阪勉強会 #30

強力なスクリプト実行環境• オブジェクトベース• GUIによる開発環境(PowerShell ISE)new!
• モジュールの使用new!
• リモート処理およびバックグラウンド処理new!
• イベンティングnew!
• セキュリティ• 機能拡張（PSスナップイン、国際化new! 、Advanced
Functions new!）• 豊富なコマンドラインオプション -windowStyle -file -staetc• プロファイル
わんくま同盟 大阪勉強会 #30

PowerShell v2およびISEの動作デモ•DEMO
わんくま同盟 大阪勉強会 #30

セキュリティ• デフォルトではスクリプトの実行が不許可– Set-ExecutionPolicy RemoteSignedなどで有効化– Set-AutheticodeSignatureでコード署名を入れられる• スクリプトファイルをタブルクリックするだけでは実行されない• カレントディレクトリにあるスクリプトを単純実行できない– .¥script.ps1• 特定のexe,コマンドレットのみ実行new!
– $ExecutionContext.SessionStateの各プロパティ
わんくま同盟 大阪勉強会 #30

モジュール• 関数などをモジュール化可能new!
• *.psm1ファイル• C:¥Windows¥System32¥WindowsPowerShell¥v1.0¥Modules¥Mymodule¥MyModule.psm1function Get-AllItem{Get-ChildItem -recurse}
Export-ModuleMember Get-AllItem• Import-Module MyModule
わんくま同盟 大阪勉強会 #30

イベンティング

• .NETオブジェクトのイベントを補足することが可能new!
$timer = New-Object Timers.Timer$timer.Interval = 10000
Register-ObjectEvent -inputObject $timer eventName Elapsed -sourceIdentifier Test -Action{イベント発生時に実行するコード}$timer.Enabled = $true
Unregister-Event *• WMIのイベント補足はRegister-WmiEvent
わんくま同盟 大阪勉強会 #30

Advanced Functions••

旧称Script Cmdlets。PowerShellスクリプトを用いてコマンドレット（のようなもの）を作成可能new!
1ファイル1コマンドレットの場合：param( [Parameter(Position=0,Mandatory=$true,ValueFromPipeline=$true)][Int]$Value )process { return [math]::pow($Value,2) }• .¥Get-Square.ps1 -Value 5 や 1,2,3|.¥Get-Square のように呼ぶ。

•

関数として書く場合（プロファイルなどに記述）:
function Get-Square{[CmdletBinding()]
param([Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)][Int]$Value )process {return [math]::pow($Value,2)}}•

ヘルプトピックスを含められる

わんくま同盟 大阪勉強会 #30

リモート処理/バックグラウンド処理• WinRM2.0を用いたリモート処理およびバックグラウンド処理が可能new!
• ローカルバックグラウンド（非同期）処理– 処理の実行：Start-Job {＜実行する命令文＞}– 結果の取得：Receive-Job ＜Get-Jobで得られたジョブID＞• リモート処理– 実行先のサーバー上でwinrm quickconfig を実行しておく– 同期実行：Invoke-Command @(サーバー名1,サーバー名2,サーバー名3) {＜実行する命令文＞}– 非同期実行：Invoke-Command サーバー名1 {＜実行する命令文＞} -asJob– 非同期実行空間の作成: New-Pssession サーバー名1– 実行空間での実行：Invoke-Command {＜実行する命令文＞} -Session(Get-PSSession -Id ＜Get-PSSessionで得られるセッションID＞)– ファンイン（リモートのPSを直接操作）：Enter-PSSession –Id 1• プロンプトが変化：[win-3d9dezlgcmt]: PS C:¥Users¥Administrator.TEST>

わんくま同盟 大阪勉強会 #30

リモート実行のデモ•DEMO
わんくま同盟 大阪勉強会 #30

v1→v2の文法の拡張• try～catch～finally• マルチラインコメント <#～#>• クロージャ $closure = {…}.GetNewClosure()• サブ式の省略– $result = $( if ($true) { 42 } )– $result = if ($true) { 42 }– $sequence = foreach ($i in 0..15) { [math]::pow(2, $i) }• 新しい演算子-splitと-join

わんくま同盟 大阪勉強会 #30

v1→v2 コマンドレットの追加と機能拡張• 新しいコマンドレット(129個→236個)– Add-Type: classの代わり– *-Computer, *-EventLog, *-PSSession/InvokeCommand, *-Job, *-Event, *-Transaction, etc• 既存のコマンドレットの機能拡張– Select-String: -Encoding, -NotMatch, AllMatchesパラメータ追加– Get-Member: -Viewパラメータ追加（PS拡張メン
バのみ表示など）
わんくま同盟 大阪勉強会 #30

まとめ• これからのWindows Serverおよびサーバー
製品群はPowerShellベースの管理になります。GUIもPowerShellを裏で動かすようになります。
• そのためPowerShellを覚えておくとWindowsServerを楽に動かせるようになります。
• サーバーだけでなくクライアントで使うのもよいです。クライアントで開発、サーバーでリモート実行というシナリオも。
わんくま同盟 大阪勉強会 #30