Power shell の基本操作と処理の自動化 v2_20120514

7,412 views

Published on

  • Be the first to comment

Power shell の基本操作と処理の自動化 v2_20120514

  1. 1. 1 IT Pro のためのスクリプト講座 Windows PowerShell を使おう! 日本マイクロソフト株式会社 エバンジェリスト 安納 順一 Junichi Anno http://blogs.technet.com/junichia/ Facebook: junichi anno ~ 基礎からサーバー管理の自動化まで V2.0 2012.5.12 Fukuoka 版
  2. 2. 2 Agenda • PowerShell の文化的背景 • HOW TO USE “Windows PowerShell” • PowerShell 3.0 の新機能
  3. 3. 3 PowerShell の文化的背景
  4. 4. 4 Operator アプリが重過ぎ!常識で考えろ! Developer 開発者 vs インフラ担当者 新しい機能の開発 既存機能との統合や 改善 サービスの展開と 継続的で安定した サービスの提供 Development Integration Deployment Delivery your machine! your code! 情報が欲しかったら 監視方法を詳しく教えろ! バグがあるから直してくれ! マシンスペックとか知らねーし 監視もできねーのかよww 直してほしかったら 詳しい情報をよこせ!
  5. 5. 5 DevOps(=Development and Operations) 開発サイドと運用サイドの協調により、 Development ~ Delivery 全体のアジリティを高めるためのプロセス Developer Operator DevOps (参考) ・Velocity 2009 : “10+ Deploys Per Day: Dev and Ops Cooperation at Flickr” by John Allspaw ・DevOps って何? by 宮下 さん http://www.slideshare.net/mizzy/devops-4156440 協調文化を確立し ”IT”によりビジネスを進化させる ビジネスに合わせた アプリケーションの 進化 ビジネスに合わせた インフラの進化
  6. 6. 6 マイクロソフトの DevOps シナリオ 開発担当 運用担当 • Visual Studio 2011 • IntelliTrace Agent • System Center 2012 • ConfigMgr 構成パック • OpsMgr 管理パック • OpsMgr AVICode • Orchestrator(Opalis) • SM インシデント管理 • VMM Portal など • Windows PowerShell • SQL Server bacpac ・ ・
  7. 7. 7 DevOps における PowerShell の位置づけ • 目的ベースのコマンドレット(CmdLet) • アプリケーションに対する処理の正確性 • ビジネスにとっての高速性 • 自動化 • オペレーション品質 • ビジネスに合わせた拡張性 Exchange Server メールボックス作成 GALの一覧取得 API New-Mailbox 目的 コマンドレット Get-GlobalAddressList
  8. 8. 8 業務アプリケーション Dev にとっての PowerShell ① サービス 開発担当 運用担当PowerShell 標準コマンドレット 開発 利用 アドバイス 利用 Windows Server OS Active Directory SharePoint Server Exchange Server ・ ・
  9. 9. 9 PowerShell スクリプト Dev にとっての PowerShell ② サービス 開発担当 運用担当サービス専用 コマンドレット開発 作成 処理の自動化 製品のメンテナンス 障害の調査 実 行 フィードバック 利用
  10. 10. 10 マイクロソフト製品と PowerShell の関係 • 製品ごとに専用の”コマンドレット”が用意されている • 多くの管理 GUI は裏でコマンドレットを呼んでいる • インフラ担当者に、各製品への”標準化されたアクセス方法”を提供する Active Directory Active Directory PowerShell コマンドレット Active Directory 管理センター Hyper-V VMM PowerShell コマンドレット System Center Virtual Machine Manager PowerShell コンソール
  11. 11. 11 Windows Management Framework PowerShell が Management Hub となる IT Pro IT Developer Solution Developer Storage Exchange DevicesDisk YOUR ELEMENTS Windows PowerShell CIMOM、SMI-S 標準化されたアクセス 標準化されたプロトコル 標準化されたモデル WS-Man(Web Service for Management) 他のプラッ トフォーム Service Provider 開 発 NanoWBEM Pegasus
  12. 12. 12 代表的なスクリプト言語 バッチファイル(拡張子 .bat) VBScript(拡張子 .vbs) PowerShell(拡張子 .ps1) Jscript(拡張子 .js) MS-DOS時代から使われてきたコマンドシェル上のスクリプト。脈々と現代に引き継がれて おり、利用者が多い。豊富なコマンド群によって支えられており、案外使い出がある。複数 のスクリプトを取りまとめる役割としても便利。 Visual Basic のスクリプト版。「Visual」とあるが、Visual ではない。わかりやすい文法と、 緩い規則によって根強いファンが多い。亜種として VBA もあるが微妙に文法は異なる。 JavaScript のMS 実装版として、VBScript とともに登場。JavaScript を Microsoft の独自 仕様によって拡張することで、汎用性を増している。 いわずと知れた高機能スクリプト言語。.NET Framework が使えると言うメ リットから、利用者は爆発的に増殖中。多くの製品がPowerShell用のコマンド レットを提供しはじめており、Windows Script Host の存在を脅かしつつある。 Windows Script 今後エンハンスの予定は無い OSに合わせて継続的なエンハンス 今後エンハンスの予定は無い (余談)HTML5 によって新 JavaScript エンジンに 脚光が!ただしWindows Scriptとは別物
  13. 13. 13 Windows .NET Framework PowerShell スクリプト exe bat VBScript JScript Script Engine CLR(共通言語ランタイム) Class Library スクリプトの実行環境 PowerShell エンジン COM cmd/ command Windows Script Host Cscript.exe Wscript.exe C O M
  14. 14. 14 コマンドシェルの進化と機能の包含 cmd.exe command.com 高機能 NT 低機能 DOS/ Win31 2000 XP/2003 Vista/2008 Windows Script Host PowerShell 上では bat/vbs/js も実行可能 Win9x/ Me Win7/ 2008R2 Windows PowerShell 8 100 200 2300 コマンドレットの数
  15. 15. 15 VBScript vs PowerShell Exchange 2003 (VBScript) Exchange 2007(PowerShell) メール ボックス 統計 Set listExchange_Mailboxs = GetObject("winmgmts:{impersonationLevel=impersonate}!COMPUTERNAMEROOTMicrosoftExchangeV2").InstancesOf("Excha nge_Mailbox") For Each objExchange_Mailbox in listExchange_Mailboxs WScript.echo "AssocContentCount =” + objExchange_Mailbox.AssocContentCount WScript.echo " DateDiscoveredAbsentInDS =” + objExchange_Mailbox.DateDiscoveredAbsentInDS WScript.echo " DeletedMessageSizeExtended =" + objExchange_Mailbox.DeletedMessageSizeExtended WScript.echo " LastLoggedOnUserAccount =" + objExchange_Mailbox.LastLoggedOnUserAccount WScript.echo " LastLogoffTime =" + objExchange_Mailbox.LastLogoffTime WScript.echo " LastLogonTime =" + objExchange_Mailbox.LastLogonTime WScript.echo " LegacyDN =" + objExchange_Mailbox.LegacyDN WScript.echo " MailboxDisplayName =” + objExchange_Mailbox. MailboxDisplayName WScript.echo " MailboxGUID =" + objExchange_Mailbox.MailboxGUID WScript.echo " ServerName =" + objExchange_Mailbox.ServerName WScript.echo " Size =" + objExchange_Mailbox.Size WScript.echo " StorageGroupName =" + objExchange_Mailbox.StorageGroupName WScript.echo " StorageLimitInfo =" + objExchange_Mailbox.StorageLimitInfo WScript.echo " StoreName =" + objExchange_Mailbox.StoreName WScript.echo " TotalItems =" + objExchange_Mailbox.TotalItems Next get-mailboxstatistics –server $servername データ ベース 管理 Dim StorGroup as New CDOEXM.StorageGroup StorGroup.DataSource.Open "LDAP://" + DCServer + "/ CN=First Storage Group,CN=InformationStore,CN=" + Server + ",CN=Servers,CN=First Administrative Group, CN=Administrative Groups,CN=First Organization, CN=Microsoft Exchange,CN=Services, CN=Configuration," + DomainName StorGroup.MoveLogFiles("C:newlogPath", 0) move-storagegrouppath -identity "First Storage Group" –log "C:newlogPath" 受信者 管理 Dim objMailbox As CDOEXM.IMailboxStore Set objMailbox = GetObject("LDAP://" + DCServer + "CN=FOO,CN=users," + DomainName) objMailbox.CreateMailbox "LDAP://" + DCServer + "/CN=Private MDB,CN=First Storage Group,CN=InformationStore,CN=" + Server + ",CN=Servers,CN=First Administrative Group, CN=Administrative Groups,CN=First Organization, CN=Microsoft Exchange,CN=Services, CN=Configuration," + DomainName enable-mailbox -identity domainFOO –database "First Storage GroupPrivate MDB"
  16. 16. 16 Windows PowerShell の基礎知識 <超参考になるサイト> MVP 牟田口さん http://blogs.wankuma.com/mutaguchi/archive/2010/02/13/186034.aspx
  17. 17. 17 事前準備 • コマンドシェルの環境設定 • 簡易編集を有効に • フォントを見やすく • 横幅の設定 • バッファの設定 • エクスプローラーの環境設定 • 「拡張子を表示しない」を無効に • オンプレミスの”署名無しスクリプト”を実行できるようにする • Set-ExecutionPolicy RemoteSigned • 必要に応じて自分専用の初期設定ファイルを作成 • notepad $profile cmd.exe と powershell.exeは独立している 必要なモジュールを読み込む..など 要は自分で作ったスクリプトのこと
  18. 18. 18 実行ポリシーの設定~ Set-ExecutionPolicy • “管理者として実行” する必要がある • 実行ポリシー – Restricted:制限つき (オペレーターモード)(規定値) • 対話形式のみ • スクリプトは実行できない – AllSigned:署名 • スクリプトは、信頼された発行元による署名が必要 – RemoteSigned:リモートの署名 • “インターネットゾーン” のスクリプトは信頼された発行元による署名が必要 – Unrestricted:無制限 • すべてのスクリプトを実行可能 • リモートのスクリプトについては常に警告 – Bypass:バイパス • 何もブロックされず警告も表示されない http://technet.microsoft.com/ja-jp/library/dd347628.aspx “ポリシーの設定”は、規定で はコンピューター全体に影響 する。適用範囲を制限するに は、Scope も同時に定義する。
  19. 19. 19 スクリプトの作成環境 バッチファイル VBScript PowerShell エディタ デバッガ フリー/シェアウェア/ 商用のエディタ フリー/シェアウェア/ 商用のエディタ メモ帳 PowerShell ISE なし?? エディタ組み込み エディタ組み込み VbsEdit メモ帳&目視 2.0からは標準装備
  20. 20. 20 スクリプトの作り方と実行方法 1. エディタを開く ※スクリプトはテキストファイル 2. スクリプトを書いて「名前をつけて保存」 拡張子は .ps1 3. PowerShell コンソールを開いてファイル名を入力 または PowerShell ISE で開いて“実行” または エクスプローラからダブルクリック PS C:> .sample.ps1
  21. 21. 21 覚えておくと便利な機能 メモ帳 編 指定した行番号に飛ぶ Ctrl + G ステータスバーを表示すると行と列が参照できる ※いずれも「右端で折り返し」を無効にしておくこと PowerShell コンソール、ISE 編 タブでコマンドレットやパラメタの続きを補完 (例)get-mem[Tab] ↓ Get-Member ※PowerShell 3.0 では Intellisence が実装されている
  22. 22. 22 “使用法” を理解するために “使用法”を得る方法をおさえておこう • 呼び出し可能なコマンドレット一覧取得 • Get-Command ※インストールされているモジュールによってコマンドレットは増減する • コマンドレットの詳細な書式と利用例を表示 • Get-Help <コマンドレット> -detailed • 使用可能なオブジェクトストア(ドライブ)の取得 • Get-PSDrive ※インストールされているモジュールによってドライブは増減する
  23. 23. 23 (つづき) • インストールされているモジュールを表示する • Get-Module ※”ActiveDirectory” や “GroupPolicy”、”Hyper-V” など、必要なモジュールが読み込 まれていないとコマンドレットを使用することはできない • コマンドレットのメソッドとプロパティ等を表示 • <コマンドレット> | get-member • <コマンドレット> | get-member | sort-object Name | format-list ※ COMのメンバーも取得できる New-Object -com scripting.filesystemobject | Get-Member • コマンドレットのエイリアス • Get-Alias • Get-Alias <エイリアス> (例)Get-Alias dir
  24. 24. 24 ドライブ ファイルシステムだけではなく、さまざまなオブジェクトがドライブとしてアク セス可能(つまり CD コマンドで移動可能) モジュールが読み込まれていないと使えないものもある (例)ActiveDirectory  ファイルシステム  エイリアス(Alias:)  レジストリ(HKLM:、HKCU:)  証明書(Cert:)  環境変数(Env:)  変数(Variable:)  WSMAN設定(Wsman:)  Active Directory(AD:) 追記 PS C:> Get-PSDrive
  25. 25. 25 操作 メソッド メソッド プロパティ プロパティ オブジェクト PowerShell の戻り値は「オブジェクト」である “オブジェクトとはプロパティとメソッド(操作)の集まり" 色 サイズ 型 ブランド パーツ ペダルをこぐ ハンドルを右に切る ハンドルを左に切る フロント ブレーキをかける リア ブレーキをかける もしも”オブジェクト”が自転車だったら...
  26. 26. 26 メソッドプロパティ オブジェクト DisplayName Status DependentServices Stop() Start() Pause() もしも”オブジェクト”が「Windows のサービス」だったら。。。 MachineName PS C:> Get-Service | Get-Member Windows サービス オブジェクトのメソッドとプロパティ一覧を参照するには
  27. 27. 27 オブジェクトであるということは... PS C:>$a = “abc” #普通ならば $a は”文字列” になるけれど... #オブジェクトだからメソッドとプロパティが用意されている PS C:>$a.ToUpper() PS C:>ABC PS C:>$a.ToUpper().Split("B")[0] PS C:>A
  28. 28. 28 PS C:>get-service | where-object {$_.Status -eq "Running"} PowerShell の典型的な使い方① (例)起動中のサービス一覧 パイプ サービス一覧 を出力 object サービス一覧 オ ブ ジ ェ ク ト の ま ま 渡 さ れ る object サービス一覧
  29. 29. 29 (参考)3.0 では書式を簡略化できます PS C:>get-service | where-object {$_.Status -eq "Running"} PS C:>get-service | where-object Status -eq "Running" V3 ではこう書ける
  30. 30. 30 PowerShell の典型的な使い方② (例)サービスを停止する PS C:>(Get-Service -Name WSearch).Stop() メソッド Windows Search サービスの インスタンスを取得 object Windows Search インスタンスに対して メソッドを実行
  31. 31. 31 コマンドからの出力もオブジェクト化される PS C:> (ipconfig)[18].Split(":")[1].Trim() object ipconfig の 出力結果 の18行目 (0から数えて) IPv4 アドレス . . . . . . . . . . : 192.168.1.100 ipconfig の出力結果からIPアドレスを取りだす コロンで分割した (0から数えて) 2つ目の値 前後の空白を トリミング
  32. 32. 32 スクリプトを作成するにあたって おさえておきたい基本機能 • コメント • 行継続 • 引数を受け取る • 変数を使う • True と False • 入出力(コンソール/ファイ ル) • 繰り返し(ループ)処理 • 出力結果のフォーマット変換 • 環境変数を取得 • 日時取得 • 結果を検索 • リモーティング • バックグラウンドジョブ • unix 系コマンド
  33. 33. 33 コメントを付ける # 処理開始 copy-item C:tmp*.txt -destination C:tmp2 # 処理終了
  34. 34. 34 行継続 アクサン グラーブ記号 (`) を使用する copy-item C:tmp*.txt ` -destination C: こ い つ
  35. 35. 35 引数を受け取る Write-Output $args[3] foreach ( $a in $args ) { Write-Output $a } C:> .hogehoge.ps1 My name is “Junichi Anno” . 5つの引数 My name is Junichi Anno . Junichi Anno
  36. 36. 36 名前付き引数 param([string] $UserID = “ID", [string] $Password =“PASS") Write-Output $userid Write-Output $Password 引数を所定の名前の変数に格納することで、文法チェック等が行いやすくなる C:> hogehoge.ps1 -userid anno anno PASS 出力結果 規定値
  37. 37. 37 変数 $FirstName = "Junichi" $LastName = "Anno" $FullName = $FirstName + " " + $LastName Write-Output $FullName $arrFullName = $FullName.Split(" ") Write-Output $arrFullname[0] PS C:> C:hogehoge.ps1 Junichi Anno Junichi 出力結果
  38. 38. 38 True と False の指定 $True と $False が予約されている C:> $MyNameIsJunichi = $True C:> If ($MyNameIsJunichi -eq $True) {Echo 1} 1
  39. 39. 39 入出力方法 #標準出力 Write-Output “Hello” #標準入力 $InputData = Read-Host #ファイルに出力 $Record = “hogehoge” Out-File -filepath C:tmplist.txt -inputobject $Record #ファイルから入力 $file = Get-Content -Path c:tmplist.txt これを抑えておけば、ひとまずたいていのことはできます
  40. 40. 40 出力結果のフォーマット変換して表示したい dir | format-table Name,Length dir | format-list Name,Length dir | format-wide Name -column 6 dir | out-gridview
  41. 41. 41 特定のプロパティだけをオブジェクトとして取得したい dir | Select-Object Name,Length 戻り値の「見た目」は同じだが、オブジェクトタイプが異なることに注意! PS C:> dir |ft Name,Lenght |Get-Member PS C:> dir |Select-Object Name, Length |Get-Member 以下の出力結果を比較しましょう 後からNameやLengthを 再利用できない
  42. 42. 42 条件を指定して検索した結果だけを オブジェクトとして取得したい #サイズが1024バイト以上のファイルを検索する Dir | Where-Object {$_.length -GT 1024} ` |Select-Object Name,length #Active Directory のユーザー名に”a”を含むユーザーを取得 する Get-ADUser -Filter * ` |Where-Object {$_.name -Like "*a*"} ` | ForEach-Object name
  43. 43. 43 繰り返し処理 #ForEach-Object Get-ADUser -Filter * | ForEach-Object {$_.name} Get-ADUser -Filter * | ForEach-Object name #foreach $Users = Get-ADUser -Filter * foreach ($user in $Users) { $user.name } Active Directory ユーザー一覧から name プロパティをリストする V3
  44. 44. 44 繰り返し処理 #1から10までを出力 1..10 #1から10 をリダイレクトして出力 1..10 | % {echo $_ } #User1 から User10 を作成 1..10 | % {New-ADUser “User$_” } ※ % は foreach のエイリアス
  45. 45. 45 繰り返し処理 $i = 0 do { Write-Host $i $i++ } while ($i -lt 10) $i = 0 do { Write-Host $i $i++ } until ($i -ge 10)
  46. 46. 46 環境変数を取得 #一覧を取得 cd env: dir #特定の環境変数を取得 $env:computername $env:username $env:userdomain $env:SessionName
  47. 47. 47 日時を取得(Date オブジェクト) Date Day DayOfWeek DayOfYear Hour Kind Millisecond Minute Month Second Ticks TimeOfDay Year DateTime Add AddDays AddHours AddMilliseconds AddMinutes AddMonths AddSeconds AddTicks AddYears CompareTo Equals GetDateTimeFormats GetHashCode GetType GetTypeCode IsDaylightSavingTime Subtract ToBinary ToFileTime ToFileTimeUtc ToLocalTime ToLongDateString ToLongTimeString ToOADate ToShortDateString ToShortTimeString ToString ToUniversalTime プロパティ メソッド PS C:> (Date).Year 2012 PS C:> (date).adddays(10) 24年 5月 23日 12:49:10
  48. 48. 48 リモーティング • 3種類のリモーティング • -ComputerName パラメタ • 複数のコンピュータを指定可能 • 対話モード(Enter-PSSession コマンドレット) • SSH のような使い方 • Invokeモード(Invoke-Command コマンドレット) • -ComputerNameに対応していないコマンドで使用 • 複数のコンピュータに対して一括実行 • コマンド単体(-scriptblock)、 PS1スクリプト(-filepath)の指定が可能 • 送受信双方でリモーティングの準備が必要
  49. 49. 49 PowerShell セッション(PSSessions) PS> Enter-PSSession -ComputerName Server1 [Server1]: PS > $A = 1 [Server1]: PS > $B = 2 [Server1]: PS > $C = $A + $B PS>Exit-PSSession PS> Invoke-Command -ComputerName Server1 -ScriptBlock {$A = 1} PS> Invoke-Command -ComputerName Server1 -ScriptBlock {$B = 1} Enter-PSSessionを使用 Invoke-Command を使用 PS> Invoke-Command -ComputerName Server1 -ScriptBlock {$C = $A + $B} 1つのセッション • コマンドの実行空間単位 • セッション内ではデータの共有が可能 • 通常はテンポラリセッションが作成され、コマンド終了後に削除される
  50. 50. 50 PSSession の永続化 PS > $S = New-PSSession -ComputerName CL01 PS > Invoke-Command -session $S -ScriptBlock {$A=1} PS > Invoke-Command -session $S -ScriptBlock {$B=2} PS > Invoke-Command -session $S -ScriptBlock {$C=$A+$B} PS > Remove-Session $S • セッションの作成 :New-PSSession • セッションの削除 :Remove-PSSession • セッション一覧 :Get-PSSession • セッションへの再接続 :Enter-PSSession PS > $S = New-PSSession -ComputerName CL01 PS > Enter-PSSession $S [CL01] PS > Get-VM | Where-Object name -EQ "TFWIN7-0" PS > Exit-PSSession
  51. 51. 51 モジュールとコマンドのインポート • リモートコンピューター上のコマンドレットを一時的に取り込むことができる • “Invoke-Command -Session” を使用する必要が無くなる • コマンドの実行中はセッションを生かしておく必要がある PSSession Windows 7 Windows Server 2008 R2 w/ Hyper-V Hyper-V module • Get-VM • Start-VM • Stop-VM • ・ • ・ PS C:> Get-VM |ft name Name ---- TFWin7-0 TFWin7-1 FX TFWin8-0 FX TFWin8-1 Win7_template Win8_template PowerShell 実 行 空 間 PSSession を通じてモジュールをインポート PS C:> $s = New-PSSession -ComputerName Server1 PS C:> Import-PSSession -Session $s -Module HYPER-V
  52. 52. 52 関連コマンドレット  Get-Job  バックグラウンドジョブを取得  Receive-Job  バックグラウンドジョブの出力結果を取得  Remove-Job  バックグラウンドジョブを削除  Start-Job  バックグラウンドジョブを開始  Stop-Job  バックグラウンドジョブを停止  Wait-Job  バックグラウンドジョブが終了するまで待つ バックグラウンドジョブ • Windows PowerShell 2.0 よりサポート • 長時間を要するコマンドレットを非同期に実行し、次の処理に移る (例)get-eventlog “Windows PowerShell” • ジョブの有効範囲は現在のセッション
  53. 53. 53 バックグラウンドジョブの作成/開始/状態/結果取得 (例) PS C:> $job = start-job -scriptblock {do {$a = 0; echo (date) ; start-sleep 5} while ($a -eq 0) } PS C:> $job Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 6 Job6 Completed True localhost get-eventlog "Windows ... PS C:> Receive-Job $job -Keep PS C:> Stop-Job $job PS C:> Remove-job $job 書式 start-job -scriptblock { <スクリプトブロック> } 出力結果が存在する 規定では、出力結果は一度取得するとクリアされてしま うので、-Keep によって残すように指定 5秒に1回日時を表示するジョブ ジョブを停止 ジョブを削除
  54. 54. 54 リモートバックグラウンドジョブ リモートコンピューターでバックグラウンドジョブを実行する場合には、 リモーティング手法を使用する PS C:> $session = New-PSSession -Name testjob -ComputerName vlab-server40 PS C:> $job = Invoke-Command -Session $session -ScriptBlock {Get-EventLog "windows powershell"} -AsJob PS C:> Get-Job Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 21 Job21 Completed True vlab-server40 Get-EventLog "windows ... PS C:> Receive-Job $job ジョブとして実行 (注意)ジョブはローカルコンピューターに作成される 結果を取得 Windows PowerShell 3.0 では、ジョブの実行中にセッションを切断することが可能 結果はゆっくり自宅から...とか
  55. 55. 55 unix のあのコマンドは? ls → get-ChildItem cp → copy-Object grep → select-String sort → sort-Object man → help clear → clear-Host cat → get-Content kill → stop-Process tee → tee-Object tail → get-Content 「アレはあるかな?」と思ったら Get-Alias <unix 上のコマンド>
  56. 56. 56 Get-Content で Tail を模してみる ## 新しく追加された行を待ち合わせて表示 gc test.txt -wait ## テキストファイルの5行目から10行目までを表示 (gc test.txt)[4..9] ## テキストファイルの最初の5行を表示 gc test.txt -totalcount 5 ## テキストファイルの最後の5行を表示 gc test.txt | Select-Object -Last 5 ## 新しく追加された行に特定の文字列が含まれていたら表示 gc test.txt -wait | Select-String -Pattern ^a
  57. 57. 57 Windows Management Framework 3.0 Windows Server “8” に対応した新しい管理フレームワーク Beta http://www.microsoft.com/download/en/details.aspx?id=28998
  58. 58. 58 Windows Management Framework 3.0 • PowerShell 3.0(コマンドレット数 2300!) – ワークフロー – セッションへの再接続 – PSScheduledJob モジュールによるジョブスケジューリングへの対応 – Show-Command による GUI を使用したコマンド入力 – パブリックネットワークでの Enable-PSRemoting ( -SkipNetworkProfileCheck オプション) – WEB/Json系コマンドレット – 新しい PowerShell ISE • Windows PowerShell Web Service • Server Manager CIM プロバイダー • WinRM、WMI のアップデート http://blogs.technet.com/b/junichia/archive/2012/03/21/3487696.aspx
  59. 59. 59 PSSession の扱いの違い PowerShell 2.0 の場合 PSSession セッション情報 PowerShell 3.0 beta の場合 PSSession セッション情報 セッション情報はローカルに保 存されるため、別のクライアン トから再接続できない セッション情報はリモートコン ピューターに保存されるため、 別のクライアントから再接続で きる
  60. 60. 60 Session への再接続 セッション情報がリモートコンピュータ内に保存されるようになった Name = Session1 New-PSSession -ComputerName ServerA $A = 1 Disconnect-PSSessions -Name Session1 Connect-PSSession -ComputerName ServerA -Name Session1 Enter-PSSession -Name Session1 Connect-PSSession -Name Session1 Enter-PSSession -Name Session1 $A = 1 Server1 Exit-PSSession セッション 作成 PS C:>$A 1 再接続 自宅社内
  61. 61. 61 ワークフロー ターゲット • 長時間を要する処理 – 仮想マシンの展開 – ソフトウェアのインストール – ビッグデータの集計 など • 複数の処理の組み合わせ • 複数のコンピューターに対する処理 – ドメイン参加 – 環境設定 – インベントリ収集 など ニーズ • タイムアウトやリトライ • 処理の一時停止、再開 • 処理ステートの永続化 • 複数処理の制御 • 並列 • シーケンシャル • スクリプト実行権限の委任 • 途中経過の取得 ワークフロー = バックグラウンドジョブ + 実行制御
  62. 62. 62 ワークフローの作成と実行 ## 作成 workflow <ワークフロー名> ( <引数> ) { <スクリプトブロック> } ##実行 PS C:> <ワークフロー名> <引数> <共通パラメタ>
  63. 63. 63 ## 作成例 workflow testwf ( [string] $UserID, [string] $Password ) { Echo -InputObject $PSComputerName, $UserID, $Password } Start-Sleep -Seconds 5 } ##実行例 PS C:> testwf Yamada Pass -PSComputerName PC1,PC2,PC3 PC1 Yamada Pass PC2 Yamada Pass PC3 Yamada Pass ここで指定した3つのコンピューターに対し てワークフローが同時に実行される
  64. 64. 64 ワークフロー共通パラメタ ワークフローの中で指定するためのパラメタで、既定の変数名でアクセスできる パラメタ名 意味 PSParameterCollection PSComputerName ターゲットコンピューター。複数指定すると、複数のコンピューターでワークフローが 同時実行される。 PSCredential ターゲットコンピューターに接続するための資格情報 PSConnectionRetryCount ターゲットコンピューターに再接続を試みる回数 PSConnectionRetryIntervalSec 再接続までの時間間隔 PSRunningTimeoutSec ワークフローが終了するまでの制限時間。制限時間がくるとワークフローは強制終了さ れる。ワークフローが一時停止していた場合には、その時間は実行時間には含まれない。 PSPersist $True または $False。ワークフロー内部で出力した結果を永続化する。 PSAuthentication 使用する認証のメカニズムを指定する。 Default / None / Connect / Call / Packet / PacketIntegrity / PacketPrivacy PSApplicationName ターゲットコンピューターに接続するために使用する接続URIのアプリケーション名を 指定する。既定は WSMAN。 PSPort リモートコンピューターに接続する際のポート番号。既定では5985(WinRM for HTTP)または5986(WinRM for HTTPS)。
  65. 65. 65 パラメタ名 意味 PSUseSSL リモートコンピューターとSSLを使用して接続する PSConfigurationName ワークフローの構成情報が格納された構成名を指定する。規定値は Microsoft.PowerShell PSConnectionURI 接続に使用するエンドポイントを指定する。規定は http://localhost:5985/WSMAN PSAllowRedirection ターゲットコンピューターがURIのリダイレクトを要求してきたときに、それを PowerShell が許可するかどうかを指定する。規定値は $False。 PSSessionOption New-PSSessionOption で作成された拡張オプションを指定する。 PSCertificateThumbprint 権限を持ったX.509証明書のサムプリントを指定する PSPrivateMetadata ワークフローの実行時に使用される、ユーザーやアプリケーションの情報が格納された ハッシュテーブルを指定する AdJob ワークフローをバックグラウンドジョブとして実行する際に指定する。このオプション を使用すると、ジョブ情報がオブジェクトとして返されるので、これを使用して関連モ マンドレット(*-job)でジョブの制御を行うことができる。 Jobname AsJobパラメタで実行した場合、規定では Job<n> という名前が付けられるが、このパ ラメタを使用してわかりやすいジョブ名を指定することができる。 InputObject ワークフローの引数
  66. 66. 66 共通パラメタの使用例 ##例:pc1,pc2,pc3 をドメイン Contoso に参加させる Workflow JoinDomain ([string] $Domain) { Get-WmiObject –Class Win32_ComputerSystem –PSComputerName $PSComputerName Add-Computer -PSComputerName $PSComputerName -DomainName $Domain –Credential $PSCredential Restart-Computer -PSComputerName $PSComputerName -Wait -For PowerShell -Force Get-WmiObject -Class Win32_ComputerSystem -PSComputerName $PSComputerName } ##ワークフローの実行 PS C:> JoinDomain Contoso.com -PSComputerName pc01,pc02,pc03 -PSCredential $Cred
  67. 67. 67 並列実行とシーケンシャル実行 workflow testwf { parallel { echo -InputObject "a" sequence { echo -InputObject "c" echo -InputObject "d" } echo -InputObject "b" } } こ こ は 並 列 処 理 ここは シーケンシャル
  68. 68. 68 PowerShell Web Access PSWS Internet DMZ INTRANET SSL WS-MAN
  69. 69. 69 PowerShell Web Access のセットアップ 1.サーバーマネージャーから PowerShell Web Access をインストールする
  70. 70. 70 2.IIS で自己署名証明書を作成してバインドを設定する(SSLを有効に) ご自身のサーバーを指 定してください バインドの設定で 作成した証明書を選択
  71. 71. 71 2.PowerShell を管理者モードで起動 3.以下のコマンドを実行 PS C:> Set-ExecutionPolicy RemoteSigned PS C:> Import-Module PowerShellWebAccess PS C:> Install-PswaWebApplication -webSiteName "Default Web Site" PS C:> Add-PswaAuthorizationRule * * * 4.https://<サーバー名>/pswa にアクセス ここで指定するサーバーは、 管理したいサーバー
  72. 72. 72 まとめ Windows PowerShell を始めたら、 PowerShell だけを使い続けましょう! コマンドプロンプトに戻ってはいけません! PowerShell に「一短」はありません!
  73. 73. 73

×