power shell の基本操作と処理の自動化 v2_20120514

73
1 IT Pro ののののののののののの Windows PowerShell ののののののののののののののののの のののののののの のの のJunichi Anno http://blogs.technet.com/junichia/ Facebook: junichi anno のののののののののののののののの V2.0 2012.5.12 Fukuoka の

Upload: junichi-anno

Post on 28-May-2015

4.568 views

Category:

Documents


10 download

TRANSCRIPT

Page 1: Power shell の基本操作と処理の自動化 v2_20120514

1

IT Pro のためのスクリプト講座

Windows PowerShell を使おう!

日本マイクロソフト株式会社エバンジェリスト安納 順一 Junichi Annohttp://blogs.technet.com/junichia/Facebook: junichi anno

~ 基礎からサーバー管理の自動化まで

V2.02012.5.12 Fukuoka 版

Page 2: Power shell の基本操作と処理の自動化 v2_20120514

2

Agenda

• PowerShell の文化的背景• HOW TO USE “Windows PowerShell”• PowerShell 3.0 の新機能

Page 3: Power shell の基本操作と処理の自動化 v2_20120514

3

PowerShell の文化的背景

Page 4: Power shell の基本操作と処理の自動化 v2_20120514

4

Operator

アプリが重過ぎ!常識で考えろ!

Developer

開発者 vs インフラ担当者

新しい機能の開発既存機能との統合や

改善

サービスの展開と継続的で安定したサービスの提供

Development Integration Deployment Delivery

your machine!

your code!

情報が欲しかったら監視方法を詳しく教えろ!

バグがあるから直してくれ!

マシンスペックとか知らねーし

監視もできねーのかよ ww

直してほしかったら詳しい情報をよこせ!

Page 5: Power shell の基本操作と処理の自動化 v2_20120514

5

DevOps(=Development and Operations)開発サイドと運用サイドの協調により、Development ~ Delivery 全体のアジリティを高めるためのプロセス

Developer Operator

DevOps

(参考)・ Velocity 2009 : “10+ Deploys Per Day: Dev and Ops Cooperation at Flickr” by John Allspaw・ DevOps って何? by 宮下 さん http://www.slideshare.net/mizzy/devops-4156440

協調文化を確立し”IT” によりビジネスを進化させる

ビジネスに合わせたアプリケーションの進化

ビジネスに合わせたインフラの進化

Page 6: Power shell の基本操作と処理の自動化 v2_20120514

6

マイクロソフトの DevOps シナリオ

開発担当 運用担当

• Visual Studio 2011• IntelliTrace Agent

• System Center 2012• ConfigMgr 構成パッ

ク• OpsMgr 管理パック• OpsMgr AVICode• Orchestrator(Opalis)• SM インシデント管理• VMM Portal など

• Windows PowerShell• SQL Server bacpac  ・  ・

Page 7: Power shell の基本操作と処理の自動化 v2_20120514

7

DevOps における PowerShell の位置づけ• 目的ベースのコマンドレット( CmdLet )

• アプリケーションに対する処理の正確性• ビジネスにとっての高速性

• 自動化• オペレーション品質• ビジネスに合わせた拡張性

Exchange Server

メールボックス作成

GAL の一覧取得

APINew-Mailbox

目的 コマンドレット

Get-GlobalAddressList

Page 8: Power shell の基本操作と処理の自動化 v2_20120514

8

業務アプリケーション

Dev にとっての PowerShell ①

サービス開発担当 運用担当PowerShell

標準コマンドレット

開発

利用

アドバイス

利用

Windows Server OSActive Directory

SharePoint ServerExchange Server

・・

Page 9: Power shell の基本操作と処理の自動化 v2_20120514

9

PowerShell スクリプト

Dev にとっての PowerShell ②

サービス開発担当 運用担当サービス専用

コマンドレット開発

作成

処理の自動化製品のメンテナンス

障害の調査

実行

フィードバック

利用

Page 10: Power shell の基本操作と処理の自動化 v2_20120514

10

マイクロソフト製品と PowerShell の関係• 製品ごとに専用の”コマンドレット”が用意されている• 多くの管理 GUI は裏でコマンドレットを呼んでいる• インフラ担当者に、各製品への”標準化されたアクセス方法”を提供する

Active Directory

Active DirectoryPowerShell コマンドレット

Active Directory 管理センター

Hyper-V

VMMPowerShell コマンドレット

System Center Virtual Machine Manager

PowerShellコンソール

Page 11: Power shell の基本操作と処理の自動化 v2_20120514

11

Windows Management Framework

PowerShell が Management Hub となる

IT ProIT

DeveloperSolution

Developer

Storage Exchange DevicesDisk YOUR ELEMENTS

Windows PowerShell

CIMOM 、 SMI-S

標準化されたアクセス

標準化されたプロトコル

標準化されたモデル

WS-Man(Web Service for Management) 他のプラットフォーム

Service Provider

開発

NanoWBEM

Pegasus

Page 12: Power shell の基本操作と処理の自動化 v2_20120514

12

代表的なスクリプト言語バッチファイル(拡張子 .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 の存在を脅かしつつある。

Win

do

ws

Scrip

t

今後エンハンスの予定は無い

OS に合わせて継続的なエンハンス

今後エンハンスの予定は無い

(余談) HTML5 によって新 JavaScript エンジンに脚光が!ただし Windows Script とは別物

Page 13: Power shell の基本操作と処理の自動化 v2_20120514

13

Windows

.NET Framework

PowerShell スクリプト

exe

bat VBScript JScript

Script Engine

CLR (共通言語ランタイム)

Class Library

スクリプトの実行環境

PowerShell エンジンCOM

cmd/command

Windows Script HostCscript.exe Wscript.exe

COM

Page 14: Power shell の基本操作と処理の自動化 v2_20120514

14

コマンドシェルの進化と機能の包含

cmd.exe

command.com

高機能

NT

低機能

DOS/Win31 2000

XP/2003Vista/2008

Windows Script Host

PowerShell 上ではbat/vbs/js も実行可能

Win9x/Me

Win7/2008R2

Windows PowerShell

100

200

2300

コマンドレットの数

Page 15: Power shell の基本操作と処理の自動化 v2_20120514

15

VBScript vs PowerShellExchange 2003 (VBScript) Exchange 2007 ( PowerShell )

メールボックス統計

Set listExchange_Mailboxs = GetObject("winmgmts:{impersonationLevel=impersonate}!\\COMPUTERNAME\ROOT\MicrosoftExchangeV2").InstancesOf("Exchange_Mailbox")

For Each objExchange_Mailbox in listExchange_MailboxsWScript.echo "AssocContentCount =” + objExchange_Mailbox.AssocContentCountWScript.echo " DateDiscoveredAbsentInDS =” + objExchange_Mailbox.DateDiscoveredAbsentInDSWScript.echo " DeletedMessageSizeExtended =" + objExchange_Mailbox.DeletedMessageSizeExtendedWScript.echo " LastLoggedOnUserAccount =" + objExchange_Mailbox.LastLoggedOnUserAccountWScript.echo " LastLogoffTime =" + objExchange_Mailbox.LastLogoffTimeWScript.echo " LastLogonTime =" + objExchange_Mailbox.LastLogonTime WScript.echo " LegacyDN =" + objExchange_Mailbox.LegacyDNWScript.echo " MailboxDisplayName =” + objExchange_Mailbox. MailboxDisplayNameWScript.echo " MailboxGUID =" + objExchange_Mailbox.MailboxGUID WScript.echo " ServerName =" + objExchange_Mailbox.ServerName WScript.echo " Size =" + objExchange_Mailbox.SizeWScript.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"

Page 16: Power shell の基本操作と処理の自動化 v2_20120514

16

Windows PowerShell の基礎知識<超参考になるサイト>MVP 牟田口さんhttp://blogs.wankuma.com/mutaguchi/archive/2010/02/13/186034.aspx

Page 17: Power shell の基本操作と処理の自動化 v2_20120514

17

事前準備• コマンドシェルの環境設定

• 簡易編集を有効に• フォントを見やすく• 横幅の設定• バッファの設定

• エクスプローラーの環境設定• 「拡張子を表示しない」を無効に

• オンプレミスの”署名無しスクリプト”を実行できるようにする• Set-ExecutionPolicy RemoteSigned

• 必要に応じて自分専用の初期設定ファイルを作成• notepad $profile

cmd.exe と powershell.exe は独立している

必要なモジュールを読み込む .. など

要は自分で作ったスクリプトのこと

Page 18: Power shell の基本操作と処理の自動化 v2_20120514

18

実行ポリシーの設定~ Set-ExecutionPolicy

• “管理者として実行” する必要がある• 実行ポリシー

– Restricted:制限つき ( オペレーターモード ) (規定値)• 対話形式のみ• スクリプトは実行できない

– AllSigned:署名• スクリプトは、信頼された発行元による署名が必要

– RemoteSigned:リモートの署名• “インターネットゾーン” のスクリプトは信頼された発行元による署名が必要

– Unrestricted:無制限• すべてのスクリプトを実行可能• リモートのスクリプトについては常に警告

– Bypass:バイパス• 何もブロックされず警告も表示されない

http://technet.microsoft.com/ja-jp/library/dd347628.aspx

“ ポリシーの設定”は、規定ではコンピューター全体に影響する。適用範囲を制限するには、 Scope も同時に定義する。

Page 19: Power shell の基本操作と処理の自動化 v2_20120514

19

スクリプトの作成環境

バッチファイル

VBScript

PowerShell

エディタ デバッガ

フリー / シェアウェア /商用のエディタ

フリー / シェアウェア /商用のエディタ

メモ帳PowerShell ISE

なし ??

エディタ組み込み

エディタ組み込み

VbsEdit

メモ帳&目視

2.0 からは標準装備

Page 20: Power shell の基本操作と処理の自動化 v2_20120514

20

スクリプトの作り方と実行方法

1. エディタを開く※スクリプトはテキストファイル

2. スクリプトを書いて「名前をつけて保存」拡張子は .ps1

3. PowerShell コンソールを開いてファイル名を入力

または PowerShell ISE で開いて“実行”または エクスプローラからダブルクリック

PS C:\> .\sample.ps1

Page 21: Power shell の基本操作と処理の自動化 v2_20120514

21

覚えておくと便利な機能

メモ帳 編 指定した行番号に飛ぶ  Ctrl + G ステータスバーを表示すると行と列が参照できる

 ※いずれも「右端で折り返し」を無効にしておくこと

PowerShell コンソール、 ISE 編 タブでコマンドレットやパラメタの続きを補完

 (例) get-mem[Tab]     ↓     Get-Member

※PowerShell 3.0 では Intellisence が実装されている

Page 22: Power shell の基本操作と処理の自動化 v2_20120514

22

“使用法” を理解するために

“ 使用法”を得る方法をおさえておこう

• 呼び出し可能なコマンドレット一覧取得• Get-Command

※インストールされているモジュールによってコマンドレットは増減する

• コマンドレットの詳細な書式と利用例を表示• Get-Help < コマンドレット > -detailed

• 使用可能なオブジェクトストア(ドライブ)の取得• Get-PSDrive

※インストールされているモジュールによってドライブは増減する

Page 23: Power shell の基本操作と処理の自動化 v2_20120514

23

(つづき)• インストールされているモジュールを表示する

• Get-Module

※”ActiveDirectory” や “ GroupPolicy” 、” Hyper-V” など、必要なモジュールが読み込まれていないとコマンドレットを使用することはできない

• コマンドレットのメソッドとプロパティ等を表示• < コマンドレット > | get-member • < コマンドレット > | get-member | sort-object Name | format-

list

※ COM のメンバーも取得できる  New-Object -com scripting.filesystemobject | Get-Member

• コマンドレットのエイリアス• Get-Alias• Get-Alias < エイリアス > (例) Get-Alias dir

Page 24: Power shell の基本操作と処理の自動化 v2_20120514

24

ドライブファイルシステムだけではなく、さまざまなオブジェクトがドライブとしてアクセス可能(つまり CD コマンドで移動可能)

モジュールが読み込まれていないと使えないものもある(例) ActiveDirectory

ファイルシステム エイリアス( Alias:) レジストリ( HKLM: 、 HKCU: ) 証明書( Cert:) 環境変数( Env: ) 変数( Variable:) WSMAN設定( Wsman:) Active Directory(AD:)

追記

PS C:\> Get-PSDrive

Page 25: Power shell の基本操作と処理の自動化 v2_20120514

25

操作メソッドメソッド

プロパティプロパティ

オブジェクトPowerShell の戻り値は「オブジェクト」である“オブジェクトとはプロパティとメソッド(操作)の集まり "

サイズ

ブランド

パーツ

ペダルをこぐ

ハンドルを右に切る

ハンドルを左に切る

フロント ブレーキをかける

リア ブレーキをかける

もしも”オブジェクト”が自転車だったら ...

Page 26: Power shell の基本操作と処理の自動化 v2_20120514

26

メソッドプロパティ

オブジェクト

DisplayName

Status

DependentServices

Stop()

Start()

Pause()

もしも”オブジェクト”が「 Windows のサービス」だったら。。。

MachineName

PS C:\> Get-Service | Get-Member

Windowsサービス

オブジェクトのメソッドとプロパティ一覧を参照するには

Page 27: Power shell の基本操作と処理の自動化 v2_20120514

27

オブジェクトであるということは ...

PS C:\>$a = “abc”

#普通ならば $a は”文字列” になるけれど ...# オブジェクトだからメソッドとプロパティが用意されている

PS C:\>$a.ToUpper()PS C:\>ABCPS C:\>$a.ToUpper().Split("B")[0]PS C:\>A

Page 28: Power shell の基本操作と処理の自動化 v2_20120514

28

PS C:\>get-service | where-object {$_.Status -eq "Running"}

PowerShell の典型的な使い方①(例)起動中のサービス一覧

パイプ

サービス一覧を出力

object

サービス一覧

オブジェ

クト

のまま渡される

object

サービス一覧

Page 29: Power shell の基本操作と処理の自動化 v2_20120514

29

(参考) 3.0 では書式を簡略化できます

PS C:\>get-service | where-object {$_.Status -eq "Running"}

PS C:\>get-service | where-object Status -eq "Running"

V3 ではこう書ける

Page 30: Power shell の基本操作と処理の自動化 v2_20120514

30

PowerShell の典型的な使い方②(例)サービスを停止する

PS C:\>(Get-Service -Name WSearch).Stop()

メソッド

Windows Search サービスのインスタンスを取得

object

Windows Search

インスタンスに対してメソッドを実行

Page 31: Power shell の基本操作と処理の自動化 v2_20120514

31

コマンドからの出力もオブジェクト化される

PS C:\> (ipconfig)[18].Split(":")[1].Trim()

object

ipconfig の

出力結果の 18 行目( 0 から数えて)

IPv4 アドレス . . . . . . . . . . : 192.168.1.100

ipconfig の出力結果から IP アドレスを取りだす

コロンで分割した( 0 から数えて)

2つ目の値 前後の空白をトリミング

Page 32: Power shell の基本操作と処理の自動化 v2_20120514

32

スクリプトを作成するにあたっておさえておきたい基本機能

• コメント• 行継続• 引数を受け取る• 変数を使う• True と False• 入出力(コンソール / ファイ

ル)• 繰り返し(ループ)処理• 出力結果のフォーマット変換• 環境変数を取得• 日時取得• 結果を検索• リモーティング• バックグラウンドジョブ

• unix 系コマンド

Page 33: Power shell の基本操作と処理の自動化 v2_20120514

33

コメントを付ける

# 処理開始copy-item C:\tmp\*.txt -destination C:\tmp2# 処理終了

Page 34: Power shell の基本操作と処理の自動化 v2_20120514

34

行継続

アクサン グラーブ記号 (`) を使用する

copy-item C:\tmp\*.txt `-destination C:\

こいつ

Page 35: Power shell の基本操作と処理の自動化 v2_20120514

35

引数を受け取る

Write-Output $args[3]

foreach ( $a in $args ) { Write-Output $a }

C:\> .\hogehoge.ps1 My name is “Junichi Anno” .

5つの引数

MynameisJunichi Anno.

Junichi Anno

Page 36: Power shell の基本操作と処理の自動化 v2_20120514

36

名前付き引数

param([string] $UserID = “ID", [string] $Password =“PASS")Write-Output $useridWrite-Output $Password

引数を所定の名前の変数に格納することで、文法チェック等が行いやすくなる

C:\> hogehoge.ps1 -userid anno

annoPASS

出力結果

規定値

Page 37: Power shell の基本操作と処理の自動化 v2_20120514

37

変数

$FirstName = "Junichi"$LastName = "Anno"$FullName = $FirstName + " " + $LastNameWrite-Output $FullName$arrFullName = $FullName.Split(" ")Write-Output $arrFullname[0]

PS C:\> C:\hogehoge.ps1Junichi AnnoJunichi

出力結果

Page 38: Power shell の基本操作と処理の自動化 v2_20120514

38

True と False の指定

$True と $ False が予約されている

C:\> $MyNameIsJunichi = $TrueC:\> If ($MyNameIsJunichi -eq $True) {Echo 1}1

Page 39: Power shell の基本操作と処理の自動化 v2_20120514

39

入出力方法

# 標準出力

Write-Output “Hello”

# 標準入力

$InputData = Read-Host

# ファイルに出力

$Record = “hogehoge”

Out-File -filepath C:\tmp\list.txt -inputobject $Record

# ファイルから入力

$file = Get-Content -Path c:\tmp\list.txt

これを抑えておけば、ひとまずたいていのことはできます

Page 40: Power shell の基本操作と処理の自動化 v2_20120514

40

出力結果のフォーマット変換して表示したい

dir | format-table Name,Lengthdir | format-list Name,Lengthdir | format-wide Name -column 6dir | out-gridview

Page 41: Power shell の基本操作と処理の自動化 v2_20120514

41

特定のプロパティだけをオブジェクトとして取得したい

dir | Select-Object Name,Length

戻り値の「見た目」は同じだが、オブジェクトタイプが異なることに注意!

PS C:\> dir |ft Name,Lenght |Get-Member

PS C:\> dir |Select-Object Name, Length |Get-Member

以下の出力結果を比較しましょう後から Name や Length

を再利用できない

Page 42: Power shell の基本操作と処理の自動化 v2_20120514

42

条件を指定して検索した結果だけをオブジェクトとして取得したい

# サイズが 1024 バイト以上のファイルを検索するDir | Where-Object {$_.length -GT 1024} `|Select-Object Name,length

#Active Directory のユーザー名に” a” を含むユーザーを取得するGet-ADUser -Filter * `|Where-Object {$_.name -Like "*a*"} `| ForEach-Object name

Page 43: Power shell の基本操作と処理の自動化 v2_20120514

43

繰り返し処理

#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

Page 44: Power shell の基本操作と処理の自動化 v2_20120514

44

繰り返し処理

#1 から 10 までを出力1..10

#1 から 10 をリダイレクトして出力1..10 | % {echo $_ }

#User1 から User10 を作成1..10 | % {New-ADUser “User$_” }

※ % は foreach のエイリアス

Page 45: Power shell の基本操作と処理の自動化 v2_20120514

45

繰り返し処理

$i = 0do {

Write-Host $i$i++

}

while ($i -lt 10)

$i = 0do {

Write-Host $i$i++

}

until ($i -ge 10)

Page 46: Power shell の基本操作と処理の自動化 v2_20120514

46

環境変数を取得

# 一覧を取得cd env:dir

#特定の環境変数を取得$env:computername$env:username$env:userdomain$env:SessionName

Page 47: Power shell の基本操作と処理の自動化 v2_20120514

47

日時を取得( Date オブジェクト)

DateDayDayOfWeekDayOfYearHourKindMillisecondMinuteMonthSecondTicksTimeOfDay

YearDateTime

AddAddDaysAddHoursAddMillisecondsAddMinutesAddMonthsAddSecondsAddTicksAddYearsCompareToEqualsGetDateTimeFormatsGetHashCodeGetTypeGetTypeCode

IsDaylightSavingTimeSubtractToBinaryToFileTimeToFileTimeUtcToLocalTimeToLongDateStringToLongTimeStringToOADateToShortDateStringToShortTimeStringToStringToUniversalTime

プロパティ メソッドPS C:\> (Date).Year

2012PS C:\> (date).adddays(10)24 年 5 月 23 日 12:49:10

Page 48: Power shell の基本操作と処理の自動化 v2_20120514

48

リモーティング• 3 種類のリモーティング

• -ComputerName パラメタ• 複数のコンピュータを指定可能

• 対話モード( Enter-PSSession コマンドレット)• SSH のような使い方

• Invoke モード( Invoke-Command コマンドレット)• -ComputerName に対応していないコマンドで使用• 複数のコンピュータに対して一括実行• コマンド単体( -scriptblock )、

PS1 スクリプト( -filepath )の指定が可能

• 送受信双方でリモーティングの準備が必要

Page 49: Power shell の基本操作と処理の自動化 v2_20120514

49

PowerShell セッション( PSSessions )

PS> Enter-PSSession -ComputerName Server1[Server1]: PS > $A = 1[Server1]: PS > $B = 2[Server1]: PS > $C = $A + $BPS>Exit-PSSession

PS> Invoke-Command -ComputerName Server1 -ScriptBlock {$A = 1}

PS> Invoke-Command -ComputerName Server1 -ScriptBlock {$B = 1}

Enter-PSSession を使用

Invoke-Command を使用

PS> Invoke-Command -ComputerName Server1 -ScriptBlock {$C = $A + $B}

1つのセッション

• コマンドの実行空間単位• セッション内ではデータの共有が可能• 通常はテンポラリセッションが作成され、コマンド終了後に削除される

Page 50: Power shell の基本操作と処理の自動化 v2_20120514

50

PSSession の永続化

PS > $S = New-PSSession -ComputerName CL01PS > 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 > Remove-Session $S

• セッションの作成 : New-PSSession• セッションの削除 : Remove-PSSession• セッション一覧 : Get-PSSession• セッションへの再接続 : Enter-PSSession

PS > $S = New-PSSession -ComputerName CL01PS > Enter-PSSession $S[CL01] PS > Get-VM | Where-Object name -EQ "TFWIN7-0" PS > Exit-PSSession

Page 51: Power shell の基本操作と処理の自動化 v2_20120514

51

モジュールとコマンドのインポート• リモートコンピューター上のコマンドレットを一時的に取り込むことができ

る• “Invoke-Command -Session” を使用する必要が無くなる• コマンドの実行中はセッションを生かしておく必要がある

PSSession

Windows 7 Windows Server 2008 R2w/ Hyper-V

Hyper-V module• Get-VM• Start-VM• Stop-VM• ・• ・

PS C:\> Get-VM |ft name

Name ---- TFWin7-0 TFWin7-1 FX TFWin8-0 FX TFWin8-1 Win7_template Win8_template

Pow

erS

hell

実行空間

PSSession を通じてモジュールをインポート

PS C:> $s = New-PSSession -ComputerName Server1PS C:> Import-PSSession -Session $s -Module HYPER-V

Page 52: Power shell の基本操作と処理の自動化 v2_20120514

52

関連コマンドレット Get-Job

バックグラウンドジョブを取得 Receive-Job

バックグラウンドジョブの出力結果を取得 Remove-Job

バックグラウンドジョブを削除 Start-Job

バックグラウンドジョブを開始 Stop-Job

バックグラウンドジョブを停止 Wait-Job

バックグラウンドジョブが終了するまで待つ

バックグラウンドジョブ• Windows PowerShell 2.0 よりサポート• 長時間を要するコマンドレットを非同期に実行し、次の処理に移る

(例) get-eventlog “Windows PowerShell”

• ジョブの有効範囲は現在のセッション

Page 53: Power shell の基本操作と処理の自動化 v2_20120514

53

バックグラウンドジョブの作成 / 開始 /状態 /結果取得

(例)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 -KeepPS C:\> Stop-Job $jobPS C:\> Remove-job $job

書式start-job -scriptblock { < スクリプトブロック > }

出力結果が存在する

規定では、出力結果は一度取得するとクリアされてしまうので、 -Keep によって残すように指定

5秒に 1回日時を表示するジョブ

ジョブを停止

ジョブを削除

Page 54: Power shell の基本操作と処理の自動化 v2_20120514

54

リモートバックグラウンドジョブリモートコンピューターでバックグラウンドジョブを実行する場合には、リモーティング手法を使用する

PS C:\> $session = New-PSSession -Name testjob -ComputerName vlab-server40PS C:\> $job = Invoke-Command -Session $session -ScriptBlock {Get-EventLog "windows powershell"} -AsJob

PS C:\> Get-Job

Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 21 Job21 Completed True vlab-server40 Get-EventLog "windows ...

PS C:\> Receive-Job $job

ジョブとして実行

(注意)ジョブはローカルコンピューターに作成される

結果を取得

Windows PowerShell 3.0 では、ジョブの実行中にセッションを切断することが可能結果はゆっくり自宅から ... とか

Page 55: Power shell の基本操作と処理の自動化 v2_20120514

55

unix のあのコマンドは?ls → get-ChildItemcp → copy-Object grep → select-Stringsort → sort-Objectman → helpclear → clear-Hostcat → get-Contentkill → stop-Processtee → tee-Objecttail → get-Content

「アレはあるかな?」と思ったら

Get-Alias <unix 上のコマンド >

Page 56: Power shell の基本操作と処理の自動化 v2_20120514

56

Get-Content で Tail を模してみる

## 新しく追加された行を待ち合わせて表示gc test.txt -wait

## テキストファイルの 5 行目から 10 行目までを表示(gc test.txt)[4..9]

## テキストファイルの最初の 5 行を表示gc test.txt -totalcount 5

## テキストファイルの最後の 5 行を表示 gc test.txt | Select-Object -Last 5

## 新しく追加された行に特定の文字列が含まれていたら表示 gc test.txt -wait | Select-String -Pattern ^a

Page 57: Power shell の基本操作と処理の自動化 v2_20120514

57

Windows Management Framework 3.0

Windows Server “8” に対応した新しい管理フレームワーク

Beta

http://www.microsoft.com/download/en/details.aspx?id=28998

Page 58: Power shell の基本操作と処理の自動化 v2_20120514

58

Windows Management Framework 3.0

• PowerShell 3.0 (コマンドレット数 2300 !)– ワークフロー– セッションへの再接続– PSScheduledJob モジュールによるジョブスケジューリングへの対応– Show-Command による GUI を使用したコマンド入力– パブリックネットワークでの Enable-PSRemoting

( -SkipNetworkProfileCheck オプション)– WEB/Json系コマンドレット– 新しい PowerShell ISE

• Windows PowerShell Web Service• Server Manager CIM プロバイダー• WinRM 、 WMI のアップデート

http://blogs.technet.com/b/junichia/archive/2012/03/21/3487696.aspx

Page 59: Power shell の基本操作と処理の自動化 v2_20120514

59

PSSession の扱いの違い

PowerShell 2.0 の場合

PSSession

セッション情報

PowerShell 3.0 beta の場合

PSSession

セッション情報

セッション情報はローカルに保存されるため、別のクライアントから再接続できない

セッション情報はリモートコンピューターに保存されるため、別のクライアントから再接続できる

Page 60: Power shell の基本操作と処理の自動化 v2_20120514

60

Session への再接続セッション情報がリモートコンピュータ内に保存されるようになった

Name = Session1

New-PSSession -ComputerName ServerA

$A = 1

Disconnect-PSSessions -Name Session1

Connect-PSSession -ComputerName ServerA-Name Session1

Enter-PSSession -Name Session1Connect-PSSession -Name Session1

Enter-PSSession -Name Session1

$A = 1

Server1

Exit-PSSession

セッション作成

PS C:\>$A1

再接続

自宅社内

Page 61: Power shell の基本操作と処理の自動化 v2_20120514

61

ワークフロー

ターゲット• 長時間を要する処理

– 仮想マシンの展開– ソフトウェアのインストール– ビッグデータの集計 など

• 複数の処理の組み合わせ• 複数のコンピューターに対する処理

– ドメイン参加– 環境設定– インベントリ収集 など

ニーズ• タイムアウトやリトライ• 処理の一時停止、再開• 処理ステートの永続化• 複数処理の制御

• 並列• シーケンシャル

• スクリプト実行権限の委任• 途中経過の取得

ワークフロー = バックグラウンドジョブ + 実行制御

Page 62: Power shell の基本操作と処理の自動化 v2_20120514

62

ワークフローの作成と実行

## 作成workflow <ワークフロー名 > ( < 引数 > ) {

< スクリプトブロック > }

## 実行PS C:\> <ワークフロー名 > < 引数 > <共通パラメタ >

Page 63: Power shell の基本操作と処理の自動化 v2_20120514

63

## 作成例workflow testwf ( [string] $UserID, [string] $Password ) {

Echo -InputObject $PSComputerName, $UserID, $Password }Start-Sleep -Seconds 5

}

## 実行例PS C:\> testwf Yamada Pass -PSComputerName PC1,PC2,PC3PC1YamadaPassPC2YamadaPassPC3YamadaPass

ここで指定した 3つのコンピューターに対してワークフローが同時に実行される

Page 64: Power shell の基本操作と処理の自動化 v2_20120514

64

ワークフロー共通パラメタワークフローの中で指定するためのパラメタで、既定の変数名でアクセスできる

パラメタ名 意味

PSParameterCollection

PSComputerName ターゲットコンピューター。複数指定すると、複数のコンピューターでワークフローが同時実行される。

PSCredential ターゲットコンピューターに接続するための資格情報

PSConnectionRetryCount ターゲットコンピューターに再接続を試みる回数

PSConnectionRetryIntervalSec 再接続までの時間間隔

PSRunningTimeoutSec ワークフローが終了するまでの制限時間。制限時間がくるとワークフローは強制終了される。ワークフローが一時停止していた場合には、その時間は実行時間には含まれない。

PSPersist $True または $False 。ワークフロー内部で出力した結果を永続化する。

PSAuthentication 使用する認証のメカニズムを指定する。Default / None / Connect / Call / Packet / PacketIntegrity / PacketPrivacy

PSApplicationName ターゲットコンピューターに接続するために使用する接続 URI のアプリケーション名を指定する。既定は WSMAN 。

PSPort リモートコンピューターに接続する際のポート番号。既定では 5985 ( WinRM for HTTP )または 5986 ( WinRM for HTTPS )。

Page 65: Power shell の基本操作と処理の自動化 v2_20120514

65

パラメタ名 意味

PSUseSSL リモートコンピューターと SSL を使用して接続する

PSConfigurationName ワークフローの構成情報が格納された構成名を指定する。規定値は Microsoft.PowerShell

PSConnectionURI 接続に使用するエンドポイントを指定する。規定は http://localhost:5985/WSMAN

PSAllowRedirection ターゲットコンピューターが URI のリダイレクトを要求してきたときに、それをPowerShell が許可するかどうかを指定する。規定値は $False 。

PSSessionOption New-PSSessionOption で作成された拡張オプションを指定する。

PSCertificateThumbprint 権限を持った X.509証明書のサムプリントを指定する

PSPrivateMetadata ワークフローの実行時に使用される、ユーザーやアプリケーションの情報が格納されたハッシュテーブルを指定する

AdJob ワークフローをバックグラウンドジョブとして実行する際に指定する。このオプションを使用すると、ジョブ情報がオブジェクトとして返されるので、これを使用して関連モマンドレット( *-job )でジョブの制御を行うことができる。

Jobname AsJob パラメタで実行した場合、規定では Job<n> という名前が付けられるが、このパラメタを使用してわかりやすいジョブ名を指定することができる。

InputObject ワークフローの引数

Page 66: Power shell の基本操作と処理の自動化 v2_20120514

66

共通パラメタの使用例

## 例: pc1,pc2,pc3 をドメイン Contoso に参加させるWorkflow JoinDomain ([string] $Domain){ Get-WmiObject –Class Win32_ComputerSystem –PSComputerName $PSComputerName Add-Computer -PSComputerName $PSComputerName -DomainName $Domain –Credential $PSCredential Restart-Computer -PSComputerName $PSComputerName -Wait -For PowerShell -Force Get-WmiObject -Class Win32_ComputerSystem -PSComputerName $PSComputerName}

## ワークフローの実行PS C:\> JoinDomain Contoso.com -PSComputerName pc01,pc02,pc03 -PSCredential $Cred

Page 67: Power shell の基本操作と処理の自動化 v2_20120514

67

並列実行とシーケンシャル実行

workflow testwf { parallel { echo -InputObject "a" sequence { echo -InputObject "c" echo -InputObject "d" } echo -InputObject "b"

}}

ここは並列処理

ここはシーケンシャル

Page 68: Power shell の基本操作と処理の自動化 v2_20120514

68

PowerShell Web Access

PSWS

Internet DMZ INTRANET

SSL WS-MAN

Page 69: Power shell の基本操作と処理の自動化 v2_20120514

69

PowerShell Web Access のセットアップ

1.サーバーマネージャーから PowerShell Web Access をインストールする

Page 70: Power shell の基本操作と処理の自動化 v2_20120514

70

2. IIS で自己署名証明書を作成してバインドを設定する( SSL を有効に)

ご自身のサーバーを指定してください

バインドの設定で作成した証明書を選択

Page 71: Power shell の基本操作と処理の自動化 v2_20120514

71

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 にアクセス 

ここで指定するサーバーは、管理したいサーバー

Page 72: Power shell の基本操作と処理の自動化 v2_20120514

72

まとめ

Windows PowerShell を始めたら、PowerShell だけを使い続けましょう!

コマンドプロンプトに戻ってはいけません !

PowerShell に「一短」はありません !

Page 73: Power shell の基本操作と処理の自動化 v2_20120514

73