More Related Content Similar to PowerShell の基本操作とリモーティング&v3のご紹介 junichia Similar to PowerShell の基本操作とリモーティング&v3のご紹介 junichia (20) More from junichi anno (20) PowerShell の基本操作とリモーティング&v3のご紹介 junichia1. IT Pro のためのスクリプト講座
Windows PowerShell を使おう!
~ 基礎からサーバー管理の自動化まで
2012.3.24 版
日本マイクロソフト株式会社
エバンジェリスト
安納 順一 Junichi Anno
http://blogs.technet.com/junichia/
Facebook: junichi anno
1
4. 開発者 vs インフラ担当者
Development Integration Deployment Delivery
Developer your
machine!
your code! Operator
新しい機能の開発 サービスの展開と
既存機能との統合や 継続的で安定した
改善 サービスの提供
直してほしかったら バグがあるから直してくれ!
詳しい情報をよこせ!
情報が欲しかったら
監視もできねーのかよww 監視方法を詳しく教えろ!
マシンスペックとか知らねーし アプリが重過ぎ!常識で考えろ!
4
5. DevOps(=Development and Operations)
開発サイドと運用サイドの協調により、
Development ~ Delivery 全体のアジリティを高めるためのプロセス
Developer Operator
ビジネスに合わせた ビジネスに合わせた
アプリケーションの DevOps インフラの進化
進化
協調文化を確立し
”IT”によりビジネスを進化させ
(参考)
る
・Velocity 2009 : “10+ Deploys Per Day: Dev and Ops Cooperation at Flickr” by John Allspaw
・DevOps って何? by 宮下 さん http://www.slideshare.net/mizzy/devops-4156440 5
6. マイクロソフトの DevOps シナリオ
• Visual Studio 2011
• IntelliTrace Agent
• System Center 2012
• ConfigMgr 構成パック
• OpsMgr 管理パック
• OpsMgr AVICode
開発担当 • Orchestrator(Opalis) 運用担当
• SM インシデント管理
• VMM Portal など
• Windows PowerShell
• SQL Server bacpac
・
・
6
7. DevOps における PowerShell の位置づけ
• 目的ベースのコマンドレット(CmdLet)
• アプリケーションに対する処理の正確性
• ビジネスにとっての高速性
• 自動化
• オペレーション品質
• ビジネスに合わせた拡張性
API 目的 コマンドレット
メールボックス作成 New-Mailbox
GALの一覧取得 Get-GlobalAddressList
Exchange Server 共有ポリシーの変更 Get-GlobalAddressList
7
8. DevOps における PowerShell の位置づけ
PowerShell スクリプト
作成
サービス サービス専用
開発 利用 運用担当
開発担当 コマンドレット
実
行
処理の自動化
フィード 製品のメンテナンス
バック 障害の調査
8
9. マイクロソフト製品と PowerShell の関係
• 製品ごとに専用の”コマンドレット”が用意されている
• 多くの管理 GUI は裏でコマンドレットを呼んでいる
• インフラ担当者に、各製品への”標準化されたアクセス方法”を提供す
る
Active Directory PowerShell System Center
管理センター コンソール Virtual Machine Manager
Active Directory VMM
PowerShell コマンドレット PowerShell コマンドレット
Active Directory Hyper-V
9
10. PowerShell が Management Hub となる
IT Solution Service
IT Pro Developer Developer Provider
開
発
Windows Management Framework
標準化されたアクセス Windows PowerShell
他のプラッ
標準化されたプロトコル WS-Man(Web Service for Management)
トフォーム
標準化されたモデル CIMOM、SMI-S NanoWBEM
Pegasus
Disk Storage Exchange Devices YOUR ELEMENTS
10
11. 代表的なスクリプト言語
バッチファイル(拡張子 .bat) OSに合わせて継続的なエンハンス
MS-DOS時代から使われてきたコマンドシェル上のスクリプト。脈々と現代に引き継がれてお
り、利用者が多い。豊富なコマンド群によって支えられており、案外使い出がある。複数の
スクリプトを取りまとめる役割としても便利。
VBScript(拡張子 .vbs) 今後エンハンスの予定は無い
Visual Basic のスクリプト版。「Visual」とあるが、Visual ではない。わかりやすい文法
Windows
Script
と、緩い規則によって根強いファンが多い。亜種として VBA もあるが微妙に文法は異なる。
Jscript(拡張子 .js) 今後エンハンスの予定は無い
JavaScript のMS 実装版として、VBScript とともに登場。JavaScript を Microsoft の独自
仕様によって拡張することで、汎用性を増している。
(余談)HTML5 によって新 JavaScript エンジンに
脚光が!ただしWindows Scriptとは別物
PowerShell(拡張子 .ps1)
いわずと知れた高機能スクリプト言語。.NET Framework が使えると言うメリッ
トから、利用者は爆発的に増殖中。多くの製品がPowerShell用のコマンドレット
を提供しはじめており、Windows Script Host の存在を脅かしつつある。
11
12. スクリプトの実行環境
bat VBScript JScript PowerShell スクリプト
PowerShell エンジン
COM
exe
Script Engine C .NET Framework
Windows Script Host O Class Library
cmd/
Cscript.exe Wscript.exe M CLR(共通言語ランタイム)
command
Windows
12
13. コマンドシェルの進化と機能の包含
DOS/ Win9x/ XP/2003 Win7/ 8
Win31 Me NT 2000 Vista/2008 2008R2
低機能
command.com
cmd.exe
Windows Script Host
Windows PowerShell
100
PowerShell 上では
高機能 bat/vbs/js も実行可能 コマンドレットの数
200
2300
13
14. VBScript vs PowerShell
Exchange 2003 (VBScript) Exchange 2007(PowerShell)
メール Set listExchange_Mailboxs =
GetObject("winmgmts:{impersonationLevel=impersonate}!COMPUTERNAMEROOTMicrosoftExchangeV2").InstancesOf("Exchange_Mailbox") get-mailboxstatistics
ボックス
統計 For Each objExchange_Mailbox in listExchange_Mailboxs –server $servername
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
データ Dim StorGroup as New CDOEXM.StorageGroup
move-storagegrouppath
ベース
管理 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
-identity "First Storage
Exchange,CN=Services, CN=Configuration," + DomainName
Group"
StorGroup.MoveLogFiles("C:newlogPath", 0) –log "C:newlogPath"
受信者 Dim objMailbox As CDOEXM.IMailboxStore
enable-mailbox
管理
Set objMailbox = GetObject("LDAP://" + DCServer + "CN=FOO,CN=users," + DomainName) -identity domainFOO
objMailbox.CreateMailbox "LDAP://" + DCServer + "/CN=Private MDB,CN=First Storage –database "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 GroupPrivate MDB"
14
15. VBScript PowerShell
szDomain = "DC=annou,DC=com"
42日以内にパス intDaysBefore = 30
szDateTime = DateAdd(“d”, 0 - intDaysBefore, Now)
Get-ADObject -LDAPFilter:
ワードの有効期限
lngDateTime = CDateToInt8(szDateTime)
Set objConnection = CreateObject(“ADODB.Connection”)
"(&(objectCategory=person)(objectClass=user)(!userAccountCo
が切れるユーザー objConnection.Open “Provider=ADsDSOObject;”
Set objCommand = CreateObject(“ADODB.Command”)
objCommand.ActiveConnection = objConnection
ntrol:1.2.840.113556.1.4.803:=8388608)(!userAccountControl:
を検索する objCommand.Properties(“Page Size”) = 20000
objCommand.CommandText = “<LDAP://” & szDomain & “>;” & _ 1.2.840.113556.1.4.803:=65536)(pwdLastSet>=1297292760000
“(&(objectCategory=person)(objectClass=user)” & _
“(pwdLastSet<=” & lngDateTime & “));” & _
“cn,distinguishedName,pwdLastSet;“ & "subtree"
00000)(pwdLastSet<=129765564000000000))"
Set objRecordSet = objCommand.Execute
Do Until objRecordset.EOF
-Properties:sAMAccountType,pwdLastSet,givenName,sn,title,
szDN = objRecordset.Fields(“distinguishedName”)
szUser = objRecordset.Fields(“cn”)
lngpwdLastSet = objRecordset.Fields(“pwdLastSet”)
userPrincipalName
dtpwsLastSet = CInt8ToDate(lngpwdLastSet)
WScript.Echo szUser & “,” & dtpwsLastSet -ResultPageSize:"100"
objRecordset.MoveNext
Loop -ResultSetSize:"20201"
objConnection.Close
Set objCommand = Nothing -SearchBase:"CN=Users,DC=tf,DC=com"
Function CDateToInt8(szDateTime)
dtDateValue = CDate(szDateTime)
Set objShell = CreateObject(“Wscript.Shell”)
-SearchScope:"Subtree" -Server:"TFDC02.tf.com"
lngBias = TimeZoneBIOS()
dtAdjusted = DateAdd(“n”, lngBias, dtDateValue)
lngSeconds = DateDiff(“s”, #1/1/1601#, dtAdjusted)
CDateToInt8 = CStr(lngSeconds) & "0000000"
End Function
Function TimeZoneBIOS
Set objShell = CreateObject(“Wscript.Shell”)
szKey = “HKLMSystemCurrentControlSetControl” & _
1行
“TimeZoneInformationActiveTimeBias”
lngBiasKey = objShell.RegRead(szKey)
If UCase(TypeName(lngBiasKey)) = “LONG” Then
lngTZBias = lngBiasKey
ElseIf UCase(TypeName(lngBiasKey)) = “VARIANT()” Then
lngTZBias = 0
For k = 0 To UBound(lngBiasKey)
lngTZBias = lngTZBias + (lngBiasKey(k) * 256^k)
Next
End If
TimeZoneBIOS = lngTZBias
End Function
Function CInt8ToDate(lngDateTime)
On Error Resume Next
lngAdjust = TimeZoneBIOS
lngHigh = lngDateTime.HighPart
lngLow = lngDateTime.LowPart
If lngLow < 0 Then lngHigh = lngHigh + 1
If (lngHigh = 0) And (lngLow = 0) Then lngAdjust = 0
lngDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) + lngLow) / 600000000 - lngAdjust) / 1440
CInt8ToDate = CDate(lngDate)
If Err.Number <> 0 Then
On Error GoTo 0
CInt8ToDate = #1/1/1601#
End If
End Function
15
17. 事前準備
• コマンドシェルの環境設定
• 簡易編集を有効に
• フォントを見やすく
cmd.exe と powershell.exeは独立している
• 横幅の設定
• バッファの設定
• エクスプローラーの環境設定
• 「拡張子を表示しない」を無効に 要は自分で作ったスクリプトのこと
• オンプレミスの”署名無しスクリプト”を実行できるようにする
• Set-ExecutionPolicy RemoteSigned
• 必要に応じて自分専用の初期設定ファイルを作成
• notepad $profile
必要なモジュールを読み込む..など
17
19. スクリプトの作成環境
エディタ デバッガ
フリー/シェアウェア/ なし??
バッチファイル 商用のエディタ
メモ帳&目視
フリー/シェアウェア/ エディタ組み込み
VBScript 商用のエディタ
VbsEdit
メモ帳 エディタ組み込み
PowerShell PowerShell ISE
2.0からは標準装備
19
20. スクリプトの作り方と実行方法
1. エディタを開く
※スクリプトはテキストファイル
2. スクリプトを書いて「名前をつけて保存」
拡張子は .ps1
3. PowerShell コンソールを開いてファイル名を入力
PS C:> .sample.ps1
または PowerShell ISE で開いて“実行”
または エクスプローラからダブルクリック
20
21. 覚えておくと便利な機能
メモ帳 編
指定した行番号に飛ぶ Ctrl + G
ステータスバーを表示すると行と列が参照できる
※いずれも「右端で折り返し」を無効にしておくこと
PowerShell コンソール、ISE 編
タブでコマンドレットやパラメタの続きを補完
(例)get-mem[Tab]
↓
Get-Member
※PowerShell 3.0 では Intellisence が実装されている
21
22. “使用法” を理解するために
“使用法”を得る方法をおさえておこう
• 呼び出し可能なコマンドレット一覧取得
• Get-Command
※インストールされているモジュールによってコマンドレットは増減する
• コマンドレットの詳細な書式と利用例を表示
• Get-Help <コマンドレット> -detailed
• 使用可能なオブジェクトストア(ドライブ)の取得
• Get-PSDrive
※インストールされているモジュールによってドライブは増減する
22
23. (つづき)
• インストールされているモジュールを表示する
• Get-Module
※”ActiveDirectory” や “GroupPolicy”、”Hyper-V” など、必要なモジュールが
読み込まれていないとコマンドレットを使用することはできない
• コマンドレットのメソッドとプロパティ等を表示
• <コマンドレット> | get-member
• <コマンドレット> | get-member | sort-object Name | format-list
※ COMのメンバーも取得できる
New-Object -com scripting.filesystemobject | Get-Member
23
24. オブジェクト
PowerShell の戻り値は「オブジェクト」である
“オブジェクトとはプロパティとメソッド(操作)の集まり"
もしも”オブジェクト”が自転車だったら...
プロパティ メソッド
操作
プロパティ
メソッド
色 ペダルをこぐ
サイズ ハンドルを右に切る
型 ハンドルを左に切る
ブランド フロント ブレーキをかける
パーツ リア ブレーキをかける
24
26. オブジェクトであるということは...
PS C:>$a = “abc”
#普通ならば $a は”文字列” になるけれど...
#オブジェクトだからメソッドとプロパティが用意されている
PS C:>$a.ToUpper()
PS C:>ABC
PS C:>$a.ToUpper().Split("B")[0]
PS C:>A
26
28. (参考)3.0 では書式を簡略化できます
PS C:>get-service | where-object {$_.Status -eq "Running"}
V3 ではこう書ける
PS C:>get-service | where-object Status -eq "Running"
28
33. 行継続
アクサン グラーブ記号 (`) を使用する
こ
copy-item C:tmp*.txt ` い
-destination C: つ
33
34. 引数を受け取る 5つの引数
C:> .hogehoge.ps1 My name is “Junichi Anno” .
Write-Output $args[3] Junichi Anno
foreach ( $a in $args )
My
{ name
Write-Output $a is
Junichi Anno
} .
34
36. 変数
$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
36
37. 入出力方法
これを抑えておけば、ひとまずたいていのことはできます
#標準出力
Write-Output “Hello”
#標準入力
$InputData = Read-Host
#ファイルに出力
$Record = “hogehoge”
Out-File -filepath C:tmplist.txt -inputobject $Record
#ファイルから入力
$file = Get-Content -Path c:tmplist.txt
37
38. 出力結果のフォーマット変換して表示したい
dir | format-table Name,Length
dir | format-list Name,Length
dir | format-wide Name -column 6
dir | out-gridview
38
39. 特定のプロパティだけをオブジェクトとして取得したい
dir | Select-Object Name,Length
戻り値の「見た目」は Format-Table と同じだが、オブジェクトタイプが異
なることに注意!
以下の出力結果を比較しましょう
PS C:> dir |ft Name,Lenght |Get-Member
PS C:> dir |Select-Object Name, Length |Get-Member
39
41. 繰り返し処理
Active Directory ユーザー一覧から name プロパティをリストする
#ForEach-Object
Get-ADUser -Filter * | ForEach-Object {$_.name}
Get-ADUser -Filter * | ForEach-Object name V3
#foreach
$Users = Get-ADUser -Filter *
foreach ($user in $Users) { $user.name }
41
42. 環境変数を取得
#一覧を取得
cd env:
dir
#特定の環境変数を表示する
$env:computername
$env:username
$env :userdomain
$env:SessionName
42
43. 日時を取得
date オブジェクト
プロパ メソッ
Date ティ Add ド IsDaylightSavingTime
Day AddDays Subtract
DayOfWeek AddHours ToBinary
AddMilliseconds ToFileTime
DayOfYear
AddMinutes ToFileTimeUtc
Hour AddMonths ToLocalTime
Kind AddSeconds ToLongDateString
Millisecond AddTicks ToLongTimeString
Minute AddYears ToOADate
Month CompareTo ToShortDateString
Second Equals ToShortTimeString
GetDateTimeFormats ToString
Ticks
GetHashCode ToUniversalTime
TimeOfDay GetType
Year GetTypeCode
DateTime
43
44. リモーティング
• 3種類のリモーティング
• -ComputerName パラメタ
• 複数のコンピュータを指定可能
• 対話モード(Enter-PSSession コマンドレット)
• SSH のような使い方
• Invokeモード(Invoke-Command コマンドレット)
• -ComputerNameに対応していないコマンドで使用
• 複数のコンピュータに対して一括実行
• コマンド単体(-scriptblock)、
PS1スクリプト(-filepath)の指定が可能
• 送受信双方でリモーティングの準備が必要
44
45. PowerShell セッション(PSSessions)
• コマンドの実行空間単位
• セッション内ではデータの共有が可能
• 通常はテンポラリセッションが作成され、コマンド終了後に削除される
Enter-PSSessionを使用
PS> Enter-PSSession -ComputerName Server1
[Server1]: PS > $A = 1
[Server1]: PS > $B = 2
[Server1]: PS > $C = $A + $B
PS>Exit-PSSession
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}
1つのセッション
45
46. PSSession の永続化
• セッションの作成 :New-PSSession
• セッションの削除 :Remove-PSSession
• セッション一覧 :Get-PSSession
• セッションへの再接続 :Enter-PSSession
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 > Remove-Session $S
PS > $S = New-PSSession -ComputerName CL01
PS > Enter-PSSession $S
[CL01] PS > Get-VM | Where-Object name -EQ "TFWIN7-0"
PS > Exit-PSSession
46
47. モジュールとコマンドのインポート
• リモートコンピューター上のコマンドレットを一時的に取り込むことができる
• “Invoke-Command -Session” を使用する必要が無くなる
• コマンドの実行中はセッションを生かしておく必要がある
PSSession
Windows 7 Windows Server 2008 R2
PS C:> Get-VM |ft name
PowerShell
w/ Hyper-V
Name
---- PSSession を通じてモジュールをインポート Hyper-V module
TFWin7-0 • Get-VM
PS C:> $s = New-PSSession -ComputerName Server1 • Start-VM
TFWin7-1 FX
TFWin8-0 FX PS C:> Import-PSSession -Session $s -Module HYPER-V • Stop-VM
• ・
TFWin8-1 実 • ・
Win7_template
Win8_template 行
空
間
47
48. Windows Server “8” に対応した新しい管理フレームワーク
Windows Management Framework 3.0
Beta
http://www.microsoft.com/download/en/details.aspx?id=28998
48
49. Windows Management Framework 3.0
http://blogs.technet.com/b/junichia/archive/2012/03/21/3487696.aspx
• PowerShell 3.0(コマンドレット数 2300!)
– ワークフロー
– セッションへの再接続
– PSScheduledJob モジュールによるジョブスケジューリングへの対応
– Show-Command による GUI を使用したコマンド入力
– パブリックネットワークでの Enable-PSRemoting
( -SkipNetworkProfileCheck オプション)
– WEB/Json系コマンドレット
– 新しい PowerShell ISE
• Windows PowerShell Web Service
• Server Manager CIM プロバイダー
• WinRM、WMI のアップデート
49
50. PSSession の扱いの違い
PowerShell 2.0 の場合
セッション情報はローカルに保
PSSession
存されるため、別のクライアン
トから再接続できない
セッション情報
PowerShell 3.0 beta の場合
セッション情報はリモートコン
ピューターに保存されるため、
PSSession
別のクライアントから再接続で
きる
セッション情報
50
51. Session への再接続
セッション情報がリモートコンピュータ内に保存されるようになった
Server1
Name = Session1
$A = 1 再接続
セッション
作成
社内 自宅
New-PSSession -ComputerName ServerA Connect-PSSession -ComputerName ServerA
-Name Session1
Connect-PSSession -Name Session1
Enter-PSSession -Name Session1
Enter-PSSession -Name Session1
PS C:>$A
$A = 1
1
Exit-PSSession
Disconnect-PSSessions -Name Session1
51
52. まとめ
Windows PowerShell を始めたら、
PowerShell だけを使い続けましょう!
コマンドプロンプトに戻ってはいけません!
PowerShell に「一短」はありません!
52