Upload
kazuki-takai
View
4.391
Download
0
Embed Size (px)
DESCRIPTION
Cloud OS MVP Roadshow 2014年6月 (2014/06/14 開催) のセッション資料です。
Citation preview
Cloud OS MVP Roadshow 2014 年 6 月 Cloud OS Tech Day!
IT Pro のためのPowerShell スクリプティング
高井 一輝System Center User Group Japan
自己紹介
• 高井 一輝 (Takai Kazuki)
• 某 ISP 勤務• クラウドとオンプレミスを組み合わせたインテグレーション
• 見積り、提案書の作成から設計、構築、試験、運用まで
• ネットワーク、サーバ (Windows、Linux)
• System Center User Group Japan (SCUGJ)
• Twitter : @zhuky7 / Facebook : kazuki.takai
• Blog : http://operationslab.wordpress.com/
2
本日の内容
• お話すること• PowerShell についてのおさらい
– スクリプトを記述するうえで必要となる内容
– スクリプトを実行するために必要となる内容
• スクリプトでやりたいことを実現するためのパーツ
• スクリプトを作成するうえで注意すべきこと
• お話しないこと• PowerShell コマンドレットの実行方法
• PowerShell Remoting の仕組み
• PowerShell Workflow
• 個々の製品の具体的な管理方法
3
このセッションのゴール
• 簡単な PowerShell スクリプトを作成できる
• 目的に応じてスクリプトを作成できる
• スクリプトの実行、運用ができる
4
本日の環境
• Windows 7 Professional with WMF 4.0
• Windows Server 2012 R2
5
アジェンダ
• Windows PowerShell の基礎
• スクリプトを作成する
• スクリプトの動作を確認する
• スクリプトを展開する
6
Windows PowerShell の基礎
7
PowerShell とは
• Windows で利用可能な新しいシェル / スクリプト言語• Windows Server 2008 R2 以降で標準搭載
• コマンドプロンプトよりも高度な処理 / 制御が可能
• WSH よりもスクリプトの記述が容易
• Character-based User Interface
• テキストベースではなくオブジェクトベース• パイプラインを流れるのはオブジェクト
• 豊富なコマンドレット• PowerShell 本体で用意されているコマンドレット
• Windows Server OS や役割 / 機能に付随するコマンドレット
• 特定の製品やサービスに付随するコマンドレット8
オブジェクトベース
• コマンドレットの入力、出力はオブジェクト• コンソールに出力する際は、オブジェクトを文字列に変換している
• パイプラインを流れるのはオブジェクト
• オブジェクトベースなので…• 一部のプロパティ(列)だけ取り出して加工できる
– アカウントの一覧から “アカウント名” と “最終ログイン日時” だけ取り出す
• プロパティの値を使ってフィルタリングできる
– Windows の役割・機能の一覧から、インストールされているものだけ取り出す
• オブジェクトの状態を操作できる
9
現在の最新版
• 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
基本事項のおさらい
• PowerShell 実行環境
• 演算子
• リダイレクト
• 変数とスコープ
• ヒアドキュメント
• 条件分岐
• 繰り返し
11
PowerShell 実行環境
• PowerShell (PowerShell コンソール)• powershell.exe
• 通常の PowerShell 環境
• PowerShell ISE (Integrated Scripting Environment)• powershell_ise.exe
• スクリプト作成 / デバッグ用の環境
– ブレークポイントの設定
– スクリプトの一部を選択して実行 (選択範囲を実行)
12
演算子
• 算術演算子(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
演算子
• リダイレクト演算子(about_Redirection)• 後述
• 分割/結合演算子(about_Split / about_Join)• -split, -join
• 型演算子(about_Type_Operators)• -is, -isnot, -as
• 単項演算子(about_Operators)• $a++, $a—
• 特殊演算子(about_Operators)• @(), [], &, |, .., ::, etc...
14
リダイレクト
• リダイレクト演算子• ストリームの出力先を変更
> 標準ストリームをファイルに保存(既存ファイルは上書き)
>> 標準ストリームをファイルに保存(既存ファイルに追記)
2> エラーストリームをファイルに保存(既存ファイルは上書き)
2>> エラーストリームをファイルに保存(既存ファイルに追記)
2>&1 エラーストリームを標準ストリームと同じ場所へ出力
• ストリーム番号
– 2:エラー 3:警告 4:詳細 5:デバッグ
• 出力文字コードは UTF-16 になるので注意
– 文字コードを変換しつつ出力する場合は、Out-File 等を利用
15
変数とスコープ
• 変数:値を格納するための場所(入れ物)• $ を先頭に付ける
• 参照可能な範囲(スコープ)がある
– 関数内、ブロック内、スクリプト内で宣言された変数は、原則として外部からは参照できない
– 可能な限りグローバル変数は使用しない
• 変数のスコープ• グローバル:どこからでも参照可能
• スクリプト:同一スクリプト内であれば参照可能
• (ローカル):同一ブロックまたは子ブロック内であれば参照可能
• プライベート:同一ブロック内のみ参照可能
16
Demo 01
変数とスコープ
• ドットソース形式での読み込み• スクリプト内の変数をグローバル変数として取り込む
• . <ScriptPath>
• 変数初期化(定義)用のファイルを分割したい場合等に利用可能
• 通常のスクリプトファイルに対しては使用しない方が良い
– グローバル変数を無暗に増やさない
• 不要な変数がある場合やグローバル変数が競合する場合は、削除する
– Remove-Variable
17
Demo 02
ヒアドキュメント
• スクリプト内に文字列を埋め込むことが可能• @’
<複数行文字列>‘@
• @’ の直後に改行が必須
• 主に、テスト時や簡単なスクリプトで使用• スクリプトに埋め込むことになるので、保守性が悪い
• 本格的に運用(使用)する場合は、外部ファイルから読み込む
18
Demo 03
条件分岐
• 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
繰り返し
• while ステートメント• 条件を満たすまでループし続ける
• do ... while ステートメント• 条件を満たすまでループし続ける
• for ステートメント• インデックス(番号)付きで n 回(n 個)繰り返す
• foreach ステートメント• 集合(コレクション)の要素それぞれに対して処理を行う(名前付き)
• Foreach-Object (%)• 集合(コレクション)の要素それぞれに対して処理を行う(自動変数)
20
スクリプトを実行するための事前準備
• スクリプトの実行を許可する• とりあえずスクリプトを作成するコンピューター上で以下を実行
– Set-ExecutionPolicy RemoteSigned
• PowerShell Remoting を有効化する• リモート接続が必要な場合は以下を実行 (検証環境向け)
– 接続先 : Enable-PSRemoting -Force
– 接続元 : Set-Item WSMan:¥localhost¥Client¥TrustedHosts -Value *
• 詳細は後述
21
Set-ExecutionPolicy
22
Enable-PSRemoting
23
スクリプトを作成する
24
PowerShell スクリプト
• スクリプトファイル• 基本的に、コンソール上で実行する場合と同様のコマンドを記述
– 必要な処理(コマンドレット等)を列挙
• 人が考えてコマンド実行していた部分は、条件分岐やフィルタ、エラー処理等として記述
• ps1 ファイルとして保存
– UTF-8 を推奨
• PowerShell ホストを介してスクリプトを実行
– PowerShell Console 上からスクリプトファイルを実行
– powershell.exe 起動時にスクリプトファイルを指定して実行
25
スクリプトに記述する処理
• やりたいことを実現するための処理• データ(操作対象)を取得
• データ(操作対象)から不要なものを除外(フィルタリング)
• 残った項目(必要なもの)それぞれに対して処理を実行
+
• スクリプトの動作をサポートする処理• エラーハンドリング
• 外部の状態に応じて処理を実行
• 結果の通知 / ロギング
• 認証情報の取得・保持
• リモート接続・リモート処理26
スクリプトの記述レベル
• 実行時の状況に合ったスクリプトを作成、記述する• システムが自動で実行する(人の手を介さない)
– 途中で止まらない(入力待ちにならない)
– 最後まで正しく実行される、あるいは途中で正しく止まる
– 処理内容・処理結果を後から追跡できる
• 一般ユーザーが実行する
– 分かり易いメッセージを出力する(あるいは、何も出力しない)
– 実行方法、実行形式をミスしても問題が起きないようにする
• 作成者以外の IT 管理者が実行する
• 作成者のみが利用する
– 後からメンテナンスできるよう最低限コメントを記載する
– (場合によっては)エラー処理は考慮しない
27
やりたいことを実現するための処理
• 処理の基本• 取得(入力)して、抽出して、処理(または出力)する
• 複数のコマンドレット、関数等の間で、対象(オブジェクト)を受け渡す
• オブジェクトの受け渡し• 引数として入力し、出力を次のコマンドの引数へ渡す
– $a = <Cmdlet1>
– <Cmdlet2> $a
• パイプラインを使用する
– <Cmdlet1> | <Cmdlet2>
28
パイプラインの処理
• <Cmdlet1> | <Cmdlet2> | <Cmdlet3>• Cmdlet1 の出力オブジェクト全体が Cmdlet2 に渡されるわけではない
• Cmdlet1 の出力がコレクション(配列)の場合
1. <Cmdlet1> の出力の一つ目のオブジェクトが <Cmdlet2> に渡される
2. <Cmdlet2> は一つ目のオブジェクトを処理し、<Cmdlet3> へ渡す
3. <Cmdlet3> でも一つ目のオブジェクトが処理される
4. 上記を、すべてのオブジェクトに対して実行
※はじめは、あまり気にしなくても OK
29
Demo 04
Foreach-Object
• パイプラインの中での繰り返し処理• 通常は Foreach-Object を使用
• エイリアスは %, foreach
– foreach ステートメントと混同しないように注意
• オブジェクトの配列を受け取り、各要素に処理<scriptblock>を実行
– Foreach-Object <scriptblock>
– <scriptblock>のなかでは、自動変数 $_ に各オブジェクトが設定される
30
Demo 05
データ(オブジェクト)の取得
• 操作対象となるオブジェクトを取得する• オブジェクト、またはオブジェクトの集合(配列、コレクション、etc...)
• 専用のコマンドレットで取得• Get-ADUser, Get-WindowsFeature, etc...
• 汎用のコマンドレットで取得• Get-Item, Get-ItemProperty, etc...
• ファイルから読み込み• Import-CSV, [xml](Get-Content)
• 自力でデータソースにアクセスして取得31
ファイルの読み込み
• テキストファイルとして読み込む• 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
ファイルから読み込む
• XMLとして読み込む• [xml](Get-Content –Path <path>)
• 文字列から XML オブジェクト(XMLDocument)を生成
33
Demo 07
フィルタリング
• オブジェクトを抽出する(絞り込む)• 通常は 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
ファイルへ出力(保存)
• テキストファイルへ出力• Out-File <path> [-Encoding <Encode>] [-Append]
• 追記する場合は -Append スイッチを使用
• リダイレクトは文字コードを指定できないため、通常はこちらを使用
• CSV ファイルへ出力• Export-CSV –Path <path> [-Encoding <Encode>] [-Append]
• オブジェクトのプロパティを CSV 形式で出力
35
その他の出力
• Out-Null• パイプラインから渡されたオブジェクトを捨てる(UNIX の /dev/null)
• Out-String• パイプラインから渡されたオブジェクトを文字列に変換する
• Write-Host• 指定されたオブジェクトを Console へ出力する
• パイプラインには何も出力されない
• Write-Output• 指定されたオブジェクトを標準ストリーム(パイプライン)へ出力する
36
エラーハンドリング
• スクリプト実行時、エラーが発生する要因はたくさんある• ディスク容量不足
• ネットワーク切断
• 通信先のサービスダウン
• 日付、時刻、起動時間(起動後経過時間)
• スクリプトの不具合(仕様・実装)
• 処理に失敗しても致命的な状態にならないことが重用• 破壊的な操作を記述する場合は十分にチェックする
– 破壊的な操作:対象の状態を変更する操作(追加、削除、データ変更等)
– 非破壊的な操作:対象の状態を変更しない操作(何度実行しても影響がない)
37
エラーメッセージを出力する
• エラーとしてメッセージを出力する• Write-Error
• 標準エラーストリームへ出力される
• エラー扱いとなる($ErrorActionPreference の影響を受ける)
• エラーの他にも出力可能• Write-Warning ストリーム 3 へ出力
• Write-Verbose ストリーム 4 へ出力
• Write-Debug ストリーム 5 へ出力
38
エラー発生時の動作
• エラー発生時• デフォルトではスクリプトの実行を継続しようとする
– スクリプト実行環境として継続が可能な場合
• $ErrorActionPreference の値により制御される
– SilentlyContinue: エラーメッセージを抑止して継続
– Continue : エラーメッセージを出力して継続
– Stop : 実行を停止
– Inquire : 実行を継続するかユーザーに確認(プロンプト表示)
• 共通パラメータ : -ErrorAction
– 基本的に、全てのコマンドレットでサポートされるパラメータ
– -ErorAction を設定すると $ErrorActionPreference の動作を上書きできる
39
Demo 08
エラーの内容を参照する
• 自動変数 : $Error• これまでに発生したエラーが保存されている(ArrayList)
– $Error[0] : もっとも直近のエラー
– $Error[1] : 一つ前のエラー
…
– $Error[-1] : 一番古いエラー(一番最初に発生したエラー)
• 共通パラメータ : -ErrorVariable• 該当のコマンドレット内で発生したエラーを保存する変数を指定可能
• 後からエラーの内容を参照する可能性がある場合は、明示的に別の変数へ入れておいた方が処理が楽になる(かもしれない)
40
Demo 09
エラー発生時に処理を実行(例外処理)
• trap• エラーが発生した際に、trap ブロック内の処理を実行
• 処理を実行した後は、エラー発生箇所に戻って処理を再開
– trap が記述されているスコープと同じスコープの後続処理から実行
• continue キーワード
– trap した際にエラー出力を抑止する
• break キーワード
– 後続処理を実行しない(処理を停止する)
41
Demo 10
エラー発生時に処理を実行(例外処理)
• try ... catch ... finally• try ブロック内のエラーを捕捉し、処理を実行
• catch するエラーオブジェクトを指定可能
– エラーオブジェクトの種類ごとに処理を記述できる
• finally ブロックで後処理が可能
– finally ブロックは、エラーが発生したかどうかに関係なく実行される
• 構造化されており、trap よりもスコープが明確
42
Demo 11
外部の状態に応じて処理を実行
• スクリプト外の処理状態に応じて、処理を実行する• 別のスクリプトが出力したファイルを利用する
• OS やサービス等の状態に応じて処理を実行する
• 待ち合わせる方法• 特定の状態になるまで、スクリプト内部でチェックしながら待つ
– コマンドレットによっては -Wait パラメータを利用可能
• 繰り返しタスクとしてスクリプトを登録し、特定の状態のときのみ処理を実行する
• イベントハンドラを登録し、イベントをトリガーに実行する
• 外部の処理を含めた処理全体をワークフローとして記述する
43
イベントによる制御
• イベント• オブジェクトの状態変化
• イベントトリガーで処理を実施• イベントのサブスクライブを行うことで、イベントが発生した際に通知を
受け取ることが可能
• 特定のイベントが発生した際に実行する処理を、イベントハンドラとして登録
• 例えば• 特定のフォルダーにファイルが配置されたら処理を行う
• 特定のプロセスがダウンしたら処理を行う
44
Demo 12
通知
• メールで通知• Send-MailMessage コマンドレットを使用
• 送信用の SMTP サーバーが別途必要
• イベントログに出力• Write-EventLog コマンドレットを使用
• イベントソースの指定が必要
– 既存のイベントソースを流用する
– 事前に、スクリプト用のイベントソースを登録する
45
イベントログへ出力
• イベントソースを登録• 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
認証情報の取得・保存
• 認証情報の取得• Get-Credential でプロンプトから取得
• ユーザー名とパスワードから PSCredential オブジェクトを生成
• PSCredential 内のパスワード• System.Security.SecureString として保持
• ファイルに保存する場合は、Convert が必要
– ConvertFrom-SecureString
– ConvertTo-SecureString
– ファイルのアクセス権に注意
• 実行ユーザーが変わる場合は注意
• 実行ユーザーは生パスワードを取得可能
47
Demo 14
リモート接続・リモート処理
• New-PSSession• Credential 等を指定して、新規のセッションを作成(確立)する
• Invoke-Command• New-PSSession で作成したセッションを使用してコマンドを実行する
– -Session パラメータ
• Invoke-Command で直接セッションを確立して実行することも可能
– Invoke-Command の終了時、セッションも終了する
– 同一のセッションを再利用したい場合は、New-PSSession を使用する
48
実行環境の差異に注意する
• 作成環境と実行環境は同一とは限らない• OS のバージョンが異なるVersion
• PowerShell(WMF)のバージョンが異なる
• インストールされている PowerShell モジュールが異なる
• インストールされている外部コマンドが異なる
• etc...
• 異なる環境で実行される可能性を考慮する• 実行環境(PowerShell Version)を制限する
• 複数の環境で動作するようスクリプトを記述する
• リソースのチェックやエラー制御を適切に行う
49
Demo 15
実行可能な環境を制限する
• 特定の PowerShell バージョンを要求する• #requires –version <version>
50
Demo 16
バージョンを判定し動作を分ける
• PowerShell のバージョンを判定する• $PSVersionTable.PSVersion(PowerShell 2.0 以降)
• PowerShell 1.0 は $PSVersionTable が存在しない
• OS のバージョンを判定する• Get-WmiObject Win32_OperatingSystem
• [System.Environment]::OSVersion
51
Demo 17
ストリクトモード
• ストリクトモードを設定する• Set-StrictMode –Version Latest
• Version 2.0 (現在の Latest)
– 初期化されていない変数の参照禁止
– 存在しないプロパティのアクセス禁止
– メソッド形式での関数呼び出し禁止
– 名前なし変数の禁止
• オフにする場合
– Set-StrictMode –Off
• 設定したスコープ(と子スコープ)のみ有効
• http://technet.microsoft.com/ja-jp/library/hh849692.aspx
52
スクリプトの動作を確認する
53
作成したスクリプトの動作確認
• PowerShell ISE 上で実行する• スクリプト全体を実行
• 範囲を選択して実行
• ブレークポイントの設定とブレークポイントでの停止 / 再開
• ステップ実行
• コンソールと ISE では、一部動作 (挙動) が異なる• 外部コマンドの呼び出し制約
– $psUnsupportedConsoleApplications
• OS と WMF のバージョンの組み合わせによっては、コマンドの出力結果
54
Demo 18
デバッグ情報の出力
• トレースレベルの設定• Set-PSDebug -Trace <N>
– 0 : トレース無効
– 1 : 実行されるスクリプトの各行をトレース
– 2 : スクリプト行、変数の代入、関数呼び出し、スクリプトをトレース
• 自動変数• $DebugPreference と $DebugPreference
• 共通パラメータ• -Debug と -Verbose
55
スクリプトを展開する
56
スクリプトの実行許可
• スクリプトの実行やコンフィグレーションのロード• 実行ポリシー (Execution Policy) によって制御される
• 既定値では、スクリプトの実行が禁止されている
– Windows Server 2012 R2 以外
• 実行ポリシーの確認と変更• Get-ExecutionPolicy / Set-ExecutionPolicy
• グループポリシーによる設定
– コンピューターポリシー / ユーザーポリシー
• PowerShell 起動時のオプションで指定
– powershell.exe -ExecutionPolicy <Policy>
57
実行ポリシー
• 実行ポリシーは以下の 6 種類 (5 段階 + “未定義”)• Restricted : スクリプトの実行を禁止する
• AllSigned : 有効な署名付きのスクリプトのみ実行可能
• RemoteSigned : ローカルのスクリプトは無条件に実行可能リモートから取得したスクリプトには署名が必要
• Unrestricted : スクリプトは実行可能 (一部警告表示あり)
• Bypass : スクリプトは実行可能 (警告表示なし)
• Undefined : 未定義
• 規定値は Undefined• Windows Server 2012 R2 のみ RemoteSigned (LocalMachine Scope)
• 全てのスコープで Undefined の場合、Restricted とみなされる
58
実行ポリシーのスコープ
• 実行ポリシーはスコープごとに設定可能• MachinePolicy : グループポリシーによる設定 (Computer)
• UserPolicy : グループポリシーによる設定 (User)
• Process : 実行中の PowerShell セッション内のみ有効
• CurrentUser : ログインユーザーの設定 (レジストリに格納)
• LocalMachine : ローカルコンピューターの設定 (レジストリに格納)
• 上位スコープの設定が優先される
• 基本的には管理者権限で設定を行う• Process / CurrentUser スコープは一般ユーザー権限で設定変更可能
• LocalMachine スコープでスクリプト実行を禁止していても、Process スコープで実行を許可することで、一時的なスクリプトの実行が可能
59
リモート接続の構成
• リモート コンピューターへ接続して操作を行う• 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
リモート接続の要件
• リモート接続の要件を満たすようコンピューターを構成する• 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
リモート接続時の注意点
• 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
実行方法
• ユーザーが任意に実行• スクリプトファイルを powershell.exe から実行
• 登録されたタスクを手動実行
• 決められた時刻に自動実行(スケジュールタスク)• タスクスケジューラに登録
• 特定の状態に変化したら実行(イベント)• イベントトリガーで実行
63
タスクスケジューラからスクリプトを実行
• タスクスケジューラにタスクを登録• 実行するコマンド(実行ファイル)は powershell.exe
• -Command “<script path>” を指定
• 実行ユーザーに注意する• スクリプト内の処理を実行する権限があるか
– 特権モード、所属グループ、NTFS ACL、委任、etc...
• 保存された Credential を使用する場合は、実行ユーザーで Credential が保存されているか
• 実行環境(プロファイル)に問題はないか
– プロファイル、UAC、etc...
64
Azure の操作を自動化
• Azure サービスのコントロール• Azure PowerShell を使用
• 仮想マシン内の OS のコントロールは、通常の OS と同様
• サービスコントロール用の認証情報• Add-AzureAccount ではなく、Get-AzurePublishSettingsFile を使う
– Azure Active Directory 認証ではなく、証明書認証
– Azure AD の認証は 12 時間で Expire するので注意
– 証明書であれば、証明書の有効期限(かつ、サブスクリプションの有効期限)まで利用可能
65
Azure の操作を自動化
• Azure AD で認証されている状態
66
Azure の操作を自動化
• 証明書が登録されている状態
67
Tips
68
単位変換
• バイトの単位• KB, MB, GB, TB, PB がキーワードとして登録されている
– 1KB : 1024
– 1MB : 1048576
– 1GB : 1073741824
– 1TB : 1099511627776
– 1PB : 1125899906842624
• 大文字、小文字は区別されない
– 1KB = 1kB = 1Kb = 1kb = 1024
• EB, ZB, YB は変換できない
69
文法やコマンドレットの確認
• 困ったときはヘルプを見る• Get-Help about_*
• Get-Help <Cmdlet> -Full
• 使えそうなコマンドがないか調べる• Get-Command
• <Cmdlet> | Get-Member
• <Cmdlet>.GetType()
70
まとめ
• PowerShell によるスクリプト作成は難しくない
• スクリプトの利用用途を考慮して、記述レベルを検討する
• 破壊的な捜査を行う前には必ずチェックする
• エラー処理は必要に応じて実施する
• 困ったらとりあえず動かしてみる(検証環境で)
71
参考資料
• 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
73
Q & A
ご清聴ありがとうございました
74
Thank You!