...

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

by user

on
Category: Documents
19

views

Report

Comments

Transcript

IT Pro のための PowerShell スクリプティング
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.
2.
3.
4.
<Cmdlet1> の出力の一つ目のオブジェクトが <Cmdlet2> に渡される
<Cmdlet2> は一つ目のオブジェクトを処理し、<Cmdlet3> へ渡す
<Cmdlet3> でも一つ目のオブジェクトが処理される
上記を、すべてのオブジェクトに対して実行
※はじめは、あまり気にしなくても 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” }
• ? Name –eq “suzuki”
? { $_.Installed }
? 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
UserPolicy
Process
CurrentUser
LocalMachine
:
:
:
:
:
グループポリシーによる設定 (Computer)
グループポリシーによる設定 (User)
実行中の PowerShell セッション内のみ有効
ログインユーザーの設定 (レジストリに格納)
ローカルコンピューターの設定 (レジストリに格納)
• 上位スコープの設定が優先される
• 基本的には管理者権限で設定を行う
• 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
1MB
1GB
1TB
1PB
:
:
:
:
:
1024
1048576
1073741824
1099511627776
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-30windows-server-2012
• Windows PowerShell ポケットリファレンス(牟田口さん)
• http://gihyo.jp/book/2013/978-4-7741-5542-5
※TechNet は英語版のページを参照しましょう
72
Q&A
73
Thank You!
ご清聴ありがとうございました
74
Fly UP