1
スクリプトを使用したWindows Server 管理の自動化
マクロソフト株式会社
エバンジェリスト
安納 順一 & 奥主 洋 &田辺 茂也
2
応用編 (3)
Windows PowerShell による管理と最新情報
マクロソフト株式会社デベロッパー&プラットフォーム統括本部
田辺 茂也http://blogs.technet.com/stanabe
33
セッションの内容
• Windows PowerShell の特徴
• Windows PowerShell 詳細– 対話的な使い方
– より汎用的に作っていくには
– スクリプテゖング
– リモート管理
• システム管理の新しいスタル
• コミュニテゖ、パートナー
• Windows PowerShell V2 の新機能
44
Windows PowerShell
• 生産性と管理性の向上
• システム管理の自動化を推進
• 簡単かつこれまでの資産を活用
コマンドランシェル + スクリプテゖング言語 + .NET Framework
55
Windows PowerShell の概要
• 新しい対話型シェルとスクリプテゖング言語– .NET Framework 上で動作– 100以上の組み込みコマンドレット– .NET を活用した新しいスクリプテゖング言語
• 「オブジェクト・パプラン」
– 現在使っているツールも利用可能– 現在使っている自動化技術 (COM) も利用可能
• 次世代のシステム管理ゕーキテクチャの基礎– 今後サーバー製品で利用
• Windows Server 2008 から標準の機能
66
必要システム・入手方法
• 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 でのスクリプテゖング」から
(参考資料参照)
77
Windows PowerShell の特徴 (1)
• 気軽に始められる– まずは、Get-Help, Get-Command, Get-Member– Linux/Unix の経験があれば、より身近な操作性
• 一貫したコマンドレット体系– 標準的な名前付けパターン
• [動詞]-[名詞] (例: get-help, get-command, get-member)
– オプション指定• Cmdlet –param v1 –param2 v1,v2 –flag
– 共通のパラメータ• -Debug, -ErrorAction, -ErrorVariable,
-OutBuffer, -OutVariable, -Verbose• -Whatif, -Confirm (副作用がある場合)
88
Windows PowerShell の特徴 (2)
• .NET Framework との強力な連携– CLR 上で動作
– 戻り値は常に「オブジェクト」
– .NET Framework のクラスを呼び出せる
– 使えば使うほどに効いてくる特長
• データへのゕクセスを共通化– ドラブに割り当て
– ドラブレターだけでなく、文字列を使用可
• 実運用レベルのスクリプテゖング– パラメータの型、名前の指定、初期化
– スクリプトへのデジタル署名
• サードパーテゖ、コミュニテゖによるサポート– スクリプトやツールが充実
99
オブジェクトとパプ
• 文字に見えて、単なる文字ではありません。– 整数、浮動小数点– 日付、時間– フゔル情報、プロセス情報…
• 文字ではないので、文字列操作が不要です。– オブジェクトのプロパテゖとメソッド– パプにはオブジェクトが流れています
• 今までのシェルスクリプトで必要だったトリックやマジックなしでも大丈夫です。
• パプ、プロセス、変数が簡単に扱えます。– 例:テキストフゔルを読み込んで、変数にセット– 変数の内容をフゔルに保存
1010
今までのツールも活用できます
• すでに利用しているツールも続けて使いたい
– PowerShell 内で利用可能
• コマンド (com, exe)
• COM オブジェクト
• ツールが出力するデータを活用
– PowerShell でデータを再利用できるように加工
• PowerShell で安全なテキスト解析
• PowerShell でラップすることで拡張可能
• .NET Framework のクラスを直接呼び出せる
– プログラミングの経験を活用
1111
管理スクリプト作成のステップ• まずシェルで対話的に実験
• ユーテゖリテゖで結果を結合
– パプ、Format-* コマンドレット
– ワンラナー
• 動作確認した一連のコマンドレットをスクリプトに
– Start-Transcript による記録も便利
• 変数、パラメータなどを導入して汎用化
– 関数に書き換え
– $args, param()
– オブジェクトを出力とする、小さなスクリプト
• 実運用レベルのスクリプトに改良
– エラー処理
– ログの作成
– コード署名
• 社内やコミュニテゖで共有
1212
セキュリテゖ
• セキュリテゖのレベルに応じて、スクリプトの実行ポリシーを設定– Set-ExecutionPolicy, Get-ExecutionPolicy– 設定の変更には管理者権限が必要– グループポリシーで設定可能
• 4段階の実行ポリシー– Restricted: 制限つき (オペレーターモード)
• ンストール時の既定• 対話形式のみ• スクリプトは実行できない
– AllSigned: 署名• スクリプトは、信頼された発行元による署名が必要
– RemoteSigned: リモートの署名• "ンターネットゾーン" のスクリプトは信頼された発行元による署名が必要
– Unrestricted: 無制限• すべてのスクリプトを実行可能• リモートのスクリプトについては常に警告
1313
リモートマシンでの実行
• Windows PowerShell 自身はリモートシェルの機能を持っていない (現バージョン)
• コマンドレットによっては、リモートマシンにゕクセスする機能を持っている– get-wmiobject
– Exchange Server 2007 のコマンドレットなど
• Windows Remote Shell の活用– Windows Server 2008, Windows Vista では winrs.exe
が利用可能
1414
Windows の管理ンターフェス
• WMI: Windows Management Infrastructure
– Windows の多くのシステム情報にゕクセス可能
– 設定の変更も可能
• WS-Management
– システム管理のための Web Service
– HTTP, HTTPS 経由でリモートゕクセス
– リモートの WMI にゕクセス
PowerShell
WS-Man
WS-Man
WMI / プロバ
ダHTTP(s)
ローカル
リモート
WMI API
1515
サーバー管理の新しいスタル
• Windows PowerShell の広がり
– サーバー製品に PowerShell のスナップン
• Exchange Server 2007
• System Center
– Operations Manager 2007
– Virtual Machine Manager 2007
– Data Protection Manager 2007
• Windows Server 2008
– Windows Server バックゕップ (June CTP)
– IIS (http://www.iis.net)
– 複数のスナップンを読み込んでシームレスな管理
• GUI と CUI の連続性
– 1度きりの作業、1回目の作業は GUI (ウゖザード)
– 繰り返し作業、自動化は CUI (スクリプト)
16
PowerShell エンジン
Exchange コマンドレット
設定情報へのアクセス
ActiveDirectory
レジストリ Metabase
MAPIStore
管理インターフェイス
WinForm
ADO.NET
PowerShell データプロバイダ
WinForm
CLI
GUI
セットアップ
Exchange Server 2007 の管理ゕーキテクチャ
17
ウゖザードの結果をスクリプトに
18
Exchange Server 2003 (VBScript) Exchange Server 2007(PowerShell ワンラナー)
メールボックス
Set listExchange_Mailboxs = GetObject("winmgmts:{impersonationLevel=impersonate}!\\COMPUTERNAME\ROOT\MicrosoftExchangeV2").InstancesOf("Exchange_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”
Exchange Server 2007 スクリプト比較
19
Microsoft Office VisioPowerShell スクリプト生成ツール
図形をドロップ 詳細の設定 スクリプト生成
• PowerShell が身近なツールに• ビジュゕルにスクリプトを作成• そのまま仕様書に• 無償ダウンロード http://www.microsoft.com/japan/windowsserver2008/powershell-
tool.mspx
2020
コミュニテゖ
• 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 フゔルを取り扱う
2121
パートナー
• 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 …
22
Windows PowerShell フォーラム
http://social.technet.microsoft.com/Forums/ja-JP/powershellja/threads
2323
PowerShell を極めるには
• あちこちにンストールする
• 対話シェルであれこれ試す
• なんとなくまとまってきた、また同じ作業をすることがありそうだ→ スクリプトにしましょう
• オブジェクト! オブジェクト!
• .NET Framework はこわくありません(むしろ便利)
• コミュニテゖ– フォーラム・ブログ・勉強会・書籍
2424
PowerShell のバージョン
• 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
25
PowerShell V2 の新機能
GUI と PowerShell
スクリプテゖング機能の強化
多様な実行環境への対応
サーバーの役割と機能への対応
2626
スクリプテゖング機能の強化
• 簡単に使えて、簡単に共有
• 安全に実行
• 主な新機能– モジュール
– Advanced functions
– デバッグ機能
– トランザクション
– 国際化
– 言語の拡張
2727
多様な実行環境への対応
• どこで、どのように実行されるか状況に応じて柔軟な対応– 1台 / 複数台– 制限環境 / 非制限環境– ユーザー入力による開始 / ベントによる開始– ローカル / リモート (1:1, 1:*, *:1)– 同期 / 非同期
• 主な新機能– リモート実行– バックグラウンドジョブ– ベンテゖング– 制限実行環境
2828
GUI と PowerShell
• PowerShell ベースの GUI を簡単に作成可能に
• スクリプテゖング環境 (IDE) の提供
• 主な新機能
– 新しい API
– ランスペースのプール、スレッド制御
– PowerShell ISE (Interated Scripting Environment)
– Out-GridView
2929
サーバーの役割と機能への対応
• サーバーの運用管理に本格的に活用– Active Directory
– グループポリシー
– Server Manager
– IIS
– リモートデスクトップサービス
– フェールオーバークラスタリング
– Best Practices
– その他…
3030
Windows Server 2008 R2 では
• 役割や機能の管理に積極的に利用
• それぞれモジュールとして提供
– $PSHOME\Modules
• GUI はコマンドレットを呼び出す形へ
31
新しい管理 UI モデル
管理ツール UI(例: Active Directory
管理センター)
自動化プラットフォーム
(例: AD コマンドレット)
オブジェクトモデル(Active Directory)
3232
Windows 7 では
• Server 同様、さまざまな機能がモジュールで提供
• Windows トラブルシューテゖングプラットフォーム
– トラブルシュートのための共通基盤
– c:\windows\diagnostics
3333
まとめ
• Windows PowerShell は強力なコマンドランシェル環境です。
• .NET Framework を最大限に活用し、最小の学習で最大の機能を利用できます。
• これからのサーバー製品の基本ツールになります。
• ぜひ試して、本運用にご活用ください!
34
3535
参考情報
• 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
3636
テキスト処理
• オブジェクトの活用により、テキスト処理が必要な場面はかなり減少した
• .NET String クラス
– Join, Split, SubString, Trim, Length, …
• 多くの .NET の型と変換を利用可能
– [datetime], [URI], ENUMS, …
• 豊富な string オペレーター
– +, *, -f, -replace, -match, -like, -eq, -ne,-gt, -ge, -lt, -le
– 暗黙、明示的なキャスト、強制
• 正規表現を使ったマッチング
– Select-String
3737
出力と書式
• リスト形式、表形式、ワド、カスタムビューのフォーマッタが用意されている
– 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
3838
ドラブ
• さまざまなデータストゕに、共通のゕクセス方法を提供
• データストゕは「ドラブ」として見える
– Filesystem, Registry, Alias, Certs, Env, Functions, Variables, …
– get-childitem HKLM:\SOFTWARE\Microsoft
• 「ドラブ」はさまざまな情報を含む名前空間
– Item, ChildItem, Content, Property, ACL, …
• 共通のコマンドレットでゕクセス可能また alias が既定で設定されている
Get-ChildItem dir ls
Get-Cwd cd pwd
Get-Content type cat
New-item –type directory mkdir mkdir
Set-Location cd cd
3939
ドラブのゕクセス方法
• ドラブ名、プロバダを指定して新しいドラブをマウント– 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
4040
.NET スクリプテゖング
• すべての .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)
4141
ADSI スクリプテゖング
• Windows PowerShell は ADSI のネテゖブゕクセスを提供
• ADSI オブジェクトにバンド
– $objDomain = [ADSI]"LDAP://localhost:389/dc=NA,dc=fabrikam,dc=com”
• ADSI オブジェクトの生成
– $objOU = $objDomain.Create("organizationalUnit", "ou=HR")
– $objOU.SetInfo()
• ADSI オブジェクトを変更
– $objOU.Put("description", "Human Resources")
– $objOU.SetInfo()
• ADSI オブジェクトを取得
– $objOU.Get("description")
• ADSI オブジェクトの削除
– $objDomain.Delete(“organizationalUnit”, “ou=HR”)
4242
オブジェクトユーテゖリテゖ
• 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}
4343
WMI
• Get-WmiObject
– WMI 名前空間とのンターフェス
• Get-WmiObject –list [-Namespace xx]
• Get-WmiObject –Class win32_bios
– リモート接続可能
4444
ログの操作
• ベントログ– 読み取り
• Get-EventLog
– 書き込み• System.Diagnostics.EventLog クラスを利用
– $log = New-Object –Type System.Diagnostics.EventLog-ArgumentList System
$log.source = “日次処理”$log.WriteEntry(“正常に終了しました”, “Information”)
• エラー時にもベントを書き込み– ベントにタスクを添付して、復帰処理
• その他のログ– IIS
• 文字列処理• LogParser
4545
COM
• 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
4646
XML
• 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")
4747
引数と戻り値
• 名前付き引数、型付き引数
– $args で名前なし、型指定なしの引数
– 関数定義または param 文で引数の名前、型、既定値を設定
– 名前の一部指定でマッチング
– 引数の順序を考えなくてよい
– より安全なスクリプト
• 戻り値
– パプに出力されたものが戻り値になる
– デバッグ情報やユーザーへの情報はコンソールへ
4848
サンプル (1)
• 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
4949
サンプル(2)
– 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 | ConvertTo-Html ); sleep 1}
5050
サンプル(3)
• ベントログ
– システムログから最新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
5151
サンプル(4)
• 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-ObjectOfficeOpenXml.ExcelPackage (dir vbs2ps.xlsx)
• foreach ($i in 1..5) {$ep.workbook.worksheets[1].Cell($i,1).value}
5252
サンプル(5)
• フゔルシステム監視
– 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
53
$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を参考に実装してみてください}
}}
例: Get-netstat.ps1