Windows PowerShell

Owner
Windows PowerShell の概要
V1, V2 共通のトピック
Windows PowerShell V2 の新機能
Windows Server 2008 R2 に搭載される
新バージョン
Windows PowerShell
= コマンドラインシェル
+ スクリプティング言語
+ .NET Framework
GUI でできることは CUI でも
生産性と管理性の向上
システム情報の収集
システムの監視
システム管理の自動化
新しい対話型シェルとスクリプティング言語
.NET Framework 上で動作
数多くの組み込みコマンドレット
.NET を活用した新しいスクリプティング言語
「オブジェクト・パイプライン」
現在使っているツールも利用可能
現在使っている自動化技術 (COM) も利用可能
次世代のシステム管理アーキテクチャの基礎
今後サーバー製品で利用
Windows Server 2008 から標準搭載
気軽に始められる
まずは、Get-Help, Get-Command, Get-Member
一貫したコマンドレット体系
標準的な名前付けパターン
[動詞]-[名詞]
(例: get-help, get-command, get-member)
オプション指定
Cmdlet –param v1 –param2 v1,v2 –flag
共通のパラメータ
-Debug, -ErrorAction, -ErrorVariable,
-OutBuffer, -OutVariable, -Verbose
-Whatif (シミュレーション), -Confirm (都度確認)
コマンドライン
動詞
名詞
PS> get-service
引数名
引数の値
–name
“*net*”
コマンド
引数
プロパティの名前
結果
Status
-----Stopped
Running
Name
---NetLogon
Netman
DisplayName
----------NetLogon
Network Connections
プロパティの値
コマンドレットのオンラインヘルプを参照
PS C:\> Get-Help Get-Service
名前
Get-Service
概要
Gets the services on a local or remote computer.
構文
Get-Service [[-Name] <string[]>] [-ComputerName <string[]>]
[-DependentServices] [-Exclude <string[]>]
[-Include <string[]>] [-RequiredServices]
[<CommonParameters>]
コマンドレットのリストを取得
PS C:\> Get-Command *-Service
CommandType
----------Cmdlet
Cmdlet
Cmdlet
Cmdlet
Cmdlet
Cmdlet
Cmdlet
Cmdlet
Name
---Get-Service
New-Service
Restart-Service
Resume-Service
Set-Service
Start-Service
Stop-Service
Suspend-Service
Definition
---------Get-Service [[-Name] <String...
New-Service [-Name] <String>...
Restart-Service [-Name] <Str...
Resume-Service [-Name] <Stri...
Set-Service [-Name] <String>...
Start-Service [-Name] <Strin...
Stop-Service [-Name] <String...
Suspend-Service [-Name] <Str...
オブジェクトのメンバー (構成) 一覧
PS C:\> Get-Service | Get-Member
TypeName: System.ServiceProcess.ServiceController
Name
---Name
RequiredServices
Disposed
Close
Continue
CreateObjRef
Dispose
Equals
...
MemberType
---------AliasProperty
AliasProperty
Event
Method
Method
Method
Method
Method
Definition
---------Name = ServiceName
RequiredServices = ServicesDependedOn
System.EventHandler Disposed(System....
System.Void Close()
System.Void Continue()
System.Runtime.Remoting.ObjRef Creat...
System.Void Dispose()
bool Equals(System.Object obj)
.NET Framework との強力な連携
CLR 上で動作
戻り値は常に「オブジェクト」
.NET Framework のクラスを呼び出せる
使えば使うほどに効いてくる特長
データへのアクセスを共通化
ドライブに割り当て
ドライブレターだけでなく、文字列を使用可
実運用レベルのスクリプティング
パラメータの型、名前の指定、初期化
スクリプトへのデジタル署名
サードパーティ、コミュニティによるサポート
スクリプトやツールが充実
文字に見えても、実体は「型」を持った「オブジェクト」
整数、浮動小数点
日付、時間
ファイル情報、プロセス情報…
文字ではないので、文字列操作が不要
オブジェクトのプロパティとメソッド
パイプにはオブジェクトが流れる
パイプ、プロセス、変数が簡単に扱える
例:テキストファイルを読み込んで、変数にセット
変数の内容をファイルに保存
表示カラム (プロパティ) を指定
PS C:\> Get-Service | Format-Table Status, Name, CanStop
Status
-----Stopped
Stopped
Stopped
Running
Running
...
Name
---AeLookupSvc
ALG
AppIDSvc
Appinfo
AppMgmt
CanStop
------False
False
False
True
True
指定したプロパティの値で並べ替え
PS C:\> Get-Service | Sort-Object Status
Status
-----Stopped
Stopped
Stopped
Stopped
Stopped
...
Name
---RSoPProv
sacsvr
RemoteAccess
RpcLocator
SCardSvr
DisplayName
----------Resultant Set of Policy Provider
Special Administration Console Helper
Routing and Remote Access
Remote Procedure Call (RPC) Locator
Smart Card
出力をファイルや別のコマンドレットに送る
PS C:\> Get-Service | Out-File –FilePath E:\Services.txt
PS C:\> Get-Service | Out-GridView
※ Out-GridView は V2 の新機能
すでに利用しているツールも続けて使いたい
PowerShell 内で利用可能
コマンド (com, exe)
COM オブジェクト
ツールが出力するデータを活用
PowerShell でデータを再利用できるように加工
PowerShell で安全なテキスト解析
PowerShell でラップすることで拡張可能
.NET Framework のクラスを直接呼び出せる
プログラミングの経験を活用
まずシェルで対話的に実験
ユーティリティで結果を結合
パイプ、Format-* コマンドレット
動作確認した一連のコマンドレットをスクリプトに
Start-Transcript による記録も便利
変数、パラメータなどを導入して汎用化
関数に書き換え
実運用レベルのスクリプトに改良
エラー・ログの処理
コード署名
社内やコミュニティで共有
セキュリティのレベルに応じて、スクリプトの実行ポリシーを設定
Set-ExecutionPolicy, Get-ExecutionPolicy
設定の変更には管理者権限が必要
グループポリシーで設定可能
4段階の実行ポリシー
Restricted: 制限つき (オペレーターモード)
インストール時の既定
対話形式のみ
スクリプトは実行できない
AllSigned: 署名
スクリプトは、信頼された発行元による署名が必要
RemoteSigned: リモートの署名
"インターネットゾーン" のスクリプトは信頼された発行元による署名が必要
Unrestricted: 無制限
すべてのスクリプトを実行可能
リモートのスクリプトについては常に警告
WMI: Windows Management Infrastructure
Windows の多くのシステム情報にアクセス可能
設定の変更も可能
Get-WmiObject で WMI にアクセス可能
WS-Management (WS-Man)
システム管理のための Web Service
HTTP, HTTPS 経由でリモートアクセス
リモートの WMI にアクセス
Windows PowerShell V2 のリモーティングも WS-Man で通信
リモート
PowerShel
l
WMI API
ローカル
WS-Man
WSMan
HTTP(s)
WMI / プロバイダ
管理ツールが Windows PowerShell ベースに
Exchange Server 2007
System Center
Operations Manager 2007
Virtual Machine Manager 2007
Data Protection Manager 2007
SQL Server 2008
Windows Server 2008 R2, Windows 7
他続々対応
GUI は内部で PowerShell コマンドレットを呼んでいる
→ GUI からも CUI からも同じ作業が可能に
GUI と CUI の連続性
1度きりの作業、1回目の作業は GUI (ウィザード)
繰り返し作業、自動化は CUI (スクリプト)
GUI
CU
I
セットアップ
WinForm
WinForm
ADO.NET
管理インターフェイス
PowerShell データプロバイダ
PowerShell エンジン
Exchange コマンドレット
設定情報へのアクセス
MAPI
Store
レジストリ
Active
Directory
CUI、GUI のいずれからも、同じ作業が可能
Meta
base
一度目はウィザードで、以降の繰り返しはスクリプトで。
実行される
コマンド
PowerShell 1.0
2006年11月公開
XP, Windows Server 2003, Vista: ダウンロード
Windows Server 2008: 機能の追加
PowerShell 2.0
Windows 7, Windows Server 2008 R2 標準装備
既定で有効。無効化、削除はできない
Server Core では既定で無効
その他の OS 向けに、CTP3 公開 (2008年12月)
XP, Windows Server 2003, Vista, Windows Server 2008
リモートマシンの PowerShell にアクセス可能に
1 対 1: 対話利用
ローカルと同様に、リモートマシンでコマンド実行
1 対多 (fan-out): 大規模な自動化
複数のマシンに、同じコマンドを同時に投入
非同期の利用 (結果はばらばらに戻ってくる)
多対 1 (fan-in): コマンドを受け入れるサーバーになる
対話的な利用
ホスティングモデル
関連コマンドレット
Invoke-Command
New-PSSession
Enter-PSSession
Import-PSSession
PSJOB – Start, Get, Wait, Receive, Stop, Remove
ローカル実行
リモート実行
結果はローカルに
結果もリモートに
対話実行
セッションの指定が可能
異なるセッションは異なる環境
ジョブは子ジョブを含むことができる
スクリプトの実行環境に制限を付けることにより、
より安全な環境を利用可能
例: PowerShell をアプリケーションから呼び出す場合、
限られた操作のみを許可
実行ポリシーよりも、さらに詳細な制限が設定可能
制限対象
コマンドレットと変数の “visibility” (不可視にできる)
実行可能なスクリプト、アプリケーションの
ホワイトリスト
モジュールは普通のスクリプトと同様。違いは
拡張子が .psm1
Import-Module で読み込み
Export-ModuleMember が利用可能
スクリプトに含めることができるもの
実行文
変数の割り当て
関数
スナップインのロード
その他 PowerShell のコード
複数の .psm1 ファイルをモジュールフォルダーに入れて
おくことができる。
モジュール内で別のモジュールを読み込むことも可能
PowerShell ベースの GUI を、より簡単に作成可能に
スクリプティング環境 (IDE) の提供
PowerShell ISE (Interated Scripting Environment)
サーバーの運用管理に本格的に活用
Active Directory
グループポリシー
Server Manager
IIS
リモートデスクトップサービス
フェールオーバークラスタリング
Best Practices
その他…
Active Directory
Get-, New-, Remove-, Set-ADUser
Disable-, Enable-, Search-, Unlock-ADAccount
Set-ADAccountExpiration, Set-ADAccountPassword
Get-, New-, Remove-, Set-ADGroup
Add-, Get-, Remove-ADGroupMember
グループポリシー
Backup-, Get-, New-, Import-, …, Rename-GPO
Get-GPOReport
Server Manager
Get-, Add-, Remove-, WindowsFeature
Add-WindowsFeature
Remove-WindowsFeature
IIS
IIS: ドライブ
New-, Remove-, Restart-, Start-, Stop-WebAppPool
Add-, Backup-, Get-, …, Set-WebConfiguration
31
既定で有効
クライアントの管理、バッチ処理
クライアントから、サーバーをリモート管理
Windows トラブルシューティング
プラットフォーム
トラブルシュートのための共通基盤
コントロールパネル > アクションセンター
> トラブルシューティング
企業内でも、独自のトラブルシューティング
ツールを PowerShell で作成可能
c:\windows\diagnostics
Windows PowerShell は
ついに運用管理のメインストリームへ
開発者、スクリプト開発者にも
応える豊富な機能
Windows Server 2008 R2 の
Windows PowerShell をご活用ください!
33
© 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.
The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market
conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation.
MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.
Windows PowerShell でのスクリプティング
http://www.microsoft.com/japan/
technet/scriptcenter/hubs/msh.mspx
TechNet バーチャルラボ 「Windows PowerShell 入門」
http://www.microsoft.com/japan/
technet/traincert/virtuallab/default.mspx
TechNet Forum: Windows PowerShell フォーラム
http://social.technet.microsoft.com/
Forums/ja-JP/powershellja/threads
製品ページ
http://www.microsoft.com/japan/windowsserver2008/
technologies/powershell.mspx
http://social.technet.microsoft.com/Forums/jaJP/powershellja/threads
OS
Windows Server 2008
標準装備、「機能の追加」から
Windows XP SP2 以降
Windows Server 2003 SP1 以降
Windows Vista
アーキテクチャ
32 bit 版、64 bit 版
必要なソフトウェア
.NET Framework 2.0
Windows Vista, Windows Server 2008 には同梱
入手方法
「 Windows PowerShell でのスクリプティング」から
(参考資料参照)
OS
Windows Server 2008 R2, Windows 7
標準装備
Windows Server 2008 , Windows Server 2003 SP2
Windows Vista SP1, Windows XP SP3
ダウンロードセンターにて CTP3 提供中
サポート OS は CTP3 時点の情報
アーキテクチャ
32 bit 版、64 bit 版
必要なソフトウェア
.NET Framework 2.0
.NET Framework 3.5 SP1 (ISE, Out-GridView 利用時)
WinRM 2.0 CTP3 (リモーティング利用時)
Windows PowerShell CTP3 ダウンロードページにリンクあり
図形をドロップ
•
•
•
•
詳細の設定
スクリプト生成
PowerShell が身近なツールに (PowerShell V1 用)
ビジュアルにスクリプトを作成
そのまま仕様書に
無償ダウンロード
http://www.microsoft.com/japan/windowsserver2008/powershell-tool.mspx
CodePlex で Windows PowerShell 関連の開発プロジェクトが
進行中
CodePlex: http://www.codeplex.com
タグ名 “PowerShell” で検索
PowerShell Community Extensions
http://www.codeplex.com/PowerShellCX
ファイルの圧縮、クリップボードへのアクセス、アセンブリの取扱いなどの
コマンドレット
アセンブリキャッシュ、LDAP、IE7のRSSフィードにアクセスするプロバイ
ダ
その他ユーティリティ関数、フィルター
PowerShell Remoting
http://www.codeplex.com/powershellremoting
クライアント・サーバー型のリモートシェル
Windows Installer PowerShell Extensions
http://www.codeplex.com/psmsi
MSI ファイルを取り扱う
PowerGadgets
http://www.powergadgets.com
チャート、ゲージ、地図
サイドバー ガジェット
/n software inc
http://www.nsoftware.com/powershell/
NetCmdlets
ネットワーク関連のコマンドレット
SNMP, SSH, LDAP, FTP, Syslog, Jabber, DNS,
MIME, UUEncode, Zip …
PowerShell Server
Quest Software, FullArmor …
オブジェクトの活用により、テキスト処理が必要な
場面はかなり減少した
.NET String クラス
Join, Split, SubString, Trim, Length, …
多くの .NET の型と変換を利用可能
[datetime], [URI], ENUMS, …
豊富な string オペレーター
+, *, -f, -replace, -match, -like, -eq, -ne,
-gt, -ge, -lt, -le
暗黙、明示的なキャスト、強制
正規表現を使ったマッチング
Select-String
リスト形式、表形式、ワイド、カスタムビューの
フォーマッタが用意されている
Get-Command Format-*
フォーマッタのオプションで、プロパティ、
プロパティセット、プロパティの表現を指定可能
get-process |format-table name,id,handlecount
get-process |format-table Configuration -auto
get-process |format-table name,@{ Label="File";
Expression= {$_.mainmodule.filename} }
get-process |format-list name,*size64
XML ファイルでフォーマット拡張を定義
Update-FormatData My.Format.ps1xml
さまざまなデータストアに、共通のアクセス方法を提供
データストアは「ドライブ」として見える
Filesystem, Registry, Alias, Certs, Env, Functions, Variables, …
get-childitem HKLM:\SOFTWARE\Microsoft
「ドライブ」はさまざまな情報を含む名前空間
Item, ChildItem, Content, Property, ACL, …
共通のコマンドレットでアクセス可能
また alias が既定で設定されている
Get-ChildItem
dir
ls
Get-Cwd
Get-Content
cd
type
pwd
cat
New-item –type directory
mkdir
mkdir
Set-Location
cd
cd
ドライブ名、プロバイダを指定して新しいドライブをマウント
new-drive -Name sys32 -Provider FileSystem
-root c:\windows\system32 -Description "PSH SOURCES"
set-location sys32:\drivers
ワイルドカード
get-childitem *\*\*.doc
get-childitem [a-f]*[tc]
さまざまなプロバイダで共通のアクセス方法
get-childitem \logs –Include *.txt –Exclude A* -Recurse -Force
特定のプロバイダで有効な拡張
get-childitem Cert: -Recurse –CodeSigning
すべてのプロバイダでタブ補完
get-childitem HKLM:\So<TAB>\Mi<TAB> => HLKM:\Software\Microsoft
すべての .NET の型が利用可能 (アセンブリの読み込みが
必要な場合あり)
.NET オブジェクトの生成
$d = new-object System.DateTime 2007,4,20
[DateTime] "2007/4/20"
プロパティ、メソッドの確認
[DateTime] "2007/4/20" | get-member
[datetime].Getmembers() | where-object {$_.isStatic}
| format-table name
プロパティ、メソッドへのアクセス
プロパティ、メソッド
$d.DayOfWeek
$d.AddMonths(6)
スタティックメソッド
[DateTime]::Now
[Math]::Sqrt(16)
Foreach-Object (繰り返し)
get-process |
foreach-object {$i = 0} {$i += $_.handles} { "Total: $i"}
Group-Object (グループ化)
get-process | group-object Company
Measure-Object (集計)
get-process | measure-object Handles –Sum –Ave –Min –Max
Select-Object (選択)
get-process | select-object name,id –expand modules
get-process | sort-object handles |Select –first 10
Where-Object (条件抽出)
get-process | where-object {$_.handles –ge 500}
Get-WmiObject
WMI 名前空間とのインターフェイス
Get-WmiObject –list [-Namespace xx]
Get-WmiObject –Class win32_bios
リモート接続可能
VBScript と同様に管理オブジェクトにアクセス
New-Object で COM オブジェクトを作成
$fso= New-Object -Com Scripting.FileSystemObject
プロパティ、メソッドの確認
$fso | get-member
プロパティ、メソッドへのアクセス
$fso.GetDrive("C:")
$fso.VolumeName = "System Drive"
パイプでつないで利用
$word = new-object –ComObject Word.Application
$word.RecentFiles | sort-object name |
format-table name, index,path -auto
XML はネイティブのデータ型
$x=[xml]"<a><b><c>TEST</c></b></a>"
データへのアクセス方法が用意されている
$x.a.b.c
XML のプロパティへのアクセスは PSBase 経由
で
$x.a.PSBase.innerXml
XML メソッドへのアクセス
$x.a.SelectNodes("//c")
WMI
WMI のクラスリストから、文字列 Processor を含むクラスを抽
出]
gwmi -l | select-string "Processor“
CPU の使用率を表示
gwmi Win32_PerfFormattedData_PerfOS_Processor
CPU の使用率から、コアの番号、使用率(%)のみ表示
gwmi Win32_PerfFormattedData_PerfOS_Processor | format-table
name,PercentProcessorTime –auto
上記の出力を HTML に変換
gwmi Win32_PerfFormattedData_PerfOS_Processor | select
name,PercentProcessorTime | ConvertTo-Html
IE を COM オブジェクト経由で操作
$ie = new-object -com internetexplorer.application
$ie.visible = $true
$ie.navigate("about:blank")
$ie.document.body.innertext = "a"
CPU の使用率を IE に表示させ、1秒ごとに更新
while($true){$ie.document.body.innerhtml =
(gwmi Win32_PerfFormattedData_PerfOS_Processor
| select name,PercentProcessorTime | ConvertToHtml ); sleep 1}
イベントログ
システムログから最新10件を取得
Get-EventLog system -Newest 10
システムログの最新1000件をソースごとに集計し
出現回数でソート
Get-EventLog system -Newest 1000 |
Group-Object Source | Sort-Object Count
PowerGadgets (http://powergadgets.com) でグラフ化
Get-EventLog system -Newest 1000 |
Group-Object Source | Sort-Object Count | Out-Chart
Excel
COM オブジェクト経由で操作
$excel = new-object -com excel.application
$excel.findfile()
$excel.worksheets.item(1).cells.item(1,1)
ExcelPackage で操作
(http://www.codeplex.com/ExcelPackage)
[Reflection.Assembly]::LoadFrom(
"$pwd\excelpackage.dll") | out-null
$ep = New-Object
OfficeOpenXml.ExcelPackage (dir vbs2ps.xlsx)
foreach ($i in 1..5)
{$ep.workbook.worksheets[1].Cell($i,1).value}
ファイルシステム監視
PS Eventing
(http://www.codeplex.com/PSEventing)
. .\eventhandlers.ps1 (ユーティリティの読み込み)
.\filesystemwatcher.ps1
または
$fsw = new-object system.io.filesystemwatcher
$fsw.Path = "c:\temp“
$fsw.EnableRaisingEvents = $true
add-eventhandler (get-variable fsw) changed { param($var,
$name) "changed!" }
do-events # this will block until ctrl+C is hit
$lines = netstat.exe -ano -p TCP
$ps = get-process
foreach ( $line in $lines )
{
$obj = new-object System.Management.Automation.PSObject
$obj.psobject.typenames[0] = "Netstat"
switch -regex ($line) {
("^ TCP") {
$values = $line.trim().split(" ", [StringSplitOptions]::RemoveEmptyEntries)
$obj | add-member noteproperty "proto" $values[0]
$laddr, $lport = $values[1].split(':')
$obj | add-member noteproperty "laddr" $laddr
$obj | add-member noteproperty "lport" ([int]$lport)
$faddr, $fport = $values[2].split(':')
$obj | add-member noteproperty "faddr" $faddr
$obj | add-member noteproperty "fport" ([int]$fport)
$obj | add-member noteproperty "state" $values[3]
$obj | add-member noteproperty "pid" ([int]$values[4])
$pname = ($ps | where {$_.id -eq $values[4]}).name
$obj | add-member noteproperty "pname" $pname
$obj
}
("^ UDP") {
# TCPを参考に実装してみてください
}
}
}