Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

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

10 035 vues

Publié le

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

Publié dans : Technologie
  • Soyez le premier à commenter

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

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

×