74
Cloud OS MVP Roadshow 2014 年 6 月 Cloud OS Tech Day! IT Pro のための PowerShell スクリプティング 高井 一輝 System Center User Group Japan

IT Pro のための PowerShell スクリプティング

Embed Size (px)

DESCRIPTION

Cloud OS MVP Roadshow 2014年6月 (2014/06/14 開催) のセッション資料です。

Citation preview

Page 1: IT Pro のための PowerShell スクリプティング

Cloud OS MVP Roadshow 2014 年 6 月 Cloud OS Tech Day!

IT Pro のためのPowerShell スクリプティング

高井 一輝System Center User Group Japan

Page 2: IT Pro のための PowerShell スクリプティング

自己紹介

• 高井 一輝 (Takai Kazuki)

• 某 ISP 勤務• クラウドとオンプレミスを組み合わせたインテグレーション

• 見積り、提案書の作成から設計、構築、試験、運用まで

• ネットワーク、サーバ (Windows、Linux)

• System Center User Group Japan (SCUGJ)

• Twitter : @zhuky7 / Facebook : kazuki.takai

• Blog : http://operationslab.wordpress.com/

2

Page 3: IT Pro のための PowerShell スクリプティング

本日の内容

• お話すること• PowerShell についてのおさらい

– スクリプトを記述するうえで必要となる内容

– スクリプトを実行するために必要となる内容

• スクリプトでやりたいことを実現するためのパーツ

• スクリプトを作成するうえで注意すべきこと

• お話しないこと• PowerShell コマンドレットの実行方法

• PowerShell Remoting の仕組み

• PowerShell Workflow

• 個々の製品の具体的な管理方法

3

Page 4: IT Pro のための PowerShell スクリプティング

このセッションのゴール

• 簡単な PowerShell スクリプトを作成できる

• 目的に応じてスクリプトを作成できる

• スクリプトの実行、運用ができる

4

Page 5: IT Pro のための PowerShell スクリプティング

本日の環境

• Windows 7 Professional with WMF 4.0

• Windows Server 2012 R2

5

Page 6: IT Pro のための PowerShell スクリプティング

アジェンダ

• Windows PowerShell の基礎

• スクリプトを作成する

• スクリプトの動作を確認する

• スクリプトを展開する

6

Page 7: IT Pro のための PowerShell スクリプティング

Windows PowerShell の基礎

7

Page 8: IT Pro のための PowerShell スクリプティング

PowerShell とは

• Windows で利用可能な新しいシェル / スクリプト言語• Windows Server 2008 R2 以降で標準搭載

• コマンドプロンプトよりも高度な処理 / 制御が可能

• WSH よりもスクリプトの記述が容易

• Character-based User Interface

• テキストベースではなくオブジェクトベース• パイプラインを流れるのはオブジェクト

• 豊富なコマンドレット• PowerShell 本体で用意されているコマンドレット

• Windows Server OS や役割 / 機能に付随するコマンドレット

• 特定の製品やサービスに付随するコマンドレット8

Page 9: IT Pro のための PowerShell スクリプティング

オブジェクトベース

• コマンドレットの入力、出力はオブジェクト• コンソールに出力する際は、オブジェクトを文字列に変換している

• パイプラインを流れるのはオブジェクト

• オブジェクトベースなので…• 一部のプロパティ(列)だけ取り出して加工できる

– アカウントの一覧から “アカウント名” と “最終ログイン日時” だけ取り出す

• プロパティの値を使ってフィルタリングできる

– Windows の役割・機能の一覧から、インストールされているものだけ取り出す

• オブジェクトの状態を操作できる

9

Page 10: IT Pro のための PowerShell スクリプティング

現在の最新版

• PowerShell 4.0• Windows Server 2012 R2 に標準搭載

• Windows Management Framework 4.0 をインストールすることで、他の OS でも利用可能

– Windows 7 SP1, Windows Server 2008 R2 SP1, Windows Server 2012

– .NET Framework 4.5 が必要

• PowerShell 5.0 Preview May 2014• with Windows Management Framework 5.0

– http://www.microsoft.com/en-us/download/details.aspx?id=42936

• includes OneGet, PowerShellGet, and Network Switch

10

Page 11: IT Pro のための PowerShell スクリプティング

基本事項のおさらい

• PowerShell 実行環境

• 演算子

• リダイレクト

• 変数とスコープ

• ヒアドキュメント

• 条件分岐

• 繰り返し

11

Page 12: IT Pro のための PowerShell スクリプティング

PowerShell 実行環境

• PowerShell (PowerShell コンソール)• powershell.exe

• 通常の PowerShell 環境

• PowerShell ISE (Integrated Scripting Environment)• powershell_ise.exe

• スクリプト作成 / デバッグ用の環境

– ブレークポイントの設定

– スクリプトの一部を選択して実行 (選択範囲を実行)

12

Page 13: IT Pro のための PowerShell スクリプティング

演算子

• 算術演算子(about_Arithmetic_Operators)• +, -, *, /, %

• 代入演算子(about_Assignment_Operators)• =, +=, -=, *=, /=, %=

• 比較演算子(about_Comparison_Operators)• -eq, -ne, -gt, -lt, -le, -ge, -match, -notmatch, -replace,

-like, -notlike, -in, -notin, -contains, -notcontains, -bAND, -bOR, -bXOR, -bNOT

• 論理演算子(about_Logical_Operators)• -and, -or, -xor, -not, !

13

Page 14: IT Pro のための PowerShell スクリプティング

演算子

• リダイレクト演算子(about_Redirection)• 後述

• 分割/結合演算子(about_Split / about_Join)• -split, -join

• 型演算子(about_Type_Operators)• -is, -isnot, -as

• 単項演算子(about_Operators)• $a++, $a—

• 特殊演算子(about_Operators)• @(), [], &, |, .., ::, etc...

14

Page 15: IT Pro のための PowerShell スクリプティング

リダイレクト

• リダイレクト演算子• ストリームの出力先を変更

> 標準ストリームをファイルに保存(既存ファイルは上書き)

>> 標準ストリームをファイルに保存(既存ファイルに追記)

2> エラーストリームをファイルに保存(既存ファイルは上書き)

2>> エラーストリームをファイルに保存(既存ファイルに追記)

2>&1 エラーストリームを標準ストリームと同じ場所へ出力

• ストリーム番号

– 2:エラー 3:警告 4:詳細 5:デバッグ

• 出力文字コードは UTF-16 になるので注意

– 文字コードを変換しつつ出力する場合は、Out-File 等を利用

15

Page 16: IT Pro のための PowerShell スクリプティング

変数とスコープ

• 変数:値を格納するための場所(入れ物)• $ を先頭に付ける

• 参照可能な範囲(スコープ)がある

– 関数内、ブロック内、スクリプト内で宣言された変数は、原則として外部からは参照できない

– 可能な限りグローバル変数は使用しない

• 変数のスコープ• グローバル:どこからでも参照可能

• スクリプト:同一スクリプト内であれば参照可能

• (ローカル):同一ブロックまたは子ブロック内であれば参照可能

• プライベート:同一ブロック内のみ参照可能

16

Demo 01

Page 17: IT Pro のための PowerShell スクリプティング

変数とスコープ

• ドットソース形式での読み込み• スクリプト内の変数をグローバル変数として取り込む

• . <ScriptPath>

• 変数初期化(定義)用のファイルを分割したい場合等に利用可能

• 通常のスクリプトファイルに対しては使用しない方が良い

– グローバル変数を無暗に増やさない

• 不要な変数がある場合やグローバル変数が競合する場合は、削除する

– Remove-Variable

17

Demo 02

Page 18: IT Pro のための PowerShell スクリプティング

ヒアドキュメント

• スクリプト内に文字列を埋め込むことが可能• @’

<複数行文字列>‘@

• @’ の直後に改行が必須

• 主に、テスト時や簡単なスクリプトで使用• スクリプトに埋め込むことになるので、保守性が悪い

• 本格的に運用(使用)する場合は、外部ファイルから読み込む

18

Demo 03

Page 19: IT Pro のための PowerShell スクリプティング

条件分岐

• if ... elseif ... Else• if (条件式1) { 条件式1を満たす時の処理 }

elseif (条件式2) { 条件式2を満たす時の処理 }...elseif (条件式n) { 条件式nを満たす時の処理 }else { 条件式1..nを満たさなかった時の処理 }

• switch ステートメント• switch (チェック対象) {

対象となる値1 { チェック対象が値1の時の処理 ; break ; }...対象となる値n { チェック対象が値nの時の処理 ; break ; }default { チェック対象が1..nの何れでもない時の処理 }}

19

Page 20: IT Pro のための PowerShell スクリプティング

繰り返し

• while ステートメント• 条件を満たすまでループし続ける

• do ... while ステートメント• 条件を満たすまでループし続ける

• for ステートメント• インデックス(番号)付きで n 回(n 個)繰り返す

• foreach ステートメント• 集合(コレクション)の要素それぞれに対して処理を行う(名前付き)

• Foreach-Object (%)• 集合(コレクション)の要素それぞれに対して処理を行う(自動変数)

20

Page 21: IT Pro のための PowerShell スクリプティング

スクリプトを実行するための事前準備

• スクリプトの実行を許可する• とりあえずスクリプトを作成するコンピューター上で以下を実行

– Set-ExecutionPolicy RemoteSigned

• PowerShell Remoting を有効化する• リモート接続が必要な場合は以下を実行 (検証環境向け)

– 接続先 : Enable-PSRemoting -Force

– 接続元 : Set-Item WSMan:¥localhost¥Client¥TrustedHosts -Value *

• 詳細は後述

21

Page 22: IT Pro のための PowerShell スクリプティング

Set-ExecutionPolicy

22

Page 23: IT Pro のための PowerShell スクリプティング

Enable-PSRemoting

23

Page 24: IT Pro のための PowerShell スクリプティング

スクリプトを作成する

24

Page 25: IT Pro のための PowerShell スクリプティング

PowerShell スクリプト

• スクリプトファイル• 基本的に、コンソール上で実行する場合と同様のコマンドを記述

– 必要な処理(コマンドレット等)を列挙

• 人が考えてコマンド実行していた部分は、条件分岐やフィルタ、エラー処理等として記述

• ps1 ファイルとして保存

– UTF-8 を推奨

• PowerShell ホストを介してスクリプトを実行

– PowerShell Console 上からスクリプトファイルを実行

– powershell.exe 起動時にスクリプトファイルを指定して実行

25

Page 26: IT Pro のための PowerShell スクリプティング

スクリプトに記述する処理

• やりたいことを実現するための処理• データ(操作対象)を取得

• データ(操作対象)から不要なものを除外(フィルタリング)

• 残った項目(必要なもの)それぞれに対して処理を実行

• スクリプトの動作をサポートする処理• エラーハンドリング

• 外部の状態に応じて処理を実行

• 結果の通知 / ロギング

• 認証情報の取得・保持

• リモート接続・リモート処理26

Page 27: IT Pro のための PowerShell スクリプティング

スクリプトの記述レベル

• 実行時の状況に合ったスクリプトを作成、記述する• システムが自動で実行する(人の手を介さない)

– 途中で止まらない(入力待ちにならない)

– 最後まで正しく実行される、あるいは途中で正しく止まる

– 処理内容・処理結果を後から追跡できる

• 一般ユーザーが実行する

– 分かり易いメッセージを出力する(あるいは、何も出力しない)

– 実行方法、実行形式をミスしても問題が起きないようにする

• 作成者以外の IT 管理者が実行する

• 作成者のみが利用する

– 後からメンテナンスできるよう最低限コメントを記載する

– (場合によっては)エラー処理は考慮しない

27

Page 28: IT Pro のための PowerShell スクリプティング

やりたいことを実現するための処理

• 処理の基本• 取得(入力)して、抽出して、処理(または出力)する

• 複数のコマンドレット、関数等の間で、対象(オブジェクト)を受け渡す

• オブジェクトの受け渡し• 引数として入力し、出力を次のコマンドの引数へ渡す

– $a = <Cmdlet1>

– <Cmdlet2> $a

• パイプラインを使用する

– <Cmdlet1> | <Cmdlet2>

28

Page 29: IT Pro のための PowerShell スクリプティング

パイプラインの処理

• <Cmdlet1> | <Cmdlet2> | <Cmdlet3>• Cmdlet1 の出力オブジェクト全体が Cmdlet2 に渡されるわけではない

• Cmdlet1 の出力がコレクション(配列)の場合

1. <Cmdlet1> の出力の一つ目のオブジェクトが <Cmdlet2> に渡される

2. <Cmdlet2> は一つ目のオブジェクトを処理し、<Cmdlet3> へ渡す

3. <Cmdlet3> でも一つ目のオブジェクトが処理される

4. 上記を、すべてのオブジェクトに対して実行

※はじめは、あまり気にしなくても OK

29

Demo 04

Page 30: IT Pro のための PowerShell スクリプティング

Foreach-Object

• パイプラインの中での繰り返し処理• 通常は Foreach-Object を使用

• エイリアスは %, foreach

– foreach ステートメントと混同しないように注意

• オブジェクトの配列を受け取り、各要素に処理<scriptblock>を実行

– Foreach-Object <scriptblock>

– <scriptblock>のなかでは、自動変数 $_ に各オブジェクトが設定される

30

Demo 05

Page 31: IT Pro のための PowerShell スクリプティング

データ(オブジェクト)の取得

• 操作対象となるオブジェクトを取得する• オブジェクト、またはオブジェクトの集合(配列、コレクション、etc...)

• 専用のコマンドレットで取得• Get-ADUser, Get-WindowsFeature, etc...

• 汎用のコマンドレットで取得• Get-Item, Get-ItemProperty, etc...

• ファイルから読み込み• Import-CSV, [xml](Get-Content)

• 自力でデータソースにアクセスして取得31

Page 32: IT Pro のための PowerShell スクリプティング

ファイルの読み込み

• テキストファイルとして読み込む• Get-Content –Path <path>

• 1行を1文字列として、文字列の配列を取得

• CSVとして読み込む• Import-CSV –Path <path>

[-Encoding <Encode>] [-Delimiter <Delimiter>]

• エンコードは極力指定する

– ASCII, BigEndianUnicode, Default, OEM, Unicode, UTF32, UTF7, UTF8

• デリミタ(区切り文字)は、必要に応じて指定する

– デフォルトはカンマ “,”

32

Demo 06

Page 33: IT Pro のための PowerShell スクリプティング

ファイルから読み込む

• XMLとして読み込む• [xml](Get-Content –Path <path>)

• 文字列から XML オブジェクト(XMLDocument)を生成

33

Demo 07

Page 34: IT Pro のための PowerShell スクリプティング

フィルタリング

• オブジェクトを抽出する(絞り込む)• 通常は Where-Object(?)を使用

– Where-Object <scriptblock>

– <scriptblock> が $true となるオブジェクトのみを抽出

• ? { $_.Name –eq “suzuki” } ? { $_.Installed }

• ? Name –eq “suzuki” ? Installed

– 同じフィルタ(条件)を多用するのであれば、filter を作成したほうが良い

• 先頭または末尾から抽出する

– Select-Object -First <N>

– Select-Object -Last <N>

• オブジェクトの順序を並び替える

– Sort-Object

34

Page 35: IT Pro のための PowerShell スクリプティング

ファイルへ出力(保存)

• テキストファイルへ出力• Out-File <path> [-Encoding <Encode>] [-Append]

• 追記する場合は -Append スイッチを使用

• リダイレクトは文字コードを指定できないため、通常はこちらを使用

• CSV ファイルへ出力• Export-CSV –Path <path> [-Encoding <Encode>] [-Append]

• オブジェクトのプロパティを CSV 形式で出力

35

Page 36: IT Pro のための PowerShell スクリプティング

その他の出力

• Out-Null• パイプラインから渡されたオブジェクトを捨てる(UNIX の /dev/null)

• Out-String• パイプラインから渡されたオブジェクトを文字列に変換する

• Write-Host• 指定されたオブジェクトを Console へ出力する

• パイプラインには何も出力されない

• Write-Output• 指定されたオブジェクトを標準ストリーム(パイプライン)へ出力する

36

Page 37: IT Pro のための PowerShell スクリプティング

エラーハンドリング

• スクリプト実行時、エラーが発生する要因はたくさんある• ディスク容量不足

• ネットワーク切断

• 通信先のサービスダウン

• 日付、時刻、起動時間(起動後経過時間)

• スクリプトの不具合(仕様・実装)

• 処理に失敗しても致命的な状態にならないことが重用• 破壊的な操作を記述する場合は十分にチェックする

– 破壊的な操作:対象の状態を変更する操作(追加、削除、データ変更等)

– 非破壊的な操作:対象の状態を変更しない操作(何度実行しても影響がない)

37

Page 38: IT Pro のための PowerShell スクリプティング

エラーメッセージを出力する

• エラーとしてメッセージを出力する• Write-Error

• 標準エラーストリームへ出力される

• エラー扱いとなる($ErrorActionPreference の影響を受ける)

• エラーの他にも出力可能• Write-Warning ストリーム 3 へ出力

• Write-Verbose ストリーム 4 へ出力

• Write-Debug ストリーム 5 へ出力

38

Page 39: IT Pro のための PowerShell スクリプティング

エラー発生時の動作

• エラー発生時• デフォルトではスクリプトの実行を継続しようとする

– スクリプト実行環境として継続が可能な場合

• $ErrorActionPreference の値により制御される

– SilentlyContinue: エラーメッセージを抑止して継続

– Continue : エラーメッセージを出力して継続

– Stop : 実行を停止

– Inquire : 実行を継続するかユーザーに確認(プロンプト表示)

• 共通パラメータ : -ErrorAction

– 基本的に、全てのコマンドレットでサポートされるパラメータ

– -ErorAction を設定すると $ErrorActionPreference の動作を上書きできる

39

Demo 08

Page 40: IT Pro のための PowerShell スクリプティング

エラーの内容を参照する

• 自動変数 : $Error• これまでに発生したエラーが保存されている(ArrayList)

– $Error[0] : もっとも直近のエラー

– $Error[1] : 一つ前のエラー

– $Error[-1] : 一番古いエラー(一番最初に発生したエラー)

• 共通パラメータ : -ErrorVariable• 該当のコマンドレット内で発生したエラーを保存する変数を指定可能

• 後からエラーの内容を参照する可能性がある場合は、明示的に別の変数へ入れておいた方が処理が楽になる(かもしれない)

40

Demo 09

Page 41: IT Pro のための PowerShell スクリプティング

エラー発生時に処理を実行(例外処理)

• trap• エラーが発生した際に、trap ブロック内の処理を実行

• 処理を実行した後は、エラー発生箇所に戻って処理を再開

– trap が記述されているスコープと同じスコープの後続処理から実行

• continue キーワード

– trap した際にエラー出力を抑止する

• break キーワード

– 後続処理を実行しない(処理を停止する)

41

Demo 10

Page 42: IT Pro のための PowerShell スクリプティング

エラー発生時に処理を実行(例外処理)

• try ... catch ... finally• try ブロック内のエラーを捕捉し、処理を実行

• catch するエラーオブジェクトを指定可能

– エラーオブジェクトの種類ごとに処理を記述できる

• finally ブロックで後処理が可能

– finally ブロックは、エラーが発生したかどうかに関係なく実行される

• 構造化されており、trap よりもスコープが明確

42

Demo 11

Page 43: IT Pro のための PowerShell スクリプティング

外部の状態に応じて処理を実行

• スクリプト外の処理状態に応じて、処理を実行する• 別のスクリプトが出力したファイルを利用する

• OS やサービス等の状態に応じて処理を実行する

• 待ち合わせる方法• 特定の状態になるまで、スクリプト内部でチェックしながら待つ

– コマンドレットによっては -Wait パラメータを利用可能

• 繰り返しタスクとしてスクリプトを登録し、特定の状態のときのみ処理を実行する

• イベントハンドラを登録し、イベントをトリガーに実行する

• 外部の処理を含めた処理全体をワークフローとして記述する

43

Page 44: IT Pro のための PowerShell スクリプティング

イベントによる制御

• イベント• オブジェクトの状態変化

• イベントトリガーで処理を実施• イベントのサブスクライブを行うことで、イベントが発生した際に通知を

受け取ることが可能

• 特定のイベントが発生した際に実行する処理を、イベントハンドラとして登録

• 例えば• 特定のフォルダーにファイルが配置されたら処理を行う

• 特定のプロセスがダウンしたら処理を行う

44

Demo 12

Page 45: IT Pro のための PowerShell スクリプティング

通知

• メールで通知• Send-MailMessage コマンドレットを使用

• 送信用の SMTP サーバーが別途必要

• イベントログに出力• Write-EventLog コマンドレットを使用

• イベントソースの指定が必要

– 既存のイベントソースを流用する

– 事前に、スクリプト用のイベントソースを登録する

45

Page 46: IT Pro のための PowerShell スクリプティング

イベントログへ出力

• イベントソースを登録• New-EventLog -LogName <LogName> -Source <SourceName>

– 既存の <LogName> を指定すると、<SourceName> が登録される

– 存在しない <LogName> を指定すると、新規にイベントログを作成する

• 場合によっては管理者権限が必要

• イベントログの出力• Write-EventLog -LogName <LogName> -EntryType <Type>

-Source <SourceName> -EventId <N>-Message <Message>

• <Type> は Error, Warning, Information, SuccessAudit, FailureAudit

46

Demo 13

Page 47: IT Pro のための PowerShell スクリプティング

認証情報の取得・保存

• 認証情報の取得• Get-Credential でプロンプトから取得

• ユーザー名とパスワードから PSCredential オブジェクトを生成

• PSCredential 内のパスワード• System.Security.SecureString として保持

• ファイルに保存する場合は、Convert が必要

– ConvertFrom-SecureString

– ConvertTo-SecureString

– ファイルのアクセス権に注意

• 実行ユーザーが変わる場合は注意

• 実行ユーザーは生パスワードを取得可能

47

Demo 14

Page 48: IT Pro のための PowerShell スクリプティング

リモート接続・リモート処理

• New-PSSession• Credential 等を指定して、新規のセッションを作成(確立)する

• Invoke-Command• New-PSSession で作成したセッションを使用してコマンドを実行する

– -Session パラメータ

• Invoke-Command で直接セッションを確立して実行することも可能

– Invoke-Command の終了時、セッションも終了する

– 同一のセッションを再利用したい場合は、New-PSSession を使用する

48

Page 49: IT Pro のための PowerShell スクリプティング

実行環境の差異に注意する

• 作成環境と実行環境は同一とは限らない• OS のバージョンが異なるVersion

• PowerShell(WMF)のバージョンが異なる

• インストールされている PowerShell モジュールが異なる

• インストールされている外部コマンドが異なる

• etc...

• 異なる環境で実行される可能性を考慮する• 実行環境(PowerShell Version)を制限する

• 複数の環境で動作するようスクリプトを記述する

• リソースのチェックやエラー制御を適切に行う

49

Demo 15

Page 50: IT Pro のための PowerShell スクリプティング

実行可能な環境を制限する

• 特定の PowerShell バージョンを要求する• #requires –version <version>

50

Demo 16

Page 51: IT Pro のための PowerShell スクリプティング

バージョンを判定し動作を分ける

• PowerShell のバージョンを判定する• $PSVersionTable.PSVersion(PowerShell 2.0 以降)

• PowerShell 1.0 は $PSVersionTable が存在しない

• OS のバージョンを判定する• Get-WmiObject Win32_OperatingSystem

• [System.Environment]::OSVersion

51

Demo 17

Page 52: IT Pro のための PowerShell スクリプティング

ストリクトモード

• ストリクトモードを設定する• Set-StrictMode –Version Latest

• Version 2.0 (現在の Latest)

– 初期化されていない変数の参照禁止

– 存在しないプロパティのアクセス禁止

– メソッド形式での関数呼び出し禁止

– 名前なし変数の禁止

• オフにする場合

– Set-StrictMode –Off

• 設定したスコープ(と子スコープ)のみ有効

• http://technet.microsoft.com/ja-jp/library/hh849692.aspx

52

Page 53: IT Pro のための PowerShell スクリプティング

スクリプトの動作を確認する

53

Page 54: IT Pro のための PowerShell スクリプティング

作成したスクリプトの動作確認

• PowerShell ISE 上で実行する• スクリプト全体を実行

• 範囲を選択して実行

• ブレークポイントの設定とブレークポイントでの停止 / 再開

• ステップ実行

• コンソールと ISE では、一部動作 (挙動) が異なる• 外部コマンドの呼び出し制約

– $psUnsupportedConsoleApplications

• OS と WMF のバージョンの組み合わせによっては、コマンドの出力結果

54

Demo 18

Page 55: IT Pro のための PowerShell スクリプティング

デバッグ情報の出力

• トレースレベルの設定• Set-PSDebug -Trace <N>

– 0 : トレース無効

– 1 : 実行されるスクリプトの各行をトレース

– 2 : スクリプト行、変数の代入、関数呼び出し、スクリプトをトレース

• 自動変数• $DebugPreference と $DebugPreference

• 共通パラメータ• -Debug と -Verbose

55

Page 56: IT Pro のための PowerShell スクリプティング

スクリプトを展開する

56

Page 57: IT Pro のための PowerShell スクリプティング

スクリプトの実行許可

• スクリプトの実行やコンフィグレーションのロード• 実行ポリシー (Execution Policy) によって制御される

• 既定値では、スクリプトの実行が禁止されている

– Windows Server 2012 R2 以外

• 実行ポリシーの確認と変更• Get-ExecutionPolicy / Set-ExecutionPolicy

• グループポリシーによる設定

– コンピューターポリシー / ユーザーポリシー

• PowerShell 起動時のオプションで指定

– powershell.exe -ExecutionPolicy <Policy>

57

Page 58: IT Pro のための PowerShell スクリプティング

実行ポリシー

• 実行ポリシーは以下の 6 種類 (5 段階 + “未定義”)• Restricted : スクリプトの実行を禁止する

• AllSigned : 有効な署名付きのスクリプトのみ実行可能

• RemoteSigned : ローカルのスクリプトは無条件に実行可能リモートから取得したスクリプトには署名が必要

• Unrestricted : スクリプトは実行可能 (一部警告表示あり)

• Bypass : スクリプトは実行可能 (警告表示なし)

• Undefined : 未定義

• 規定値は Undefined• Windows Server 2012 R2 のみ RemoteSigned (LocalMachine Scope)

• 全てのスコープで Undefined の場合、Restricted とみなされる

58

Page 59: IT Pro のための PowerShell スクリプティング

実行ポリシーのスコープ

• 実行ポリシーはスコープごとに設定可能• MachinePolicy : グループポリシーによる設定 (Computer)

• UserPolicy : グループポリシーによる設定 (User)

• Process : 実行中の PowerShell セッション内のみ有効

• CurrentUser : ログインユーザーの設定 (レジストリに格納)

• LocalMachine : ローカルコンピューターの設定 (レジストリに格納)

• 上位スコープの設定が優先される

• 基本的には管理者権限で設定を行う• Process / CurrentUser スコープは一般ユーザー権限で設定変更可能

• LocalMachine スコープでスクリプト実行を禁止していても、Process スコープで実行を許可することで、一時的なスクリプトの実行が可能

59

Page 60: IT Pro のための PowerShell スクリプティング

リモート接続の構成

• リモート コンピューターへ接続して操作を行う• WS-Management を使用してリモートコンピューターの WinRM

(Windows Remote Management) サービスへ接続する

• 事前にリモート接続の構成が必要

– Windows Server 2012 R2 では、同一セグメントからのリモート接続がデフォルトで許可されている

• とりあえず接続したい場合は以下を実行 (検証環境向け)

– 接続先 : Enable-PSRemoting -Force

– 接続元 : Set-Item WSMan:¥localhost¥Client¥TrustedHosts -Value *

– 本番環境へ適用する際は、設定の意味を理解してセキュリティを考慮する

• Get-Help about_Remote

– http://technet.microsoft.com/en-us/library/hh847900.aspx

60

Page 61: IT Pro のための PowerShell スクリプティング

リモート接続の要件

• リモート接続の要件を満たすようコンピューターを構成する• WinRM サービスが起動している

• WinRM のエンドポイントが適切に構成されている

• Windows Firewall やその他の Firewall 製品で通信が許可されている

– ネットワークロケーションがパブリック ネットワークの場合、PowerShell のバージョン / OS によって Enable-PSRemoting の挙動が異なるので注意

• 接続先コンピューターの Administrators グループに所属しているか、権限が適切に構成されている

• 接続先に対する資格情報の送信が許可されている

– ドメインに参加しているか、TrustedHosts が適切に構成されている

• Get-Help about_Remote_Requirements

– http://technet.microsoft.com/en-us/library/hh847859.aspx

61

Page 62: IT Pro のための PowerShell スクリプティング

リモート接続時の注意点

• PowerShell のバージョンによりセッションの扱いが異なる• PowerShell 2.0 / WinRM 2.0 では接続元側でセッション情報を保持

• PowerShell 3.0 / WinRM 3.0 以降は接続先側でセッション情報を保持

– セッションを切断し、別の接続元から同一のセッションへ再接続が可能

• トラブルが少ない構成• ドメイン環境

• Domain Admins グループのユーザーを使用

• WMF (Windows Management Framework) 3.0(PowerShell 3.0 / WinRM 3.0) 以降を使用

62

Page 63: IT Pro のための PowerShell スクリプティング

実行方法

• ユーザーが任意に実行• スクリプトファイルを powershell.exe から実行

• 登録されたタスクを手動実行

• 決められた時刻に自動実行(スケジュールタスク)• タスクスケジューラに登録

• 特定の状態に変化したら実行(イベント)• イベントトリガーで実行

63

Page 64: IT Pro のための PowerShell スクリプティング

タスクスケジューラからスクリプトを実行

• タスクスケジューラにタスクを登録• 実行するコマンド(実行ファイル)は powershell.exe

• -Command “<script path>” を指定

• 実行ユーザーに注意する• スクリプト内の処理を実行する権限があるか

– 特権モード、所属グループ、NTFS ACL、委任、etc...

• 保存された Credential を使用する場合は、実行ユーザーで Credential が保存されているか

• 実行環境(プロファイル)に問題はないか

– プロファイル、UAC、etc...

64

Page 65: IT Pro のための PowerShell スクリプティング

Azure の操作を自動化

• Azure サービスのコントロール• Azure PowerShell を使用

• 仮想マシン内の OS のコントロールは、通常の OS と同様

• サービスコントロール用の認証情報• Add-AzureAccount ではなく、Get-AzurePublishSettingsFile を使う

– Azure Active Directory 認証ではなく、証明書認証

– Azure AD の認証は 12 時間で Expire するので注意

– 証明書であれば、証明書の有効期限(かつ、サブスクリプションの有効期限)まで利用可能

65

Page 66: IT Pro のための PowerShell スクリプティング

Azure の操作を自動化

• Azure AD で認証されている状態

66

Page 67: IT Pro のための PowerShell スクリプティング

Azure の操作を自動化

• 証明書が登録されている状態

67

Page 68: IT Pro のための PowerShell スクリプティング

Tips

68

Page 69: IT Pro のための PowerShell スクリプティング

単位変換

• バイトの単位• KB, MB, GB, TB, PB がキーワードとして登録されている

– 1KB : 1024

– 1MB : 1048576

– 1GB : 1073741824

– 1TB : 1099511627776

– 1PB : 1125899906842624

• 大文字、小文字は区別されない

– 1KB = 1kB = 1Kb = 1kb = 1024

• EB, ZB, YB は変換できない

69

Page 70: IT Pro のための PowerShell スクリプティング

文法やコマンドレットの確認

• 困ったときはヘルプを見る• Get-Help about_*

• Get-Help <Cmdlet> -Full

• 使えそうなコマンドがないか調べる• Get-Command

• <Cmdlet> | Get-Member

• <Cmdlet>.GetType()

70

Page 71: IT Pro のための PowerShell スクリプティング

まとめ

• PowerShell によるスクリプト作成は難しくない

• スクリプトの利用用途を考慮して、記述レベルを検討する

• 破壊的な捜査を行う前には必ずチェックする

• エラー処理は必要に応じて実施する

• 困ったらとりあえず動かしてみる(検証環境で)

71

Page 72: IT Pro のための PowerShell スクリプティング

参考資料

• Scripting with Windows PowerShell(TechNet)• http://technet.microsoft.com/en-us/library/bb978526.aspx

• Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版(安納さん)• http://www.slideshare.net/junichia/windows-powershell-30-

windows-server-2012

• Windows PowerShell ポケットリファレンス(牟田口さん)• http://gihyo.jp/book/2013/978-4-7741-5542-5

※TechNet は英語版のページを参照しましょう

72

Page 73: IT Pro のための PowerShell スクリプティング

73

Q & A

Page 74: IT Pro のための PowerShell スクリプティング

ご清聴ありがとうございました

74

Thank You!