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
変数とスコープ Demo 01 変数 : 値を格納するための場所 ( 入れ物 ) $ を先頭に付ける 参照可能な範囲 ( スコープ ) がある 関数内 ブロック内 スクリプト内で宣言された変数は 原則として外部からは参照できない 可能な限りグローバル変数は使用しない 変数のスコープ グローバル : どこからでも参照可能 スクリプト : 同一スクリプト内であれば参照可能 ( ローカル ): 同一ブロックまたは子ブロック内であれば参照可能 プライベート : 同一ブロック内のみ参照可能 16
変数とスコープ Demo 02 ドットソース形式での読み込み スクリプト内の変数をグローバル変数として取り込む. <ScriptPath> 変数初期化 ( 定義 ) 用のファイルを分割したい場合等に利用可能 通常のスクリプトファイルに対しては使用しない方が良い グローバル変数を無暗に増やさない 不要な変数がある場合やグローバル変数が競合する場合は 削除する Remove-Variable 17
ヒアドキュメント Demo 03 スクリプト内に文字列を埋め込むことが可能 @ < 複数行文字列 > @ @ の直後に改行が必須 主に テスト時や簡単なスクリプトで使用 スクリプトに埋め込むことになるので 保守性が悪い 本格的に運用 ( 使用 ) する場合は 外部ファイルから読み込む 18
条件分岐 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
パイプラインの処理 Demo 04 <Cmdlet1> <Cmdlet2> <Cmdlet3> Cmdlet1 の出力オブジェクト全体が Cmdlet2 に渡されるわけではない Cmdlet1 の出力がコレクション ( 配列 ) の場合 1. <Cmdlet1> の出力の一つ目のオブジェクトが <Cmdlet2> に渡される 2. <Cmdlet2> は一つ目のオブジェクトを処理し <Cmdlet3> へ渡す 3. <Cmdlet3> でも一つ目のオブジェクトが処理される 4. 上記を すべてのオブジェクトに対して実行 はじめは あまり気にしなくても OK 29
Foreach-Object Demo 05 パイプラインの中での繰り返し処理 通常は Foreach-Object を使用 エイリアスは %, foreach foreach ステートメントと混同しないように注意 オブジェクトの配列を受け取り 各要素に処理 <scriptblock> を実行 Foreach-Object <scriptblock> <scriptblock> のなかでは 自動変数 $_ に各オブジェクトが設定される 30
データ ( オブジェクト ) の取得 操作対象となるオブジェクトを取得する オブジェクト またはオブジェクトの集合 ( 配列 コレクション etc...) 専用のコマンドレットで取得 Get-ADUser, Get-WindowsFeature, etc... 汎用のコマンドレットで取得 Get-Item, Get-ItemProperty, etc... ファイルから読み込み Import-CSV, [xml](get-content) 自力でデータソースにアクセスして取得 31
ファイルの読み込み Demo 06 テキストファイルとして読み込む 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 07 XML として読み込む [xml](get-content Path <path>) 文字列から XML オブジェクト (XMLDocument) を生成 33
フィルタリング オブジェクトを抽出する ( 絞り込む ) 通常は 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 Write-Verbose Write-Debug ストリーム 3 へ出力 ストリーム 4 へ出力 ストリーム 5 へ出力 38
エラー発生時の動作 Demo 08 エラー発生時 デフォルトではスクリプトの実行を継続しようとする スクリプト実行環境として継続が可能な場合 $ErrorActionPreference の値により制御される SilentlyContinue: エラーメッセージを抑止して継続 Continue : エラーメッセージを出力して継続 Stop : 実行を停止 Inquire : 実行を継続するかユーザーに確認 ( プロンプト表示 ) 共通パラメータ : -ErrorAction 基本的に 全てのコマンドレットでサポートされるパラメータ -ErorAction を設定すると $ErrorActionPreference の動作を上書きできる 39
エラーの内容を参照する Demo 09 自動変数 : $Error これまでに発生したエラーが保存されている (ArrayList) $Error[0] : もっとも直近のエラー $Error[1] : 一つ前のエラー $Error[-1] : 一番古いエラー ( 一番最初に発生したエラー ) 共通パラメータ : -ErrorVariable 該当のコマンドレット内で発生したエラーを保存する変数を指定可能 後からエラーの内容を参照する可能性がある場合は 明示的に別の変数へ入れておいた方が処理が楽になる ( かもしれない ) 40
エラー発生時に処理を実行 ( 例外処理 ) Demo 10 trap エラーが発生した際に trap ブロック内の処理を実行 処理を実行した後は エラー発生箇所に戻って処理を再開 trap が記述されているスコープと同じスコープの後続処理から実行 continue キーワード trap した際にエラー出力を抑止する break キーワード 後続処理を実行しない ( 処理を停止する ) 41
エラー発生時に処理を実行 ( 例外処理 ) Demo 11 try... catch... finally try ブロック内のエラーを捕捉し 処理を実行 catch するエラーオブジェクトを指定可能 エラーオブジェクトの種類ごとに処理を記述できる finally ブロックで後処理が可能 finally ブロックは エラーが発生したかどうかに関係なく実行される 構造化されており trap よりもスコープが明確 42
外部の状態に応じて処理を実行 スクリプト外の処理状態に応じて 処理を実行する 別のスクリプトが出力したファイルを利用する OS やサービス等の状態に応じて処理を実行する 待ち合わせる方法 特定の状態になるまで スクリプト内部でチェックしながら待つ コマンドレットによっては -Wait パラメータを利用可能 繰り返しタスクとしてスクリプトを登録し 特定の状態のときのみ処理を実行する イベントハンドラを登録し イベントをトリガーに実行する 外部の処理を含めた処理全体をワークフローとして記述する 43
イベントによる制御 Demo 12 イベント オブジェクトの状態変化 イベントトリガーで処理を実施 イベントのサブスクライブを行うことで イベントが発生した際に通知を受け取ることが可能 特定のイベントが発生した際に実行する処理を イベントハンドラとして登録 例えば 特定のフォルダーにファイルが配置されたら処理を行う 特定のプロセスがダウンしたら処理を行う 44
通知 メールで通知 Send-MailMessage コマンドレットを使用 送信用の SMTP サーバーが別途必要 イベントログに出力 Write-EventLog コマンドレットを使用 イベントソースの指定が必要 既存のイベントソースを流用する 事前に スクリプト用のイベントソースを登録する 45
イベントログへ出力 Demo 13 イベントソースを登録 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 14 認証情報の取得 Get-Credential でプロンプトから取得 ユーザー名とパスワードから PSCredential オブジェクトを生成 PSCredential 内のパスワード System.Security.SecureString として保持 ファイルに保存する場合は Convert が必要 ConvertFrom-SecureString ConvertTo-SecureString ファイルのアクセス権に注意 実行ユーザーが変わる場合は注意 実行ユーザーは生パスワードを取得可能 47
リモート接続 リモート処理 New-PSSession Credential 等を指定して 新規のセッションを作成 ( 確立 ) する Invoke-Command New-PSSession で作成したセッションを使用してコマンドを実行する -Session パラメータ Invoke-Command で直接セッションを確立して実行することも可能 Invoke-Command の終了時 セッションも終了する 同一のセッションを再利用したい場合は New-PSSession を使用する 48
実行環境の差異に注意する Demo 15 作成環境と実行環境は同一とは限らない OS のバージョンが異なるVersion PowerShell(WMF) のバージョンが異なる インストールされている PowerShell モジュールが異なる インストールされている外部コマンドが異なる etc... 異なる環境で実行される可能性を考慮する 実行環境 (PowerShell Version) を制限する 複数の環境で動作するようスクリプトを記述する リソースのチェックやエラー制御を適切に行う 49
実行可能な環境を制限する Demo 16 特定の PowerShell バージョンを要求する #requires version <version> 50
バージョンを判定し動作を分ける Demo 17 PowerShell のバージョンを判定する $PSVersionTable.PSVersion(PowerShell 2.0 以降 ) PowerShell 1.0 は $PSVersionTable が存在しない OS のバージョンを判定する Get-WmiObject Win32_OperatingSystem [System.Environment]::OSVersion 51
ストリクトモード ストリクトモードを設定する Set-StrictMode Version Latest Version 2.0 ( 現在の Latest) 初期化されていない変数の参照禁止 存在しないプロパティのアクセス禁止 メソッド形式での関数呼び出し禁止 名前なし変数の禁止 オフにする場合 Set-StrictMode Off 設定したスコープ ( と子スコープ ) のみ有効 http://technet.microsoft.com/ja-jp/library/hh849692.aspx 52
スクリプトの動作を確認する 53
作成したスクリプトの動作確認 Demo 18 PowerShell ISE 上で実行する スクリプト全体を実行 範囲を選択して実行 ブレークポイントの設定とブレークポイントでの停止 / 再開 ステップ実行 コンソールと ISE では 一部動作 ( 挙動 ) が異なる 外部コマンドの呼び出し制約 $psunsupportedconsoleapplications OS と WMF のバージョンの組み合わせによっては コマンドの出力結果 54
デバッグ情報の出力 トレースレベルの設定 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
Q & A 73
Thank You! ご清聴ありがとうございました 74