it pro のための powershell スクリプティング

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

Upload: kazuki-takai

Post on 28-May-2015

4.391 views

Category:

Technology


0 download

DESCRIPTION

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

TRANSCRIPT

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!