More Related Content Similar to Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版 (20) More from junichi anno (17) Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版1. 1
Windows PowerShell による
Windows Server 管理 V 4.0 2014.3.13 版
日本マイクロソフト株式会社
エバンジェリスト
安納 順一
http://blogs.technet.com/junihia/
第1部 基礎から学ぼう
Part1 基礎の基礎編
Part2 リモーティング編
Part3 バックグラウンドジョブ編
Part4 ワークフロー編
Part5 開発者編
第2部 Hyper-V の管理
Part1 Hyper-V の立ち上げまで
Part2 ライブマイグレーション
3. 3
第1部 ~ PowerShell を基礎から学ぼう
Part1 基礎の基礎編
1.Windows PowerShell の位置づけ
2.基本的なコマンドレットと書式の基礎
3.基本的な文法とスクリプトの作り方
4.Tips
Part2 リモーティング編
5.リモーティングの準備と基礎
6.-ComputerNameを使用したリモート操作
7.PS セッションとは
8.コネクションの永続化と再利用可能なPSセッション
9.Windows PowerShell Web Access(PSWA)
Part3 バックグラウンドジョブ
10. バックグラウンドジョブ
Part4 ワークフロー編
11. Windows PowerShell Workflow とは
12. Windows PowerShell Workflow の基礎
13. ワークフロー特有の記述
14. ワークフロージョブとデータの永続化
Part5 開発者編
15. 開発者にとっての Windows PowerShell とは
16. 開発者のための Windows PowerShell 基礎知識
17. 開発者として必要な情報の取得
18. コマンドレット以外からオブジェクトのインスタン
スを作成する
19. Visual Studio(C#)から PowerShell を呼び出す
Windows PowerShell には他にもさまざまなテクニックが用意されています。特に、バック
グラウンドジョブの概念はシステム管理を行う上で重要です。
6. 6
Windows PowerShell の位置づけ
Windows Familiar – インフラエンジニアから見ると
• Windows Script(WSH)に変わる管理プラットフォーム
• 高機能なスクリプティング機能による自動管理
• WinRM を介したリモートサーバー管理
Windows Familiar – 開発者 から見ると
• 高機能なクラスライブラリ
• コーディング、テスティングの大幅なコスト削減
Non-Windows Familiar から見ると
• OMI(Open Management Infrastructure)を実装したリモートサーバー
• 手元のプラットフォームからリモート管理が可能
• 使い慣れた言語からリモート管理が可能
7. 7
代表的なスクリプト言語
バッチファイル(拡張子 .bat)
VBScript(拡張子 .vbs)
PowerShell(拡張子 .ps1)
Jscript(拡張子 .js)
MS-DOS時代から使われてきたコマンドシェル上のスクリプト。脈々と現代に引き継がれて
おり、利用者が多い。豊富なコマンド群によって支えられており、案外使い出がある。複数
のスクリプトを取りまとめる役割としても便利。
Visual Basic のスクリプト版。「Visual」とあるが、Visual ではない。わかりやすい文法と、
緩い規則によって根強いファンが多い。亜種として VBA もあるが微妙に文法は異なる。
JavaScript のMS 実装版として、VBScript とともに登場。JavaScript を Microsoft の独自
仕様によって拡張することで、汎用性を増している。
いわずと知れた高機能スクリプト言語。.NET Framework が使えると言うメリットから、利
用者は爆発的に増殖中。多くの製品がPowerShell用のコマンドレットを提供しており、
Windows Script Host は Server Coreのメニュー程度でしかお目にかかれなくなりつつある。
Windows
Script
今後エンハンスの予定は無い
OSに合わせて継続的なエンハンス
今後エンハンスの予定は無い
10. 10
VBScript vs PowerShell
Exchange 2003 (VBScript) Exchange 2007(PowerShell)
メール
ボックス
統計
Set listExchange_Mailboxs =
GetObject("winmgmts:{impersonationLevel=impersonate}!¥¥COMPUTERNAME¥ROOT¥MicrosoftExchangeV2").InstancesOf("Excha
nge_Mailbox")
For Each objExchange_Mailbox in listExchange_Mailboxs
WScript.echo "AssocContentCount =” + objExchange_Mailbox.AssocContentCount
WScript.echo " DateDiscoveredAbsentInDS =” + objExchange_Mailbox.DateDiscoveredAbsentInDS
WScript.echo " DeletedMessageSizeExtended =" + objExchange_Mailbox.DeletedMessageSizeExtended
WScript.echo " LastLoggedOnUserAccount =" + objExchange_Mailbox.LastLoggedOnUserAccount
WScript.echo " LastLogoffTime =" + objExchange_Mailbox.LastLogoffTime
WScript.echo " LastLogonTime =" + objExchange_Mailbox.LastLogonTime
WScript.echo " LegacyDN =" + objExchange_Mailbox.LegacyDN
WScript.echo " MailboxDisplayName =” + objExchange_Mailbox. MailboxDisplayName
WScript.echo " MailboxGUID =" + objExchange_Mailbox.MailboxGUID
WScript.echo " ServerName =" + objExchange_Mailbox.ServerName
WScript.echo " Size =" + objExchange_Mailbox.Size
WScript.echo " StorageGroupName =" + objExchange_Mailbox.StorageGroupName
WScript.echo " StorageLimitInfo =" + objExchange_Mailbox.StorageLimitInfo
WScript.echo " StoreName =" + objExchange_Mailbox.StoreName
WScript.echo " TotalItems =" + objExchange_Mailbox.TotalItems
Next
get-mailboxstatistics
–server $servername
データ
ベース
管理
Dim StorGroup as New CDOEXM.StorageGroup
StorGroup.DataSource.Open "LDAP://" + DCServer + "/ CN=First Storage Group,CN=InformationStore,CN=" +
Server + ",CN=Servers,CN=First Administrative Group, CN=Administrative Groups,CN=First Organization,
CN=Microsoft Exchange,CN=Services, CN=Configuration," + DomainName
StorGroup.MoveLogFiles("C:¥newlogPath", 0)
move-storagegrouppath
-identity "First Storage
Group"
–log "C:¥newlogPath"
受信者
管理
Dim objMailbox As CDOEXM.IMailboxStore
Set objMailbox = GetObject("LDAP://" + DCServer + "CN=FOO,CN=users," + DomainName)
objMailbox.CreateMailbox "LDAP://" + DCServer + "/CN=Private MDB,CN=First Storage
Group,CN=InformationStore,CN=" + Server + ",CN=Servers,CN=First Administrative Group, CN=Administrative
Groups,CN=First Organization, CN=Microsoft Exchange,CN=Services, CN=Configuration," + DomainName
enable-mailbox
-identity domain¥FOO
–database "First Storage
Group¥Private MDB"
11. 11
WBEM - Web Based Enterprise Management
http://www.dmtf.org/standards/wbem
マイクロソフトやインテル、シスコシステムズ、旧コンパック・コンピュータなどによって提案され、標準化
団体DMTF(Desktop Management Task Force)によって標準化された規格である。その名の通り、「Web ベー
スのエンタープライズ管理」のための仕様であり、ネットワーク上に存在するサーバーや OS、ネットワーク
機器などの統合管理に必要なプロトコルやデータ構造を規定する。要するに、従来の SNMP(Simple Network
Management Protocol)や syslog に代わる、HTTP と XML をベースとした新世代のネットワーク管理プロトコ
ルである。すでにマイクロソフト Windows や HP-UX などのおもなOSをはじめ、サーバー製品、ストレージ製
品、ネットワーク機器、そしてHP OpenView をはじめとするネットワーク管理ツールにおいて、業界標準の
ネットワーク管理プロトコルとしてサポートされている。
出典 http://h50146.www5.hp.com/products/software/oe/hpux/developer/column/smh_02/
15. 15
History of Microsoft Management Framework
2000年 Windows 2000 に WMI をインプリメント
– 29 WMI プロバイダを含む
– 同時に Windows NT, 98, 95 用の WMI もダウンロード開始
(15 WMI プロバイダー)
※どちらかといえば ”プロバイダー” 提供ベンダー向けのテクノロジー
※ Windows ファミリ間の相互運用性に留まる
2005年 WS-Management が DMTF へ提出、承認
2007年 Windows Server 2008 に WS-Management を実装(WinRM)
• HTTP/S を介して他プラットフォームとの接続が可能に
• Windows PowerShell で WinRM を介したリモートサーバー管理が標準手法
として取り込まれる
WS-Management とは Web Services
for Management のこと。Windows
Server ではない。
17. 17
Windows Management Framework
Windows Management Framework
IT Pro IT Developer
Solution
Developer
Storage Network DevicesCPU
Windows PowerShell
CIMOM、SMI-S
標準化されたアクセス
標準化されたプロトコル
標準化された
オブジェクトモデル
WS-Management(WinRM)
(Web Service for Management) http
他の
プラットフォーム
Service
Provider
開
発
WS-Man
CIMOM、
SMI-S
SMI-S(Storage Management Initiative - Specification)
誰が作るの?
18. 18
The Open Group Membership 2012/10/5 時点
Platinum - 5
• Capgemini Netherlands
• Hewlett-Packard USA
• IBM USA
• Kingdee Software (China) Co. Ltd China
• Oracle Corporation USA
Gold – 44(抜粋)
• Microsoft Corporation USA
• NTT Data Corporation
• ReGIS Inc.
Silver – 256 (Japan のみ抜粋)
• Asahi Techneion Co., Ltd
• AXE, Inc.
• eflow Inc.
• Information-technology Promotion Agency,
Japan
• Japan Aerospace Exploration Agency (JAXA)
• Mizuho Information and Research Institute, Inc.
• Nissan Motor Co., Ltd.
• Nomura Research Institute, Ltd.
• Rococo Co Ltd
• SIOS Technology, Inc.
• Sony CSL
• Symphony Ltd.
Academic – 38 (Japan のみ抜粋)
• Aoyama Gakuin University
• Kyoto University
• Nagoya University
• The University of Tokyo Information Technology
Center
19. 19
Open Management Infrastructure(nanoWBEM)
• オープンソース版 CIM Server
• 軽量 250KB、C で開発されている
Windows PowerShell、その他
Providers : CIMOM,SMI-S
WS-Management(OMI)
Providers : CIMOM,SMI-S
Storage Network DevicesCPUStorage Network DevicesCPU
WS-Management(WinRM)
各種言語
WinRM Client
WinRM Server
OMI Client
OMI Server
21. 21
OMI サポート プラットフォーム
• HP-UX 11i v2 and v3 (PA-RISC and IA64)
• Sun Solaris 8 and 9 (SPARC) and Solaris 10 (SPARC and x86)
• Red Hat Enterprise Linux 4 (x86/x64) and 5 (x86/x64) Server
• Novell SUSE Linux Enterprise Server 9 (x86) and 10 SP1 (x86/x64)
• IBM AIX v5.3 and v6.1 (POWER)
• MacOS 10.5 (Intel)
• Windows(限定的)
最新版は OMI Source - v.1.0.7a (2013年5月)
23. 23
マイクロソフト製品と Windows PowerShell の関係
• 製品ごとに専用の”コマンドレット”が用意されている
• 多くの管理 GUI は裏でコマンドレットを呼んでいる
• インフラ担当者に、各製品への”標準化されたアクセス方法”を提供する
Active Directory
Active Directory
PowerShell Module
Active Directory
管理センター
Hyper-V
Hyper-V
PowerShell Module
System Center
Virtual Machine Manager
PowerShell
コンソール
24. 24
Windows PowerShell ISE
• Powershell_ise.exe
• Windows PowerShell 専用エディタ
• IntelliSense に対応
スクリプトエディタ
スクリプト実行画面
コマンドレットを直接実行
コ
マ
ン
ド
レ
ッ
ト
検
索
英語圏の人たちは”アイス”
と読むらしい
26. 26
事前準備
• コンソールの環境設定
• 簡易編集を有効に
• エクスプローラー(フォルダー)の環境設定
• 「拡張子を表示しない」を無効に
• 実行ポリシーの設定
※オンプレミスの”署名無しスクリプト”を実行できるようにする
• リモートからの操作を有効にする(リモーティングの有効化)
• 必要に応じて自分専用の初期設定ファイルを作成(規定では存在しない)
PS C:¥>Set-ExecutionPolicy RemoteSigned
PS C:¥>Enable-PSRemoting –force
PS C:¥>notepad $profile
27. 27
実行ポリシーの設定~ Set-ExecutionPolicy
• “管理者として実行” する必要がある
• 実行ポリシー
– Restricted:制限つき (オペレーターモード)(規定値)
• 対話形式のみ
• スクリプトは実行できない
– AllSigned:署名
• スクリプトは、信頼された発行元による署名が必要
– RemoteSigned:リモートの署名(2012R2 の規定値)
• “インターネットゾーン” のスクリプトは信頼された発行元による署名が必要
– Unrestricted:無制限
• すべてのスクリプトを実行可能
• リモートのスクリプトについては常に警告
– Bypass:バイパス
• 何もブロックされず警告も表示されない
http://technet.microsoft.com/ja-jp/library/dd347628.aspx
“ポリシーの設定”は、規定では
コンピューター全体に影響する。
適用範囲を制限するには、
Scope も同時に定義する。
29. 29
コマンドレットとモジュール
• PowerShell の実行単位は「コマンドレット」
• コマンドレットはモジュール(Module)によって提供される
• モジュールが読み込まれていないとコマンドレットを使用することは
できない(Import-Module <モジュール名>)
Module
CmdLet
CmdLet
CmdLet
CmdLet
Hyper-V
Add-VMDvdDrive
Add-VMFibreChannelHba
Add-VMHardDiskDrive
Add-VMMigrationNetwork
Add-VMNetworkAdapter
Add-VMNetworkAdapterAcl
・
・
・
Microsoft.PowerShell.
Management
Add-Computer
Add-Content
Checkpoint-Computer
Clear-Content
Clear-EventLog
Clear-Item
Clear-ItemProperty
Complete-Transaction
構造 規定のモジュール 例
31. 31
コマンドレット情報を取得する
• 使用可能なコマンドレット一覧を取得する
• “-VM” という文字列を含むコマンドレットの一覧
• 特定のモジュール内のコマンドレット一覧
• コマンドレットの書式
PS C:¥> Get-Command
PS C:¥> Get-Command *-vm* -CommandType Cmdlet
PS C:¥> Get-Command -Module Hyper-V
PS C:¥> Get-Help <コマンドレット> -detailed
PS C:¥> Get-Help Move-VM -detailed
41. 41
スクリプトの拡張子は .ps1
$Server = $env:COMPUTERNAME
$Adapter = "1"
Do {
$NIC = (Get-NetAdapter)[$Adapter] | Select-Object InterfaceDescription
$NICName = $NIC.InterfaceDescription.Replace("#","_")
$NICName = $NICName.Replace("(","[")
$NICName = $NICName.Replace(")","]")
$Perf = Get-Counter -Counter "¥¥$Server¥Network Interface($NICName)¥bytes total/sec"
$TimeStamp = $Perf.Timestamp.ToString()
$PValue = $Perf.CounterSamples.CookedValue * 8 / 1024 / 1024
$PerfData = $TimeStamp + "," + $Server + "," + $NICName + "," + [int]$PValue
$PerfData
} While(-1)
GetNetCounter.ps1
C:¥tmp> .¥GetNetCounter.ps1
42. 42
1. 起動中のサービス一覧
パイプライン
Where-Object による条件指定
2. 特定のサービスを停止する
() でオブジェクトを表現する
3. ネットワーク情報を取得する
出力結果のフォーマット変換
4. ネットワークの設定を変更する
5. ローカルコンピューター名を変更する
変数の宣言
変数の遅延展開
Array 値
ハッシュテーブル
環境変数
6. リモートからコンピューター名を変更する
※標準コマンドレット or WMI
クレデンシャルの使い方
WMI に必要なアクセス権
7. ドメインに参加させる
※標準コマンドレット or WMI
8. 複数のコンピューターをドメインに参加させる
スクリプトの継続行
ファイルの入出力方法
ファイルのコード変換
CSV のヘッダー行について
繰り返し処理
9. イベントログを収集する
Select-Object により必要な要素のみを取り出す
10. イベントログをバックアップする
11. 独自のイベントログを登録する
12. 仮想マシンを作成して起動する
スクリプトの引数を定義する
名前付き引数
13. Hyper-V ライブマイグレーションを実行する
14. パフォーマンスログを取得する
15. 役割と機能をインストールする
16. 仮想ドメインコントローラを複製する
17. Hyper-V 仮想スイッチを作成する
18. リモートコンピューターから機能を一括で削除する
19. リモートコンピューターを一括でシャットダウンする
20. すべての Hyper-V ホストの仮想マシンを強制的にシャッ
トダウンする
21. すべてのHyper-V ホストのライブマイグレーションを有効
化する
43. 43
PS C:¥>get-service | where-object {$_.Status -eq "Running"}
1.起動中のサービス一覧を取得する
パイプ
サービス一覧
を出力
object
サービス一覧
オ
ブ
ジ
ェ
ク
ト
の
ま
ま
渡
さ
れ
る
object
サービス一覧
44. 44
PS > Get-Service | Where-Object Status -EQ "Running" | Select-Object Name,
Servicetype | Sort-Object ServiceType
コマンドレット1 コマンドレット2
入力パラメタ
コマンドレット3
結果 結果
入力パラメタ
• サービスの一覧を取得
• Status が Running のみを抽出
• Name プロパティとServiceType プロパティを抽出
• ServiceType でソート
オブジェクト
パイプラインについて
PS > Get-Service | Where-Object {$_.Status -EQ "Running"} | Select-Object
-Property Name, Servicetype | Sort-Object -Property ServiceType
V3ではこう書ける
46. 46
TIPS PS 3.0 では書式を簡略化できます
PS C:¥>get-service | where-object {$_.Status -eq "Running"}
PS C:¥>get-service | where-object Status -eq "Running"
V3 ではこう書ける
51. 51
4.ネットワークの設定を変更する
PS C:¥>New-NetIPAddress -InterfaceIndex 24 -IPAddress 192.168.205.102
-AddressFamily IPv4 -PrefixLength 24 -DefaultGateway 192.168.205.254
PS C:¥> Remove-IPAddress -InterfaceIndex 24 -AddressFamily IPv4
静的なIPV4アドレスを設定する
IP アドレスの削除
PS C:¥>Set-DnsClientServerAddress -Interface 24
-ServerAddress 192.168.205.1, 192.168.205.3
DNS の設定
既存の静的アドレスを変更する場合には Set-NetIPAddress を使用する
PS C:¥> Set-DnsClientServerAddress -Interface 24 -ResetServerAddress
DNSの設定を削除する
PS C:¥> Set-NetIPInterface -InterfaceIndex 24 -Dhcp Enabled
DHCP を有効にする
52. 52
5.ローカルコンピューター名を変更する
PS C:¥> $Env:ComputerName
ローカルコンピューター名の取得
PS C:¥> (Get-WmiObject -Class Win32_ComputerSystem).Name
PS C:¥> $New_ClientName = “New_ClientName”
PS C:¥> $SysInfo = Get-WmiObject -Class Win32_ComputerSystem
PS C:¥> $SysInfo.Rename($New_ClientName)
PS C:¥> Restart-Computer
ローカルコンピューター名の変更
方法1
方法2
C:¥> Rename-Computer -NewName “tfwin8-xx” -Force -Restart
WMI を使用する場合
標準のコマンドレットを使用する場合
53. 53
TIPS 変数を使うには
$FirstName = "Junichi"
$LastName = "Anno"
$FullName = $FirstName + " " + $LastName
Write-Output $FullName
$arrFullName = $FullName.Split(" ")
Write-Output $arrFullname[0]
PS C:¥> C:¥hogehoge.ps1
Junichi Anno
Junichi
出力結果
54. 54
TIPS 変数の宣言について
通常は自動判別
PS > $A = 1
PS > $B = “1”
PS > $A + $B
2
PS > $B + $A
11
PS > $A = “abc”
PS > $A + $B
abc1
System.Int32
System.String
先にある System.Int32 に自動変換
先にあるSystem.String に自動変換
System.String で置き換えが可能
自動変換できない値で
あればエラーとなる
55. 55
明示的に宣言することも可能
PS > [System.Int32] $A = 1
PS > [System.String] $B = “abc”
PS > [System.Array] $C = “今年は”, 2012, “年です”
PS > $A = 987.654
PS > $A
988
PS > $A = “Hello”
Cannot convert value "Hello" to type "System.Int32“
PS > [System.String] $A = “Hello”
明に宣言すると自動変換はできない
Int32 にキャストされる
0: 今年は
1: 2012
2: 年です
[System.String]
[System.Int32]
[System.String]
57. 57
TIPS 変数の展開について
PS >$FirstName = "Junichi"
PS >$LastName = "Anno"
PS >$FullName = “$FirstName $LastName”
PS >Write-Output $FullName
Junichi Anno
PS >$FullName = ‘$FirstName $LastName’
PS >Write-Output $FullName
$FirstName $LastName
ダブルクオーテーションで
括った場合は変数は展開さ
れる
シングルクオーテーション
で括った場合には変数は展
開されない
58. 58
TIPS 変数の遅延展開
PS > $Name = “Junichi”
PS > $Message = “Hello $Name”
PS > $Message
Hello Junichi
PS > $Name = “Junichi”
PS > $Message = { “Hello $Name” }
PS > $Name = “Taro”
PS > $Message
Hello $Name
PS > & $Message
Hello Taro
{} で括ると変数は展開されない
Echo の代わりに & を使用
通常
遅延展開
$Message を定義した後で $Name に値を入れているこ
とに注意
この時点で変数は展開される
59. 59
PS > $Message = { Param( $Name ) “Hello $Name” }
PS > & $Message Junichi
Hello Junichi
遅延展開を利用して関数として定義
60. 60
TIPS Array 値
PS > $Users = @()
PS > $Users = “Junichi”, ”Naoko”, “Kazunori”
PS > $Users.Count
3
PS > $Users
Junichi
Naoko
Kazunori
PS > $Users += “Maki”
PS > $Users += 512
PS > $a = { [system.math]::Pow( 2, $N ) }
PS > $Users += $a
Array の作り方
空のアレイを作成(あえてしなくてもよい)
値を追加
数値を追加
遅延展開変数を追加
{}で括っているので遅延展開変数
61. 61
Array 値の参照
PS > $Users[3]
Maki
PS > $Users[-1]
PS > $N = 6
PS > & $Users[5]
64
PS > Foreach ($u in $Users) { New-ADUser -Name $u }
PS > $Users[2..4]
PS > ($Users -eq “Kazunori”).Count
PS > $Users -ne “Kazunori”
PS > $Users -like “*M*”
$users から値を取りだし
ながらユーザーを作成
配列の2番から4番を取りだす
遅延展開変数の入った行を参照
配列の一番最後
Kazunori 以外のものを抽出
kazunori と一致するものがあるかどうかを検査
M が含まれる行を抽出
62. 62
PS > $arrINT = 1,2,3,4,5,6,7,8,9
PS > $arrINT -ge 5
PS > $Users += $arrINT
PS > $Users | Sort-Object $_
PS > $Users = $Users -ne “Kazunori”
PS > [System.Array]::Reverse($Users)
2つの配列を合成
昇順に並べ替えて出力
Kazunori を削除
Users の中の並び順を逆にする
2つの配列を合成
63. 63
空白を文字列で埋める(PadLeft / PadRight)
## $N[] に、001 ~ 100 の文字列を格納する
PS > $N = @()
PS > 001..100 | % { $N += ("$_").Padleft(3,"0")}
PS > User$N
001
002
・
100
PS > $VMs = $N | % {echo VM$_}
PS > $VMs
VM001
VM002
・
VM100
64. 64
TIPS HashTable
PS > $Users = @{}
PS > $Users.0001 = “Junichi”
PS > $Users.”0001” = “Junichi”
PS > $Users.Add( “0001”, “Junichi” )
PS > $Users.Remove(“0001”)
HashTable の作り方
注意 Array は ()
キー 1 に 値 Junichi を登録
キー 0001 に 値 Junichi を登録
キー 0001 の行を削除
65. 65
PS > $USDJPY = Import-CSV -Path C:¥tools¥USDJPY.csv –Encoding Default
PS > $HT = @{}
PS > While ( $i -lt $USDJPY.Count ) {$HT.Add( $USDJPY.日付[ $i ], $USDJPY.終値
[ $i ] ) ; $i++ }
PS > $HT.”2012/2/10”
77.65
CSV ファイルから値を読み込んでHashTable を作成
67. 67
6.コンピューター名を変更する(リモートから)
##スタンドアロンのコンピューターの場合
PS C:¥> $ClientName = “ClientName”
PS C:¥> $Cred = Get-Credential
PS C:¥> $New_ClientName = “New_ClientName”
PS C:¥> Rename-Computer -ComputerName $ClientName -LocalCredential $Cred
-NewName $New_ClientName -Force -Restart
##ドメインに参加しているコンピューターの場合
PS C:¥> $ClientName = “ClientName”
PS C:¥> $Cred = Get-Credential
PS C:¥> $New_ClientName = “New_ClientName”
PS C:¥> Rename-Computer -ComputerName $ClientName -DomainCredential $Cred
-NewName $New_ClientName -Force -Restart
標準のコマンドレットを使用する
68. 68
PS C:¥> $ClientName = “ClientName”
PS C:¥> $Cred = Get-Credential
PS C:¥> $New_ClientName = “New_ClientName”
PS C:¥> $SysInfo = Get-WmiObject -Class Win32_ComputerSystem
-ComputerName $ClientName -Credential $Cred
PS C:¥> $SysInfo.Rename($New_ClientName)
PS C:¥> Restart-Computer -ComputerName $ClientName -Credential $cred -Force
WMI を使用する
Server Client変更
WMI
69. 69
TIPS クレデンシャルの作成
その1
PS C:¥> $Cred = Get-Credential
その2
PS C:¥> $user = “administrator“
PS C:¥> $pass = ConvertTo-SecureString "P@ssw0rd“
-AsPlainText -Force
PS C:¥> $Cred = New-Object
System.Management.Automation.PSCredential $user, $pass
ポップアップが表示される
74. 74
7.ドメインに参加させる
PS C:¥> $Domain = “tf.com”
PS C:¥> $Client = “ClientComputer”
PS C:¥> $LocalCred = Get-Credential junichia
PS C:¥> $DomainCred = Get-Credential tf¥administrator
PS C:¥> $Admin = “tf¥administrator”
PS C:¥> $Pass = “P@ssword”
PS C:¥> Add-Computer -ComputerName $Clienit -LocalCredential $Cred
-Credential $DomainCred -DomainName $Domain -OUPath “OU=営業部” -Restart -Force
Server
AD Domain
参加指示 Client Client
Workgroup
Client
標準のコマンドレットを使用する
75. 75
PS C:¥> $Domain = “tf.com”
PS C:¥> $Client = “ClientComputer”
PS C:¥> $Cred = Get-Credential junichia
PS C:¥> $Admin = “tf¥administrator”
PS C:¥> $Pass = “P@ssword”
PS C:¥> $SysInfo = Get-WmiObject -Class Win32_ComputerSystem
-ComputerName $ClientComputer -Credential $Cred -Authentication PacketPrivacy
PS C:¥> $SysInfo.JoinDomainOrWorkgroup($Domain, $Pass, $Admin, “OU=xx”, 3 )
PS C:¥> Restart-Computer -ComputerName $Client -Credential $Cred -Force
認証に関する通信を暗号化する
これを指定しないと以下のエラー
“Client connection to WINMGMT
needs to be encrypted for this
operation. Please adjust your
IWbemServices proxy security settings
and retry. ”
1: ドメインに参加
+
2: コンピューターアカウントの作成
WMIのクラスを直接使用する
76. 76
8.複数のコンピューターをドメインに参加させる
# 各種定数の設定
$Cred = Get-Credential junichia
$Domain = "tf.com"
$Admin = "tf¥administrator"
$Pass = "P@ssword"
# いったん、SJISで作成したファイルを読み込み、UNICODEで保存する
$InputFile = "C:¥Tools¥Computers.csv"
$OutputFile = "C:¥Tools¥Computers_unicode.csv"
Get-Content $InputFile -Encoding String | Out-File $OutputFile -Encoding unicode
# CSVファイルを読み込む
$Computers = Import-Csv -Path $OutputFile -Header ComputerName,IPAddress,Department -Delimiter ","
# コンピューター名と部署を取り出し、ドメインに参加させる
ForEach ($c in $Computers)
{
$Client = $c.ComputerName
$OU = "OU=" + $c.Department + ",DC=TF,DC=COM
$SysInfo = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $Client `
-Credential $Cred -Authentication PacketPrivacy
$SysInfo.JoinDomainOrWorkgroup($Domain, $Pass, $Admin, $OU , 3 )
Restart-Computer -ComputerName $Client -Credential $Cred -Force
}
ServerCSV Client Client
tfwin8-01,192.168.205.101,経理部
tfwin8-02,192.168.205.102,営業部
・
・
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
78. 78
TIPS 入出力方法
#標準出力
Write-Output “Hello”
Echo “Hello”
#標準入力
$InputData = Read-Host
#ファイルに出力
Out-File -filepath C:¥tmp¥list.txt -inputobject
$Record
#ファイルから入力
$file = Get-Content -Path c:¥tmp¥list.txt
$file = type c:¥tmp¥list.txt
#CSVファイルから入力
$file = Import-CSV -Path c:¥test.csv
これを抑えておけば、ひとまずたいていのことはできます
79. 79
TIPS 出力方法の違い
PS C:¥> 1 + 2 + 3
6
PS C:¥> Echo “Windows PowerShell”
Windows PowerShell
PS C:¥> Write-Output 1 + 2 + 3
1
+
2
+
3
PS C:¥> Echo Windows PowerShell
Windows
PowerShell
空白で区切られる
PS C:¥> Windows PowerShell
<エラー>
※ Echo は Write-Output のAlias
PS C:¥> “1” + “2” + “3”
123
81. 81
TIPS Import-CSV でのヘッダーの取り扱いについて
• 規定では、1行目はヘッダーとして扱われる
• ヘッダーが無い場合には -Header パラメタで指定可能
• -Header を指定すると1行目はデータとして扱われる
• ヘッダー単位(列単位)で取り出しが可能
ComputerName, IPAddress, Department
tfwin8-01,192.168.205.101,経理部
tfwin8-02,192.168.205.102,営業部
・
・
$Computers = Import-Csv -Path $OutputFile -Header ComputerName,IPAddress
$Computers.IPAddress
83. 83
TIPS 繰り返し処理1
#ForEach-Object
Get-ADUser -Filter * | ForEach-Object {$_.name}
Get-ADUser -Filter * | ForEach-Object name
#foreach
$Users = Get-ADUser -Filter *
foreach ($user in $Users) { $user.name }
Active Directory ユーザー一覧から name プロパティをリストする
V3
85. 85
TIPS 繰り返し処理3
$i = 0
do
{
Write-Host $i
$i++
}
while ($i -lt 10)
$i = 0
do
{
Write-Host $i
$i++
}
until ($i -ge 10)
86. 86
9.イベントログを収集する
C:¥> Get-EventLog -LogName Security -ComputerName tfdc01 -Newest 10
リモートコンピューターのセキュリティログから、最新10個のログを取りだす
特定の日時範囲のログを取りだす
C:¥> Get-EventLog -LogName Security -ComputerName tfdc01 -After “2012/6/1
00:00:00” -Before “2012/6/1 00:10:00”
特定のイベントIDを取りだす
C:¥> Get-EventLog -LogName Security -ComputerName tfdc01 -InstanceID 4632
失敗した監査を取りだす
C:¥> Get-EventLog -LogName Security -ComputerName tfdc01 -EntryType FailureAudit
メッセージに “ログオン” という言葉が含まれているログを取りだす
C:¥> Get-EventLog -LogName Security -ComputerName tfdc01 -Message “*ログオン*”
87. 87
C:¥> Get-EventLog -LogName Application | Group-Object -Property EntryType
-NoElement
イベントログを集計する
C:¥> Get-EventLog -LogName Application |Group-Object -Property Source,EntryType
-NoElement | Select-Object Name,Count
89. 89
10. イベントログをバックアップする
C:¥> $logFileName = "Security"
C:¥> $exportFileName = "C:¥tmp¥" + $logFileName + (get-date -f yyyyMMddhhmmss) + ".evt"
C:¥> $exportfilename
C:¥> $logFile = Get-WmiObject Win32_NTEventlogFile | Where-Object {$_.logfilename -eq
$logFileName}
C:¥> $logFile.backupeventlog($exportFileName)
セキュリティイベントログをローカルにバックアップする(EVT形式)
PowerShell は管理者モードで起動してください
90. 90
11.独自のイベントログを登録する
C:¥> New-EventLog -Source "TechFielders" -LogName "TechFielders"
ログファイル名 TechFielders、イベントソース TechFielders を新規に登録する
C:¥> Write-EventLog -LogName TechFielders -Source “TechFielders”
-EntryType Information -EventId 5963 -Message “元気出せこの野郎!1,2,3 ダァ!"
TechFielders ログにイベントログを書き込む
91. 91
12. 仮想マシンを作成して起動する
param([string] $VMName = "NA", [int] $CPU = 1, [int] $Mem = 10MB)
echo -InputObject $VMName, $CPU, $Mem
$SwitchName = "Intel(R) 82579LM Gigabit Network Connection - Virtual Switch"
New-VM -BootDevice CD `
-MemoryStartupBytes $Mem `
-Name $VMName `
-SwitchName $SwitchName `
-VHDPath ¥¥junichia-vdi¥$VMName¥$VMName.vhdx
Set-VM -ProcessorCount $CPU -DynamicMemory -Name $VMName
Add-VMNetworkAdapter -VMName $VMName -SwitchName $SwitchName
Start-VM -Name $VMName
1
2
3
4
5
6
7
8
9
10
11
PS C:¥> .¥CreateVirtualMachine.ps1 -VMName “VM01" -Mem 1024mb
CreateVirtualMachine.ps1
93. 93
TIPS 名前付き引数の使い方(Param 句)
param([string] $UserID = “ID", [string] $Password =“PASS")
Write-Output $userid
Write-Output $Password
引数を所定の名前の変数に格納することで、文法チェック等が行いやすくなる
C:¥> .¥hogehoge.ps1 -userid anno
anno
PASS
実行結果
規定値
94. 94
13. Hyper-V ライブマイグレーション
$Source = “HostSV01”
$Dist = “HostSV02”
$VMs = get-vm -ComputerName $Source -Name VM*
foreach ($VMName in $VMs.Name) {
Move-VM -ComputerName $Source -Name $VMName -DestinationHost $Dist
}
Guest
メモリ内データ
¥¥Server¥Share¥xxx.vhdx
構成情報 Guest
Host01 Host01
$Source の中の VM で始ま
るゲストOSを検索している
95. 95
14. パフォーマンスログを取得する
Do
{
$perf =Get-WmiObject -Class win32_perfformatteddata_perfos_processor `
-Property PercentProcessorTime
foreach ($p in $perf) {
$outrec = "Processor" + $i + ":" + $p.PercentProcessorTime
echo $outrec
}
Start-Sleep -Seconds 1
cls
} while (-1)
1
2
3
4
5
6
7
8
9
10
11
プロセッサー(コア単位)の利用率を1秒に1回取得して表示する
1秒スリープ
画面をクリア
目的のパフォーマンスカウン
タ(今回はCPU使用率)が含ま
れているWMIクラスを指定する
97. 97
$Server = $env:COMPUTERNAME
$Adapter = "1"
Do {
$NIC = (Get-NetAdapter)[$Adapter] | Select-Object InterfaceDescription
$NICName = $NIC.InterfaceDescription.Replace("#","_")
$NICName = $NICName.Replace("(","[")
$NICName = $NICName.Replace(")","]")
$Perf = Get-Counter -Counter "¥¥$Server¥Network Interface($NICName)¥bytes total/sec"
$TimeStamp = $Perf.Timestamp.ToString()
$PValue = $Perf.CounterSamples.CookedValue * 8 / 1024 / 1024
$PerfData = $TimeStamp + "," + $Server + "," + $NICName + "," + [int]$PValue
$PerfData
} While(-1)
ネットワークアダプターのログを取得する
1
2
3
4
5
6
7
8
9
10
11
12
13
99. 99
PS C:¥> Add-WindowsFeature -Name User-Interfaces-Infra -IncludeAllSubFeature
-IncludeManagementTools
ServerCore にすべての GUI をインストールする(フルインストール)
PS C:¥> Add-WindowsFeature –Name Server-gui-mgmt-infra -IncludeManagementTools
ServerCore に管理ツールだけをインストールする(MinShell)
100. 100
(参考)Windows Server 2012 GUI オプション
Server Core MinShell Server W/GUI Desktop Experience
コマンドプロンプト Available Available Available Available
Windows PowerShell Available Available Available Available
サーバーマネージャー Not Available Available Available Available
MMC Not Available Available Available Available
コントロールパネル Not Available Not Available Available Available
コントロールパネル内
のアプレット
Not Available Some Available Available Available
Windows Explorer Not Available Not Available Available Available
タスクバー Not Available Not Available Available Available
通知エリア Not Available Not Available Available Available
Internet Explorer Not Available Not Available Available Available
ヘルプ Not Available Not Available Available Available
テーマ Not Available Not Available Not Available Available
スタートスクリーン Not Available Not Available Not Available Available
WinRTアプリ Not Available Not Available Not Available Available
メディアプレーヤー Not Available Not Available Not Available Available
101. 101
ServerManager モジュールでサポートされている
コマンドレット
PS C:¥> Import-Module ServerManager
PS C:¥> Get-Command -Module ServerManager
Alias Add-WindowsFeature servermanager
Alias Remove-WindowsFeature servermanager
Function Disable-ServerManagerStandardUserRemoting servermanager
Function Enable-ServerManagerStandardUserRemoting servermanager
Cmdlet Get-WindowsFeature servermanager
Cmdlet Install-WindowsFeature servermanager
Cmdlet Uninstall-WindowsFeature servermanager
102. 102
16. DC を複製する
Windows Server 2012 以降では、仮想化されたドメインコントローラーを複製して展
開することがでる。
Hyper-V
ホスト
DC02 DC03Export
DC01
(pdc)
(条件)
• 複製元はPDCエミュレーターであってはならない
• 複製元は Clonable Domain Controllers グループのメンバーでなくてはならない
• Hyper-V ホストは Windows Server 2012
• DCは Windows Server 2012
VHD Import
Hyper-V
ホスト
Hyper-V
ホスト
103. 103
$SourceDC = "DC02"
$DistDC = "DC03"
$distPDCEmu = DC01"
$HyperVHost = “ITCAMP-TMP"
Move-ADDirectoryServerOperationMasterRole -Identity $distPDCEmu -OperationMasterRole PDCEmulator
Get-ADComputer $SourceDC | %{Add-ADGroupMember -Identity "Cloneable Domain Controllers" -Members
$_.samAccountName}
Invoke-Command -ComputerName $SourceDC -ScriptBlock { Get-ADDCCloningExcludedApplicationList -GenerateXml
-Force }
$SB = "New-ADDCCloneConfigFile -Static `
-IPv4Address ""192.168.210.51"" `
-IPv4DNSResolver ""192.168.210.50"" `
-IPv4SubnetMask ""255.255.255.0"" `
-IPv4DefaultGateway ""192.168.210.254"" `
-CloneComputerName " + $DistDC + `
" -SiteName ""Default-First-Site-Name"""
Invoke-Command -ComputerName $SourceDC -ScriptBlock { $SB }
Stop-VM $SourceDC
新しいドメインコンローラーの
構成ファイルを作成
PDCエミュレーターを複製元となるDC以外に移動
複製元DCをClonable Domain Controllers グループのメンバーにする
複製元DCをシャットダウン
104. 104
つづき
Get-VM $SourceDC | %{ Export-VM $_ -Path C:¥VMs}
Start-VM -Name $SourceDC
$CFG = (Dir “C:¥VMs¥$SourceDC¥Virtual Machines¥*.xml”).FullName
md E:¥$DistDC
Import-VM -Path "$CFG" -ComputerName $HyperVHost -GenerateNewId -Copy
-VhdDestinationPath E:¥$DistDC
Get-VM $SourceDC |Where-Object {$_.State -EQ "Off"} | Rename-VM -NewName $DistDC
Start-VM $DistDC
複製元DCをエクスポート
複製元DCを起動
エクスポートした仮想マシンをインポート
VMの名前が複製元と同じになってしまうので、変更する。ここでは同じHyper-Vホストを使用して
いるので、OffになっているほうのDCを変名している。
複製先を起動。起動後自動的にDC間複製が始まる。
105. 105
17. 仮想スイッチを作成する
$PCName = "itcamp-pc01"
Invoke-Command -ComputerName $PCName -ScriptBlock {New-VMSwitch -Name "External" `
-AllowManagementOS $True -NetAdapterInterfaceDescription "Intel(R) 82579LM Gigabit Network Connection"}
New-VMSwitch -ComputerName $PCName -Name "WS2012Labs-Public" -SwitchType Private
New-VMSwitch -ComputerName $PCName -Name "WS2012Labs-CorpNet" -SwitchType Private
New-VMSwitch -ComputerName $PCName -Name "WS2012Labs-Storage" -SwitchType Private
New-VMSwitch -ComputerName $PCName -Name "WS2012Labs-Internet" -SwitchType Private
New-VMSwitch -ComputerName $PCName -Name "WS2012Labs-HA" -SwitchType Private
106. 106
18. リモートコンピューターから機能を一括で削除する
Workflow RemoveFOCsWF {
$PCs = Import-Csv -Path pclist.txt -Header "PC","IP"
foreach -Parallel ($pc in $PCs) {
Write-Output -InputObject $pc.pc
Remove-WindowsFeature -ComputerName $pc.pc Failover-Clustering -IncludeManagementTools -
Restart
}
}
RemoveFOCsWF
ワークフローを使用してリモートコンピューターからフェールオーバークラス
タリングを削除する
itcamp-pc01,192.168.210.1
itcamp-pc02,192.168.210.2
itcamp-pc03,192.168.210.3
itcamp-pc04,192.168.210.4
itcamp-pc05,192.168.210.5
itcamp-pc06,192.168.210.6
・
・
107. 107
19. リモートコンピューターを一括でシャットダウンする
Workflow RestartAllPCsWF {
$PCs = Import-Csv -Path pclist.txt -Header "PC","IP"
foreach -Parallel ($pc in $PCs) {
Write-Output -InputObject $pc.pc
##Restart-Computer -PSComputerName $pc.PC -Force
Stop-Computer -PSComputerName $pc.PC -Force
}
}
RestartAllPCsWF
itcamp-pc01,192.168.210.1
itcamp-pc02,192.168.210.2
itcamp-pc03,192.168.210.3
itcamp-pc04,192.168.210.4
itcamp-pc05,192.168.210.5
itcamp-pc06,192.168.210.6
・
・
108. 108
20. すべての Hyper-V ホストの仮想マシンを強制的にシャットダウン
Workflow StopAllVMs {
$PCs = Import-Csv -Path pclist.txt -Header "PC","IP"
foreach -Parallel ($pc in $PCs){
##Get-VM -ComputerName $pc.pc |Start-VM
Get-VM -ComputerName $pc.pc |Stop-VM -Force
}
}
itcamp-pc01,192.168.210.1
itcamp-pc02,192.168.210.2
itcamp-pc03,192.168.210.3
itcamp-pc04,192.168.210.4
itcamp-pc05,192.168.210.5
itcamp-pc06,192.168.210.6
・
・
ワークフローを使用して一斉にシャットダウン
109. 109
21. すべての Hyper-V ホストのマイグレーション設定を有効化
Workflow DisableMigrationWF {
$PCs = Import-Csv -Path c:¥tools¥ps¥HOLSetup¥pclist.txt -Header "PC","IP"
foreach -Parallel ($pc in $PCs) {
##Disable-VMMigration -ComputerName $pc.pc
##Set-VMHost -ComputerName $pc.pc -VirtualMachineMigrationAuthenticationType CredSSP `
-MaximumVirtualMachineMigrations 2 -UseAnyNetworkForMigration $true
Enable-VMMigration -ComputerName $pc.pc
Set-VMHost -ComputerName $pc.pc -VirtualMachineMigrationAuthenticationType Kerberos `
-MaximumVirtualMachineMigrations 2 -UseAnyNetworkForMigration $True
}
}
DisableMigrationWF
itcamp-pc01,192.168.210.1
itcamp-pc02,192.168.210.2
itcamp-pc03,192.168.210.3
itcamp-pc04,192.168.210.4
itcamp-pc05,192.168.210.5
itcamp-pc06,192.168.210.6
・
・
111. 111
True と False の指定
$True と $False は予約語である
C:¥> $MyNameIsJunichi = $True
C:¥> If ($MyNameIsJunichi -eq $True) {Echo 1}
1
113. 113
unix のあのコマンドは?
ls → get-ChildItem
cp → copy-Object
grep → select-String
sort → sort-Object
man → help
clear → clear-Host
cat → get-Content
kill → stop-Process
tee → tee-Object
tail → get-Content
「アレはあるかな?」と思った
ら
Get-Alias <unix 上のコマンド>
エイリアス tail は登録されてい
ないので、自分で登録する必要
がある(後述)。
114. 114
Get-Content で Tail を模してみる
## 新しく追加された行を待ち合わせて表示
gc .¥test.txt -wait -tail 0
## テキストファイルの5行目から10行目までを表示
(gc .¥test.txt)[4..9]
## テキストファイルの最初の5行を表示
gc .¥test.txt -totalcount 5
## テキストファイルの最後の5行を表示
gc .¥test.txt | Select-Object -Last 5 ← 時間がかかる可能性があるので –tail をお勧め
gc .¥test.txt -tail 5
## 新しく追加された行に特定の文字列が含まれていたら表示
gc .¥test.txt -wait | Select-String -Pattern ^a
115. 115
tail を Get-Content の Alias として登録する
Set-Alias tail Get-Content
一時的に使用する(現在のコンソール上でのみ)場合は以下のように入力
永続化するには、以下のようにプロファイルに書き込む
Add-Content $profile "Set-Alias tail get-content" -Force
125. 125
OS
リモーティングを有効にする
• 個々の PC で有効にする
PS C:¥>Enable-PSRemoting –force
WinRM
WindowsFirewall
Listener
受付窓口要求を透過
WindowsManagement
処理を受付
port 5985
126. 126
Enable-PSRemoting とネットワークプロファイルの関係
※PowerShell 3.0 の場合
Windows Server 系
ドメイン
• ADドメインに参加
• DCと通信可能
プライベート
• DCと通信不可能
• ワークグループ
• 自宅、職場
パブリック
• インターネット
• 公共ネットワーク
Windows Client 系
WinRM 有効
ネットワークのプロファイル
WinRM 有効
WinRM 有効
WinRM 有効
同じサブネットのコン
ピューターに対しては
WinRM 有効
SkipNetworkProfileChec
k パラメタを指定して実行
すれば同じサブネットの
コンピューターに対して
有効になる
パブリックプロファイルの Firewall の制限をすべて取り払うには以下のコマンドで
Set-NetFirewallRule -Name “WINRM-HTTP-In-TCP-PUBLIC” -RemoteAddres Any
http://technet.microsoft.com/en-us/library/hh849694.aspx
129. 129
Windows Firewall で WinRM の要求を受信する
[コンピューターの構成]-[ポリシー]-[Windows の設定]-[セキュリティの設定]
└[セキュリティが強化されたWindowsファイアウォール]
└[セキュリティが強化された Windows ファイアウォール(-------)]
└[受信の規則]
132. 132
リモーティングの設定を確認する
PS C:¥> cd WSMan:
PS WSMan:¥> cd localhost¥Listner¥Listener_1084132640
PS WSMan:¥localhost¥Listener¥Listener_1084132640> dir
WSManConfig: Microsoft.WSMan.Management¥WSMan::localhost¥Listener¥Listener_1084132640
Type Name SourceOfValue Value
---- ---- ------------- -----
System.String Address *
System.String Transport HTTP
System.String Port 5985
System.String Hostname
System.String Enabled true
System.String URLPrefix wsman
System.String CertificateThumbprint
System.String ListeningOn_1038621592 10.168.133.49
System.String ListeningOn_1770022257 127.0.0.1
System.String ListeningOn_1055432771 192.168.205.1
System.String ListeningOn_1414502903 ::1
System.String ListeningOn_894013609 2001:4898:0:fff:0:5e...
System.String ListeningOn_1270366863 fe80::5efe:10.168.13...
System.String ListeningOn_1565265845 fe80::5efe:192.168.2...
System.String ListeningOn_2078661606 fe80::25a7:4656:665e...
System.String ListeningOn_1147683958 fe80::fc39:ec3b:d823...
PS WSMan:¥localhost¥Listener¥Listener_1084132640>
Listener 名は環境に
よって異なります
134. 134
PS C:¥> Get-Item wsman:¥localhost¥Client¥TrustedHosts
WSManConfig: Microsoft.WSMan.Management¥WSMan::localhost¥Client
Type Name SourceOfValue Value
---- ---- ------------- -----
System.String TrustedHosts
PS C:¥> Set-Item wsman:¥localhost¥Client¥TrustedHosts 192.168.205.* -Concatenate
WSManConfig: Microsoft.WSMan.Management¥WSMan::localhost¥Client
Type Name SourceOfValue Value
---- ---- ------------- -----
System.String TrustedHosts 192.168.205.*
規定では未設定
137. 137
リモートコンピュータの操作する3つの方法
<コマンドレット> -ComputerName パラメタ
※ -ComputerName では PSセッションは張られない
• リモートコンピューターに対して「リモート」から操作を行う
• 複数のコンピュータを指定可能
Enter-PSSession -ComputerName ・・・・・
• 対話モード(SSH のような使い方)
• Exit コマンドで接続を切断し、セッション消滅
Invoke-Command -ComputerName ・・・・・
• -ComputerName パラメタをもたないコマンドレットに対応
• リモートコンピューターの「中」で処理を行う
• 複数のコンピュータを指定可能
• コマンドやスクリプトの終了と同時にセッションと接続は消滅
138. 138
-ComputerName を持つコマンドレット
PS C:¥> Get-Command -CommandType Cmdlet -ParameterName ComputerName
Invoke-Command
New-PSSession
Connect-PSSession
Receive-PSSession
Get-PSSession
Remove-PSSession
Receive-Job
Enter-PSSession
Add-Computer
Clear-EventLog
Get-EventLog
Get-HotFix
Get-Process
Get-Service
Get-WmiObject
Invoke-WmiMethod
Limit-EventLog
New-EventLog
Register-WmiEvent
Remove-Computer
Remove-EventLog
Remove-WmiObject
Rename-Computer
Restart-Computer
Set-Service
Set-WmiInstance
Show-EventLog
Stop-Computer
Test-Connection
Write-EventLog
Get-WindowsFeature
Install-WindowsFeature
Uninstall-WindowsFeature
(ほんの一部)
139. 139
-ComputerName の利用
PS C:¥> Get-EventLog -ComputerName tfdc02 -LogName Security -Newest 10
リモートコンピューターのイベントログを取得する
PS C:¥> Restart-Computer -ComputerName tfsv02
リモートコンピューターを再起動する
PS C:¥> get-WindowsFeature -ComputerName tfsv02
リモートコンピューターにインストールされている役割/機能の一覧
PS C:¥> Add-WindowsFeature -ComputerName tfsv02 -Name RSAT-Hyper-V-Tools
-IncludeAllSubFeature -IncludeManagementTools
リモートコンピューターに Hyper-V 管理ツールをインストールする
141. 141
リモートコンピュータの操作する 3 つの方法
<コマンドレット> -ComputerName パラメタ
※ -ComputerName では PSセッションは張られない
• リモートコンピューターに対して「リモート」から操作を行う
• 複数のコンピュータを指定可能
Enter-PSSession -ComputerName ・・・・・
• 対話モード(SSH のような使い方)
• Exit コマンドで接続を切断し、セッション消滅
Invoke-Command -ComputerName ・・・・・
• -ComputerName パラメタをもたないコマンドレットに対応
• リモートコンピューターの「中」で処理を行う
• 複数のコンピュータを指定可能
• コマンドやスクリプトの終了と同時にセッションと接続は消滅
142. 142
“セッション” と “PS セッション”
Local Computer
セッション
セッション
セッション
Remote Computer
PSセッション
PSセッション
Remote Computer
PSセッション
PSセッション
PSセッション
•PowerShell.exe が起動すると作られる。
•コンソールを閉じたらクリア。
•個々のセッションは独立
• ユーザー自身が作成し、管理と制御が可能
• 永続化が可能
• 個々のPSセッションは独立
• Windows PowerShell の実行環境
CALL
CALL
CALL
CALL
143. 143
PS セッション
Source Targetコネクション
• PS セッション内でコマンドやスクリプトが実行される
• 変数もセッション内に保存される
• コネクションが「消滅」するとセッションも「消滅」する
• テンポラリ PS セッション
• -ComputerName を使用したときに作成されるセッション
• コマンドが終了するとセッションも終了する
• リユーザブル(Re-usable) PS セッション
• コマンド終了後もコネクションを維持し、セッションを継続
• 実行中の変数等もそのまま維持される
セ
ッ
シ
ョ
ン
144. 144
Invoke-Command の特徴
• -ComputerName パラメタを持つ
• どんなコマンドでもリモートで実行可能
• -ComputerName パラメタを持たないコマンドレット
(Start-Service, Stop-Service など)
• 従来の DOS コマンド(netstat や gpupdate など)
• -Credential のサポート
• コマンドレットの中には -Credential を持たないものが多い
• -FilePath パラメタにスクリプトを指定可能
• スクリプトはローカルに存在していれば OK
※ただしコマンドレットはリモートに必要
• 複数のコンピューターを指定可能
145. 145
Invoke-Command の利用
コマンドやスクリプトをリモートコンピューターに投げて、結果を受け取る
PS C:¥> Invoke-Command -ComputerName tfsv02 -ScriptBlock{ Get-Service }
リモートコンピューターのサービス一覧を取得する
PS C:¥>Invoke-Command -ComputerName tfsv02 -ScriptBlock{ Stop-Service -Name
wuauserv }
リモートコンピューターの Windows Update サービスを停止する
PS C:¥>Invoke-Command -ComputerName tfsv02 -ScriptBlock{ GPUpdate.exe }
リモートコンピューターで GPUpdate を実行する
PS C:¥> Invoke-Command -ComputerName tfsv02 -ScriptBlock{ cd env: ; dir }
リモートコンピューターの環境変数一覧を取得する
Get-Service -ComputerName と同じ
146. 146
Invoke-Command -FilePath パラメタについて
-FilePath パラメタに指定するスクリプト(.ps1)は、ローカルのパス
Invoke-Command -ComputerName SV01 -FilePath .¥hogehoge.ps1
Invoke-Command -ComputerName SV01 -ScriptBlock {.¥hogehoge.ps1}
Target
Computer
hogehoge.ps1
Get-Service
・
・
スクリプトの中身がリモートに送られる
Target
Computer
hogehoge.ps1
ターゲット
に存在しな
いとエラー
147. 147
param([string] $VMName = "VM01", [int] $CPU = 1, [int] $Mem = 10MB)
Stop-VM -Name $VMName -Force
Remove-VM -Name $VMName -Force
Remove-Item -Path ¥¥junichia-vdi¥VMs¥$VMName -Recurse -Force
$SwitchName = "Intel(R) 82579LM Gigabit Network Connection - Virtual Switch"
New-VM -BootDevice CD `
-MemoryStartupBytes $Mem `
-Name $VMName `
-SwitchName $SwitchName `
-NewVHDPath ¥¥junichia-vdi¥VMs¥$VMName¥$VMName.vhdx `
-NewVHDSizeBytes 40GB
Set-VM -ProcessorCount $CPU -DynamicMemory -Name $VMName
Add-VMNetworkAdapter -VMName $VMName -SwitchName $SwitchName
Start-VM -Name $VMName
1
2
3
4
5
6
7
8
9
10
11
12
13
14
リモートコンピューター上に仮想マシンを作成し起動する
PS C:¥> Invoke-Command -ComputerName "junichia-demo05"
-FilePath ".¥CreateVirtualMachine.ps1" -ArgumentList “Guest99",“2",“1024MB"
CreateVirtualMachine.ps1
148. 148
Invoke-Command の注意点
• PS セッションは Invoke-Command ごとに作成され、実行後に消滅する
PS> Invoke-Command -ComputerName Server1 -ScriptBlock {$A = 1}
PS> Invoke-Command -ComputerName Server1 -ScriptBlock {$B = 1}
PS> Invoke-Command -ComputerName Server1 -ScriptBlock {$C = $A + $B}
PS> Invoke-Command -ComputerName Server1 -ScriptBlock {“$A=1; $B=2 ;
$C=$A+$B” }
149. 149
複数のリモートコンピューターに対する一括操作
PS > $ComputerList = “tfdc01”, “tfdc02”
PS > Get-Service -ComputerName $ComputerList | Sort-Object
MachineName, Name | Select-Object MachineName, Name, Status
PS > $ComputerList = “tfdc01”, “tfdc02”
PS > Invoke-Command -ComputerName $ComputerList {Get-Service |Sort-
Object PSComupterName, Name | Select-Object PSComputerName, Name,
Status} | FT
• 複数のコンピューターに対して処理を行い、結果をマージして出力
• 非同期に処理が開始され、全ての処理が終了するまで待ち合わせる
(シーケンシャルでないことに注意!)
• 規定では最大同時32台
-ComuterName パラメタに複数のコンピューターを指定する
MachineName と PSComputerName に注意!
150. 150
$PSComputerName
Get-Service -ComputerName TARGET
Invoke-Command -ComputerName TARGET { Get-Service }
Source Target
コマンド
WMI
実
行
空
間
結果
Source Target
実
行
空
間
WMI
結果
Get-Service コマンドレットの
結果にはコンピューター名
(MachineName)が含まれる。
Get-Service コマンドレットの結
果に含まれるMachineNameには
ローカルコンピューター「.」が含
まれる。
Target コンピューター名を取得す
るには $PSComputerName を使
用する。
PSSession のターゲットとなったコンピューター名が格納される変数
151. 151
CSVファイルから複数コンピューターを入力
Invoke-Command -ComputerName (Import-CSV computerlist.txt).HostName {get-
culture}
LCID Name DisplayName PSComputerName
---- ---- ----------- --------------
1041 ja-JP 日u本語e (日u本) tfdc01
1041 ja-JP 日u本語e (日u本) tfdc02
1042 ja-JP 日u本語e (日u本) tfsv02
1041 ja-JP 日u本語e (日u本) tfsv01
HostName,IPAddress
tfdc01,192.168.1.1
tfdc02,192.168.1.2
tfsv01,192.168.1.3
tfsv02,192.168.1.4
154. 154
リユーザブルな PS セッションを使用するには
PS > $S = New-PSSession -ComputerName CL01
PS > Invoke-Command -session $S -ScriptBlock {$A=1}
PS > Invoke-Command -session $S -ScriptBlock {$B=2}
PS > Invoke-Command -session $S -ScriptBlock {$C=$A+$B}
PS > Enter-PSSession $S
[CL01] PS > Echo $C
[CL01] 3
PS > Exit-PSSession
PS > Remove-Session $S
• セッションの作成 :New-PSSession
• セッションの削除 :Remove-PSSession
• セッション一覧 :Get-PSSession
• セッションへの接続 :Connect-PSSession
セッションを作成
セッション内
で実行される
155. 155
複数ターゲットを含んだコネクションも可能
PS > $S = New-PSSession -ComputerName CL01,CL02
PS > $S
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
80 Session80 tfdc01 Opened Microsoft.PowerShell Available
81 Session81 tfdc02 Opened Microsoft.PowerShell Available
PS > Invoke-Command -Session $S {Get-Culture}
Target1コネクション セ
ッ
シ
ョ
ン
Target2セ
ッ
シ
ョ
ン
Source
157. 157
PS セッション情報の取得 ~ Get-PSSession
Target1コネクション セ
ッ
シ
ョ
ン
Source1
Source2
PS C:¥tools¥ps> Get-PSSession -ComputerName Target1
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
65 tfdc01_Session target1 Opened Microsoft.PowerShell Available
80 Session80 taeget1 Opened Microsoft.PowerShell Available
109 Session109 target1 Opened Microsoft.PowerShell Available
• リユーザブルなセッション情報は他のコンピューターからも参照できる
• 他のユーザーが作成したセッションは、Credential が有効であれば参照可能
-Credential パラメタを使用可能
158. 158
PS セッションへの再接続
Target1
セ
ッ
シ
ョ
ン
Source1
Source2
• リユーザーブルな PS セッションには他のコンピューターから再接続が可能
• State=Disconnected, Availability=None に対してのみ
• Disconnect-PSSession コマンドレットで明に Disconnect した場合
• ネットワークの切断や PC のハングアップ等で Disconnected になった場合
※ コンソールを明に落とした場合は強制終了したものとみなされる
• 同時に2台以上のコンピューターからは接続できない
State=Disconnected
Availability=None
再接続可能
Disconnect-PSSession
Connect-PSSession
159. 159
PS > $S = New-PSSession -ComputerName Target1
PS > $Result = Invoke-Command -Session $S {Get-Service}
PS > Disconnect-PSSession -Session $S
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
121 Session121 Target1 Disconnected Microsoft.PowerShell None
Target
PC1
PC
2
PS > Get-PSSession -ComputerName Target1
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
10 Session112 tfdc01 Disconnected Microsoft.PowerShell Busy
12 Session121 tfdc01 Disconnected Microsoft.PowerShell None
PS > $S = Get-PSSession -Name Session121 -ComputerName Target1
PS > Connect-PSSession -Session $S
160. 160
State と Availability
Availability
State
Opened 自分自身が接続している
Disconnected 自分自身は接続していない
誰も接続していない
他の誰かが接続してる
自分が接続している
None
Busy
Available
こ
の
組
み
合
わ
せ
な
ら
ば
再
接
続
可
能
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
10 Session112 tfdc01 Disconnected Microsoft.PowerShell Busy
12 Session121 tfdc01 Disconnected Microsoft.PowerShell None
161. 161
もしソース PC がダウンしたら
ソースが死んでもセッション情報はターゲットに残されている...ただし...
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
10 Session112 tfdc01 Disconnected Microsoft.PowerShell Busy
Availability が Busy なので、再接続できない
2
分
後
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
10 Session112 tfdc01 Disconnected Microsoft.PowerShell None
再接続可能!
162. 162
PS セッションの有効期間
• PS セッションのターゲットの再起動、シャットダウン
• Remove-PSSession を実行するまで
• セッションがアイドルタイムアウトするまで
• Disconnect してからの時間
PS > Remove-PSSession -Session $S
PS C:¥> Get-PSSessionConfiguration | ft name,idletimeoutms,maxidletimeoutms
Name IdleTimeoutms MaxIdleTimeoutms
---- ------------- ----------------
microsoft.powershell 7200000 2147483647
microsoft.powershell.workflow 7200000 2147483647
microsoft.powershell32 7200000 2147483647
microsoft.windows.servermanagerworkflows 180000 180000
2時間 596時間
規定値
163. 163
アイドルタイムアウト値の変更
PS C:¥> $SessionOption = New-PSSessionOption -IdleTimeOutMSec 60000
PS C:¥> $S = New-PSSession -ComputerName Target1 -SessionOption $SessionOption
設定方法
• 構成ファイルを変更
• Register-PSSessionConfiguration -TransportOption <$TransportOption>
• Set-PSSessionConfiguration -TransportOption <$TransportOption>
• PS セッション作成時(特定のセッションのみ)
• New-PSSession -SessionOption <$SessionOption>
• コマンド実行開始時(特定のセッションのみ)
• Invoke-Command -SessionOption <$SessionOption>
• PS セッション切断時(特定のセッションのみ)
• Disconnect-PSSession -IdeleTimeOutSec <秒>
164. 164
出力バッファモード
出力バッファがFULLになった場合の対応モード
• Block : バッファがClearされるまでコマンドの実行をサスペンドする
• Drop:コマンドの実行は続けるが古い出力結果から捨てられる
現在のモードを調べる
PS C¥> Get-PSSessionConfiguration | ft Name, OutputBufferingMode
Name OutputBufferingMode
---- -------------------
microsoft.powershell Block
microsoft.powershell.workflow Block
microsoft.powershell32 Block
microsoft.windows.servermanagerworkflows Block
「現在の PS セッションでは Drop モードで実行する」を設定
PS C:¥> $o = New-PSSessionOption -OutputBufferingMode Drop
PS C:¥> New-PSSession -SessionOption $o
165. 165
Source2 再接続可能
ループバック PS セッション
• LOCALHOST に対してリユーザーブルな PS セッションを作成すれば、
切断したあと別のマシンから再接続が可能
• 管理者モードで実行する必要がある
PS > $S = Get-PSSession -ComputerName localhost -Name Backup
PS > Receive-PSSession -Session $S
PS > Remove-PSSession -Session $S
Source1
/Target
セ
ッ
シ
ョ
ン
Connect-PSSession
PS> $S = New-PSSession -Name Backup
PS> Invoke-Command -Session $S -FilePath backup.ps1 -AsJob
PS> Disconnect-PSSession -Session $S
171. 171
2.PowerShell を管理者モードで起動
3.以下のコマンドを実行
PS C:¥> Set-ExecutionPolicy RemoteSigned
PS C:¥> Import-Module PowerShellWebAccess
PS C:¥> Install-PswaWebApplication -webSiteName "Default Web Site"
PS C:¥> Add-PswaAuthorizationRule * * *
4.https://<サーバー名>/pswa にアクセス
ここで指定するサーバーは、
ターゲットとなるサーバー
173. 173
• Windows PowerShell 2.0 よりサポート
• 長時間を要するコマンドレットを非同期に実行し、次の処理に移る
(例)get-eventlog “Security”
• ジョブの有効範囲は現在のセッション
• ジョブを生成するには
– -AsJob パラメタ
• 一部のコマンドのみが実装
• ワークフローコマンドには使用可能
– Start-Job コマンドレット
• すべてのコマンド、スクリプトをジョブ化可能
• ジョブの結果がどこに保存されるのかを意識することが重要!
バックグラウンドジョブ
174. 174
-AsJob
-AsJob パラメタを持つコマンドレットは少ない
PS C:¥> Get-Command -ParameterName asjob
CommandType Name ModuleName
----------- ---- ----------
Function Get-SMCounterSample ServerManagerTasks
Function Get-SMPerformanceCollector ServerManagerTasks
Function Get-SMServerBpaResult ServerManagerTasks
Function Get-SMServerClusterName ServerManagerTasks
Function Get-SMServerEvent ServerManagerTasks
Function Get-SMServerFeature ServerManagerTasks
Function Get-SMServerInventory ServerManagerTasks
Function Get-SMServerService ServerManagerTasks
Function Remove-SMServerPerformanceLog ServerManagerTasks
Function Start-SMPerformanceCollector ServerManagerTasks
Function Stop-SMPerformanceCollector ServerManagerTasks
Cmdlet Get-WmiObject Microsoft.PowerShell.Management
Cmdlet Invoke-Command Microsoft.PowerShell.Core
Cmdlet Invoke-WmiMethod Microsoft.PowerShell.Management
Cmdlet Remove-WmiObject Microsoft.PowerShell.Management
Cmdlet Restart-Computer Microsoft.PowerShell.Management
Cmdlet Set-WmiInstance Microsoft.PowerShell.Management
Cmdlet Stop-Computer Microsoft.PowerShell.Management
Cmdlet Test-Connection Microsoft.PowerShell.Management
※AsJobパラメタを持つコマンド一覧
176. 176
バックグラウンドジョブの基本操作
(例)
PS C:¥> $job = start-job -scriptblock {do {$a = 0; echo (date) ; start-sleep 5} while ($a -eq 0) }
PS C:¥> $job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
6 Job6 Completed True localhost get-eventlog "Windows ...
PS C:¥> Receive-Job $job -Keep
PS C:¥> Stop-Job $job
PS C:¥> Remove-job $job
書式
start-job -scriptblock { <スクリプトブロック> }
出力結果が存在する
規定では、出力結果は一度取得するとクリアされてしま
うので、-Keep によって残すように指定
5秒に1回日時を表示するジョブ
ジョブを停止
ジョブを削除
177. 177
スクリプトをバックグラウンドジョブ化するには
$flg = $true
$index = 0
$index_old = 0
Do
{
$Eventlog = Get-Eventlog -LogName TechFielders -Source TechFielders
$index = $eventlog | Select-Object -First 1 -Property Index
$delta_index = $index.Index - $index_old
if ($delta_index -gt 0) { $eventlog | `
Select-Object -First $delta_index | `
Sort-Object -Property Index }
Start-Sleep -Seconds 1
$index_old = $index.Index
} While ($flg)
まずはスクリプトを作成する(イベントログを取得するスクリプト)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
WatchNewEventLog.ps1
結果を Index をキーとして昇順に並べる
178. 178
##作成したスクリプトをバックグラウンドで実行する
PS C:¥> Start-Job -FilePath .¥WatchNewEventLog.ps1 -Name WatchNewEventLog
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
4 WatchNewEven... BackgroundJob Running True localhost $flg = $true...
## 以下のコマンドで現在までの結果を収集する
PS C:¥> Receive-Job -Name WatchNewEventLog
Index Time EntryType Source InstanceID Message
----- ---- --------- ------ ---------- -------
1 6 02 17:41 Information TechFielders 5963 テスト
2 6 02 18:09 Information techfielders 99 テスト
3 6 02 18:11 Information TechFielders 9909 テスト
4 6 02 18:12 Information TechFielders 9909 テスト
5 6 02 18:13 Information TechFielders 9909 テスト
6 6 02 18:13 Information TechFielders 9909 Hello
以下のコマンドで新しいイベントを書き込む
C:¥> Write-EventLog -LogName TechFielders -Message "Hello" -Source "TechFielders" -EventId 5963
180. 180
セッションの永続化とジョブの実行結果
PS> Invoke-Command -Session $S -FilePath backup.ps1 -AsJob
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 Job2 RemoteJob Completed True tfdc01 get-service
PS> Receive-Job -Id 2
SRC Target
実
行
結
果
(例1)Invoke-Command -AsJob を使用した場合
セッションに再接続する場合には、結果もリモートに保存しなければ意味がない!!
Invoke-Command をバックグ
ラウンドジョブ化するため
のオプション。
スクリプトはリモートだが、ジョブはローカル。
Invoke-Command の結果はローカルに保存されることに注意!!!
つまりローカルセッションが消えたらジョブの結果も消えるということ!!
181. 181
PS> $S = New-PSSession -ComputerName Target -Name Backup
PS> $Script = “.¥testscript.ps1"
PS> Invoke-Command -Session $S { Start-Job -FilePath $Script }
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost backup...
PS> Disconnect-PSSession -Session $S
SRC1 Target
実
行
結
果
(例2)Invoke-Command {Start-Job} を使用した場合
(つづく)
SRC2
スクリプトをジョブ化することで、結果がリモートに保存されるため、セッションを永続化すれ
ば別のコンピューターから取り出せる。
182. 182
PS> Get-PSSession -ComputerName tfdc01
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- -------------
1 backup tfdc01 Disconnected Microsoft.PowerShell None
PS> $S = Connect-PSSession -Name backup -ComputerName tfdc01
PS> Invoke-Command -Session $S { Get-Job }
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
1 Job1 BackgroundJob Completed True localhost
PS> Invoke-Command -Session $S {Receive-Job -Id 1}
別のコンピューターから接続して結果を取得
184. 184
ジョブスケジューリングの例
$trigger = New-JobTrigger -Daily -At 3am
Register-ScheduledJob -Name EnergyAnalysisJob -Trigger $trigger -ScriptBlock {
powercfg.exe -energy -xml -output C:¥temp¥energy.xml -duration 60 | Out-Null
$EnergyReport = [xml](get-content C:¥temp¥energy.xml)
$namespace = @{ ns = "http://schemas.microsoft.com/energy/2007" }
$xPath = "//ns:EnergyReport/ns:Troubleshooter/ns:AnalysisLog/ns:LogEntry[ns:Severity = 'Error']"
$EnergyErrors = $EnergyReport | Select-Xml -XPath $xPath -Namespace $namespace
$EnergyErrors.Node | select Name, Description
}
タスクマネージャーで参照可能
188. 188
想定している利用シーン
ターゲットとなる処理
• 長時間を要する処理
– 仮想マシンの展開
– ソフトウェアのインストール
– ビッグデータの集計 など
• 複数の処理の組み合わせ
• 複数のコンピューターに対する処理
– ドメイン参加
– 環境設定
– インベントリ収集 など
要求される制御機構
• タイムアウトやリトライ
• 処理の一時停止、再開
• 処理ステートの永続化
• 複数処理の制御
• 並列
• シーケンシャル
• スクリプト実行権限の委任
• 途中経過の取得
ワークフロー = バックグラウンドジョブ + リモーティング + 実行制御
190. 190
PowerShell 3.0 - ワークフロー
パラレル
WF
ジョブと結果の永続化
WF
処理1
処理2
checkpoint
結果ストア
結果1
checkpoint
処理3
サーバー
ダウン
サスペンド
WF
処理1
処理2
サスペンド
サーバーが条件
に合致しない場
合にサスペンド
し、あとでレ
ジューム
191. 191
PowerShell ワークフローの特長
• 実行中のコンピューターが再起動してもワークフロージョブは消えない
• 一時停止状態(Suspend)になる
• 長時間タスクの制御と監視
• アクティビティの進行状況はいつでも参照可能
• 自動リカバリ
• 途中経過は指定したポイントで保存されている
• ワークフローセッションへの接続と切断
• ワークフローを開始した PC とは別の PC から再接続が可能
• 同時に複数コンピューターへの接続
• ワークフロータスクを同時に大量のサーバーに配信可能
• 複数のスクリプトを1つのワークフローでコントロール
• スケジューリング
• 特定の状態をトリガーとして起動可能
• XAMLファイルでインポート、エクスポート可能
※ ワークフローが動作するコンピューターには Windows PowerShell 3.0 が必須
194. 194
Wokflow の作成
• PowerShell ISE(またはテキストエディタ) で作成する
• workflow キーワードを使用する
workflow <ワークフロー名> ( <引数> )
{
<処理>
}
workflow MyWorkflow ( [String] $ServiceName )
{
Get-Service -PSComputerName $PSComputerName -Name $ServiceName
}
(例)MyWorkflow という名前でリモートコンピューターのサービス一覧を取得するワークフロー
注意 -ComputerName ではない(後述)
共通パラメタ(後述)
197. 197
Workflow の登録先と実行環境について
• In-process 実行
Activity はローカルに登録される
PowerShell クライアントホスト上での実行
ワークフローが終了するまでセッションを切断できない
• Workflow セッション上での実行
Activity はリモートノードに登録される
Workflow 用に PS セッションを作成し、WinRM を通して実行する
一時的な切断が可能で、長時間のジョブを実行する際に便利
200. 200
Proxy Node
• リモートノードにワークフローを登録
=リモートでスクリプトを実行
自分のPC 登録
WF
Managed
Node
WinRM
WMI
Managed
Node
WinRM
WMI
Managed
Node
WinRM
WMI
実行
WinRM
PS C:¥> $S = New-PSWorkflowSession -ComputerName <Node>
PS C:¥> Invoke-Command –Session $S -FilePath mywf.ps1
ワーククフローが定義されているファイル
PS1ファイルがローカルにある場合
PS C:¥> $S = New-PSWorkflowSession -ComputerName <Node>
PS C:¥> Invoke-Command –Session $S { .¥mywf.ps1 }
PS1ファイルがリモートにある場合
201. 201
ワークフローをいつ登録すべきか?
注意 ワークフローは セッション または PSセッション 内でのみ有効
PS C:¥> Invoke-Command -ComputerName NODE -FilePath .¥mywf.ps1
ダメな例2:登録したとたんに消滅
PS C:¥> $S = New-PSSession -ComputerName NODE
PS C:¥> Invoke-Command -Session $S -FilePath .¥mywf.ps1
ダメじゃないけど気をつけなければならない例:PS セッション消滅とともにWF
も消滅
PS C:¥>.¥mywf.ps1
ダメな例1:コンソールを閉じた瞬間に消滅 orz
ワークフローは実行直前に登録したほうがよさそう...
PS C:¥> Invoke-Command -ComputerName NODE -FilePath .¥mywf.ps1 -asjob