Windows PowerShell - Download Center - Microsoft

Tech Fielders セミナー
Windows PowerShell 3.0 RC による
Windows Server 2012 管理の自動化
Part1 初級編 v1.21 2012.6.6 更新版
日本マイクロソフト株式会社
エバンジェリスト
安納 順一 Junichi Anno
BLOG http://blogs.technet.com/junichia/
Facebook: junichi anno
1
はじめに
• このセミナーは Windows PowerShell 初心者向けです
• Windows PowerShell 3.0 beta をベースに、Windows Server 2012 の
管理の自動化について解説します
• さらに高度な内容は以下の回で解説します
• 6月12日 リモーティング 編
• 6月19日 ワークフロー 編
• 6月25日 開発者のための Windows PowerShell
2
Agenda
初級編
リモーティング編
1.Windows PowerShell の位置づけ
2.基本的なコマンドレットと書式の基礎
3.基本的な文法とスクリプトの作り方
5.リモーティングの準備と PS セッションの基礎
6.PS セッションの永続化と再接続
7.リモートバックグラウンドジョブとジョブ結果の取
得
8.Windows PowerShell Web Service のセットアッ
プと使い方
i.
ii.
iii.
iv.
v.
vi.
vii.
viii.
ix.
x.
xi.
xii.
xiii.
起動中のサービス一覧
起動中のサービスを停止
ネットワーク情報を取得する
ネットワークの設定を変更する
ローカルコンピューター名を変更する
リモートコンピューターのコンピューター名を変更する
リモートコンピューターをドメインに参加させる
複数のコンピューターをドメインに参加させる
イベントログを取得する
イベントログをバックアップする
独自のイベントログを登録する
仮想マシンを作成して起動する
パフォーマンスログを取得する
4.バックグラウンドジョブの使い方
今
回
の
内
容
ワークフロー編
9.ワークフローの基礎
10.パラレル実行とシリアル実行
11.チェックポイントによる処理結果の永続化
12.処理のサスペンドとレジューム
3
基礎編
1. Windows PowerShell の位置づけ
4
代表的なスクリプト言語
バッチファイル(拡張子 .bat)
OSに合わせて継続的なエンハンス
MS-DOS時代から使われてきたコマンドシェル上のスクリプト。脈々と現代に引き継がれて
おり、利用者が多い。豊富なコマンド群によって支えられており、案外使い出がある。複数
のスクリプトを取りまとめる役割としても便利。
Visual Basic のスクリプト版。「Visual」とあるが、Visual ではない。わかりやすい文法と、
緩い規則によって根強いファンが多い。亜種として VBA もあるが微妙に文法は異なる。
Jscript(拡張子 .js)
今後エンハンスの予定は無い
JavaScript のMS 実装版として、VBScript とともに登場。JavaScript を Microsoft の独自
仕様によって拡張することで、汎用性を増している。
PowerShell(拡張子 .ps1)
Windows
Script
今後エンハンスの予定は無い
VBScript(拡張子 .vbs)
(余談)HTML5 によって新 JavaScript エンジンに
脚光が!ただしWindows Scriptとは別物
いわずと知れた高機能スクリプト言語。.NET Framework が使えると言うメリットから、利
用者は爆発的に増殖中。多くの製品がPowerShell用のコマンドレットを提供しており、
Windows Script Host は Server Coreのメニュー程度でしかお目にかかれなくなりつつある。
5
スクリプトの実行環境
bat
exe
VBScript
JScript
PowerShell エンジン
COM
Script Engine
cmd/
command
PowerShell スクリプト
Windows Script Host
Cscript.exe
Wscript.exe
C
O
M
.NET Framework
Class Library
CLR(共通言語ランタイム)
Windows
6
コマンドシェルの進化と機能の包含
DOS/
Win31
Win9x/
Me
NT
2000
XP/2003
Vista/2008
Win7/
2008R2
8
低機能
command.com
cmd.exe
Windows Script Host
高機能
PowerShell 上では
bat/vbs/js も実行可能
100
Windows PowerShell
コマンドレットの数
200
2300
7
マイクロソフト製品と PowerShell の関係
• 製品ごとに専用の”コマンドレット”が用意されている
• 多くの管理 GUI は裏でコマンドレットを呼んでいる
• インフラ担当者に、各製品への”標準化されたアクセス方法”を提供する
Active Directory
管理センター
PowerShell
コンソール
System Center
Virtual Machine Manager
Active Directory
PowerShell コマンドレット
Hyper-V
PowerShell コマンドレット
Active Directory
Hyper-V
8
Windows Management Framework
IT Pro
Solution
Developer
IT Developer
Service
Provider
Windows Management Framework
開
発
標準化されたアクセス Windows PowerShell
標準化されたプロトコル WS-Man
(Web Service for Management)
標準化された
CIMOM、SMI-S
オブジェクトモデル
CPU
Storage Network Devices
他の
プラットフォーム
WS-Man
CIMOM、
SMI-S
9
VBScript vs PowerShell
メール
ボックス
統計
Exchange 2003 (VBScript)
Exchange 2007(PowerShell)
Set listExchange_Mailboxs =
GetObject("winmgmts:{impersonationLevel=impersonate}!\\COMPUTERNAME\ROOT\MicrosoftExchangeV2").InstancesOf("Excha
nge_Mailbox")
get-mailboxstatistics
–server $servername
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
データ
ベース
管理
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)
受信者
管理
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
move-storagegrouppath
-identity "First Storage
Group"
–log "C:\newlogPath"
enable-mailbox
-identity domain\FOO
–database "First Storage
Group\Private MDB"
10
Windows Management Framework 3.0 RC
http://www.microsoft.com/en-us/download/details.aspx?id=29939
対応しているOS
• Windows Server 2008 SP2 以降
• Windows Server 2008 R2 SP1 以降
• Windows 7 SP1 以降
※Windows Server 2012/Windows 8 にはインス
トールされています
前提条件
• Windows PowerShell ISE が
インストールされていること
• Microsoft .NET Framework 4.0 が
インストールされていること
11
基礎編
2. 基本的なコマンドレットと書式の基礎
12
事前準備
•
コンソールの環境設定
• 簡易編集を有効に
•
エクスプローラー(フォルダー)の環境設定
• 「拡張子を表示しない」を無効に
•
実行ポリシーの設定
※オンプレミスの”署名無しスクリプト”を実行できるようにする
PS C:\>Set-ExecutionPolicy RemoteSigned
•
リモートからの操作を有効にする(リモーティングの有効化)
PS C:\>Enable-PSRemoting –force
•
必要に応じて自分専用の初期設定ファイルを作成(規定では存在しない)
PS C:\>notepad $profile
13
実行ポリシーの設定~ Set-ExecutionPolicy
http://technet.microsoft.com/ja-jp/library/dd347628.aspx
•
•
“管理者として実行” する必要がある
実行ポリシー
–
–
–
–
–
“ポリシーの設定”は、規定では
Restricted:制限つき (オペレーターモード)(規定値)
コンピューター全体に影響する。
•
対話形式のみ
適用範囲を制限するには、
•
スクリプトは実行できない
Scope も同時に定義する。
AllSigned:署名
•
スクリプトは、信頼された発行元による署名が必要
RemoteSigned:リモートの署名
•
“インターネットゾーン” のスクリプトは信頼された発行元による署名が必要
Unrestricted:無制限
•
すべてのスクリプトを実行可能
•
リモートのスクリプトについては常に警告
Bypass:バイパス
•
何もブロックされず警告も表示されない
14
コマンドレットの構造
<操作>-<ターゲット>
(例)
Checkpoint-VM
Compare-VM
Export-VM
Get-VM
Import-VM
Measure-VM
Move-VM
New-VM
Remove-VM
Rename-VM
Repair-VM
Restart-VM
Resume-VM
Save-VM
Set-VM
Start-VM
Stop-VM
Suspend-VM
15
モジュールとコマンドレット
• コマンドレットはモジュール(Module)によって提供される
• (基本的に)モジュールが読み込まれていないとコマンドレットを使
用することはできない
※ PowerShell 3.0 では自動読み込みが可能になりました
構造
CmdLet
CmdLet
CmdLet
CmdLet
Module
規定のモジュール
Add-Computer
Add-Content
Checkpoint-Computer
Clear-Content
Clear-EventLog
Clear-Item
Clear-ItemProperty
Complete-Transaction
Microsoft.PowerShell.
Management
例
Add-VMDvdDrive
Add-VMFibreChannelHba
Add-VMHardDiskDrive
Add-VMMigrationNetwork
Add-VMNetworkAdapter
Add-VMNetworkAdapterAcl
・
・
・
Hyper-V
16
モジュールに関するコマンドレット
• 読み込まれているモジュール一覧の取得
PS C:\> Get-Module
• 使用可能なモジュール一覧の取得
PS C:\> Get-Module -ListAvailable
• モジュールを読み込む
PS C:\> Import-Module <モジュール名>
PS C:\> Import-Module Hyper-V
• 使用可能なモジュールを全て読み込む
PS C:\> Import-Module (Get-Module -ListAvailable).Name
17
コマンドレット情報を取得する
• 使用可能なコマンドレット一覧を取得する
PS C:\> Get-Command
• “-VM” という文字列を含むコマンドレットの一覧
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
18
エイリアス
コマンドレットにはエイリアスが用意されているものがある
• 入力の簡易化
• DOSコマンドやLinux系シェルとの互換性
• エイリアスの一覧を取得する
PS C:\> Get-Alias
19
コマンドレットの戻り値
• コマンドレットの戻り値は“オブジェクト”である
• PowerShell はオブジェクトを操作する言語
• 戻り値を「どのように操作できるか」を知っていることが重要
• オブジェクトには「メソッド」と「プロパティ」が用意されている
戻り値を直接、”操作”することが可能
Get-Service
サービス一覧
stop()
オブジェクト
20
もしも”オブジェクト”が自転車だったら...
プロパティ
メソッド
操作
プロパティ
色
メソッド
ペダルをこぐ
サイズ
ハンドルを右に切る
型
ハンドルを左に切る
ブランド
フロント ブレーキをかける
パーツ
リア ブレーキをかける
21
もしも”オブジェクト”が「Windows のサービス」だったら。。。
プロパティ
メソッド
DisplayName
Stop()
MachineName
Start()
Status
DependentServices
Windows
サービス
Pause()
22
メソッドとプロパティを調べるには
• コマンドレットのメソッドとプロパティを表示
<コマンドレット> | get-member
<コマンドレット> | get-member | sort-object Name | format-list
※ COMのメンバーも取得できる
New-Object -com scripting.filesystemobject | Get-Member
• サービスに対して行える操作を取得する
Get-Service | Get-Member
• 仮想マシンに対して行える操作を取得する
Get-VM | Get-Member
23
オブジェクトであるということは...
PS C:\>$a = “abc”
#普通ならば $a は”文字列” になるけれど...
#オブジェクトだからメソッドとプロパティが用意されている
PS C:\>$a.ToUpper()
PS C:\>ABC
PS C:\>$a.ToUpper().Split("B")[0]
PS C:\>A
24
コマンドからの出力もオブジェクト化される
ipconfig の出力結果からIPアドレスを取りだす
PS C:\> (ipconfig)[18].Split(":")[1].Trim()
object
ipconfig の
出力結果
の18行目
(0から数えて)
コロンで分割した
(0から数えて)
2つ目の値
前後の空白を
トリミング
IPv4 アドレス . . . . . . . . . . : 192.168.1.100
25
PSドライブ
ファイルシステムだけではなく、さまざまなオブジェクトがドライブとしてアク
セス可能(CD コマンドで移動可能)
PS C:\> Get-PSDrive










ファイルシステム
エイリアス(Alias:)
レジストリ(HKLM:、HKCU:)
証明書(Cert:)
環境変数(Env:)
変数(Variable:)
WSMAN設定(Wsman:)
Active Directory(AD:)
IIS(IIS:)
Remote Desktop Service(RDS:)
モジュールが読み込まれて
いないと使えないドライブ
もある
(例)ActiveDirectory
26
基礎編
3. 基本的な文法とスクリプトの作り方
さまざまな使用例から使い方を学びましょう
27
1.
2.
3.
4.
5.
6.
起動中のサービス一覧
起動中のサービスを停止
ネットワーク情報を取得する
ネットワークの設定を変更する
ローカルコンピューター名を変更する
リモートコンピューターのコンピューター名を変更する
※標準コマンドレット or WMI
7. リモートコンピューターをドメインに参加させる
※標準コマンドレット or WMI
8. 複数のコンピューターをドメインに参加させる
9. イベントログを取得する
10.独自のイベントログを登録する
11.仮想マシンを作成して起動する
12.パフォーマンスログを取得する
28
1.起動中のサービス一覧を取得する
object
サービス一覧
パイプ
PS C:\>get-service | where-object {$_.Status -eq "Running"}
サービス一覧
を出力
object
まオ
まブ
渡ジ
さェ
れク
るト
の
サービス一覧
29
条件を指定して検索した結果だけを
オブジェクトとして取得したい
#サイズが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
30
(参考)3.0 では書式を簡略化できます
PS C:\>get-service | where-object {$_.Status -eq "Running"}
V3 ではこう書ける
PS C:\>get-service | where-object Status -eq "Running"
31
2.特定のサービスを停止する
PS C:\>Stop-Service WSerarch
メソッド
PS C:\>(Get-Service -Name WSearch).Stop()
Windows Search サービスの
インスタンスを取得
インスタンスに対して
メソッドを実行
object
Windows Search
32
()で括るとオブジェクトを表す
#Dir の出力結果の最初の行から
#Nameプロパティだけを取り出す
(dir)[0].Name
#変数を使用すると以下のように書き換えられる
$D = Dir
$D[0].Name
33
3.ネットワーク情報を取得する
ネットワークアダプタの一覧
Format-List の略
PS C:\> Get-NetAdapter | FL Name, InterfaceIndex, MacAddress
IP アドレスの取得
PS C:\> Get-NetIPAddress -InterfaceIndex 28 -AddressFamily IPv4
34
出力結果のフォーマット変換して表示したい
dir | format-table Name,Length
dir | format-list Name,Length
dir | format-wide Name -column 6
dir | out-gridview
35
4.ネットワークの設定を変更する
静的なIPV4アドレスを設定する
PS C:\>New-NetIPAddress -InterfaceIndex 24 -IPAddress 192.168.205.102
-AddressFamily IPv4 -PrefixLength 24 -DefaultGateway 192.168.205.254
既存の静的アドレスを変更する場合には Set-NetIPAddress を使用する
DNS の設定
PS C:\>Set-DnsClientServerAddress -Interface 24
-ServerAddress 192.168.205.1, 192.168.205.3
IP アドレスの削除
PS C:\> Remove-IPAddress -InterfaceIndex 24 -AddressFamily IPv4
DNSの設定を削除する
PS C:\> Set-DnsClientServerAddress -Interface 24 -ResetServerAddress
DHCP を有効にする
PS C:\> Set-NetIPInterface -InterfaceIndex 24 -Dhcp Enabled
36
5.ローカルコンピューター名を変更する
ローカルコンピューター名の取得
方法1 PS C:\> $Env:ComputerName
方法2 PS C:\> (Get-WmiObject -Class Win32_ComputerSystem).Name
ローカルコンピューター名の変更
標準のコマンドレットを使用する場合
C:\> Rename-Computer -NewName “tfwin8-xx” -Force -Restart
WMI のクラスを直接使用する場合
PS C:\> $New_ClientName = “New_ClientName”
PS C:\> $SysInfo = Get-WmiObject -Class Win32_ComputerSystem
PS C:\> $SysInfo.Rename($New_ClientName)
PS C:\> Restart-Computer
37
変数
$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
出力結果
38
環境変数の取得方法
#環境変数の一覧を取得
cd env:
dir
#特定の環境変数を取得
$env:computername
$env:username
$env:userdomain
$env:SessionName
39
WMI について
•
•
•
•
Windows Management Instrumentation の略
大部分の管理オブジェクトがモデル化されている
Get-CimClass コマンドレットでクラスの一覧を取得できる
詳しくは以下の資料をご覧ください
http://www.slideshare.net/junichia/vbscript-wmi
40
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
41
WMI のクラスを直接使用する
変更
WMI
Server
Client
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
42
クレデンシャルの作成
その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
43
WMI Tester
http://technet.microsoft.com/en-us/library/cc782719(v=ws.10)
• WMI への接続性をテストするツール
• リモートコンピューターへの接続も
テストできる
44
非ドメインメンバーから WMI接続 が拒否される原因
代表的なエラー番号
• 0x800706ba
• 0x80041003
• 0x80070005
代表的な原因
• Firewall の設定
• アクセス権
45
必要なアクセス権
• Distributed COM Users メンバーである
こと
• (規定では)システム管理者であること
※wmimgmt.msc で変更可能
46
必要な Firewall の設定
• Windows Management Instrumentation のルール
47
7.ドメインに参加させる
Server
参加指示
AD Domain
Client
Client
Client
Workgroup
標準のコマンドレットを使用する
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
48
WMIのクラスを直接使用する
認証に関する通信を暗号化する
PS C:\> $Domain = “tf.com”
これを指定しないと以下のエラー
PS C:\> $Client = “ClientComputer”
“Client connection to WINMGMT
needs
to be encrypted for this
PS C:\> $Cred = Get-Credential junichia
operation. Please adjust your
PS C:\> $Admin = “tf\administrator”
IWbemServices proxy security settings
and retry. ”
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
1: ドメインに参加
2: コンピューターアカウントの作成
49
8.複数のコンピューターをドメインに参加させる
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 各種定数の設定
Client
Client
CSV
Server
$Cred = Get-Credential junichia
$Domain = "tf.com"
tfwin8-01,192.168.205.101,経理部
$Admin = "tf\administrator"
tfwin8-02,192.168.205.102,営業部
$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
}
50
行継続
アクサン グラーブ記号 (`) を使用する
copy-item C:\tmp\*.txt `
-destination C:\
こ
い
つ
51
入出力方法
これを抑えておけば、ひとまずたいていのことはできます
#標準出力
#ファイルから入力
Write-Output “Hello”
$file = Get-Content -Path c:\tmp\list.txt
Echo “Hello”
$file = type c:\tmp\list.txt
#標準入力
#CSVファイルから入力
$InputData = Read-Host
$file = Import-CSV -Path c:\test.csv
#ファイルに出力
Out-File -filepath C:\tmp\list.txt -inputobject $Record
52
ファイルのコード変換
SJIS作成したファイルは日本語が正しく扱われないことがある
∴ Get-Content で読み込み、Out-File でUnicodeで保存する
Get-Content -Path $Input -Encoding String | `
Out-File -Encoding UNICODE
指定可能な文字コード
String
Unicode
Byte
BigEndianUnicode
UTF8
UTF7
UTF32
Ascii
Default
Oem
53
Import-CSV のヘッダーについて
• 規定では、1行目はヘッダーとして扱われる
ComputerName, IPAddress, Department
tfwin8-01,192.168.205.101,経理部
tfwin8-02,192.168.205.102,営業部
・
・
• ヘッダーが無い場合には -Header パラメタで指定可能
• -Header を指定すると1行目はデータとして扱われる
• ヘッダー単位(列単位)で取り出しが可能
$Computers = Import-Csv -Path $OutputFile -Header ComputerName,IPAddress
$Computers.IPAddress
54
Out-GridView
入力したグリッド形式データを参照するための EXCEL VIEWER 的ツール
Import-CSV -Path $File | Out-GridView
55
繰り返し処理1
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 }
56
繰り返し処理2
#1から10までを出力
1..10
#1から10 をリダイレクトして出力
1..10 | % {echo $_ }
#User1 から User10 を作成
1..10 | % {New-ADUser “User$_” }
※ % は foreach のエイリアス
57
繰り返し処理3
$i = 0
do
{
}
Write-Host $i
$i++
while ($i -lt 10)
$i = 0
do
{
}
Write-Host $i
$i++
until ($i -ge 10)
58
9.イベントログを収集する
リモートコンピューターのセキュリティログから、最新10個のログを取りだす
C:\> Get-EventLog -LogName Security -ComputerName tfdc01 -Newest 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 “*ログオン*”
59
イベントログを集計する
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
60
Select-Object
結果から必要な要素だけを抜き出して処理する
※パイプの後ろで使用することをお勧め(なんかおかしい...)
× PS C:\> Select-Object -InputObject $Data
○ PS C:\> $Data | Select-Object
重複データを除く
$data |Select-Object -Unique
最後の10個だけ取得
$data |Select-Object -Last 10
最初の5個のイベントIDだけ取得
$data |Select-Object InstanceID -First 5
61
10. イベントログをバックアップする
PowerShell は管理者モードで起動してください
セキュリティイベントログをローカルにバックアップする(EVT形式)
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)
62
9.独自のイベントログを登録する
ログファイル名 TechFielders、イベントソース TechFielders を新規に登録する
C:\> New-EventLog -Source "TechFielders" -LogName "TechFielders"
TechFielders ログにイベントログを書き込む
C:\> Write-EventLog -LogName TechFielders -Source “TechFielders”
-EntryType Information -EventId 5963 -Message “元気出せこの野郎!1,2,3 ダァ!"
63
10. 仮想マシンを作成して起動する
PS C:\> .\CreateVirtualMachine.ps1 -VMName "tfwin8-02" -Mem 1024mb
1
2
3
4
5
6
7
8
9
10
11
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
64
引数を受け取る
5つの引数
C:\> .\hogehoge.ps1 My name is “Junichi Anno” .
Write-Output $args[3]
Junichi Anno
foreach ( $a in $args )
{
Write-Output $a
}
My
name
is
Junichi Anno
.
65
名前付き引数
引数を所定の名前の変数に格納することで、文法チェック等が行いやすくなる
C:\> hogehoge.ps1 -userid anno
param([string] $UserID = “ID", [string] $Password =“PASS")
Write-Output $userid
Write-Output $Password
規定値
anno
PASS
出力結果
66
11. パフォーマンスログを取得する
プロセッサー(コア単位)の利用率を1秒に1回取得して表示する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$a = 1
$i = 0
Do
{
$perf =Get-WmiObject -Class win32_perfformatteddata_perfos_processor `
-Property PercentProcessorTime
$i = 0
foreach ($p in $perf ) {
$i++
$outrec = "Processor" + $i + ":" + $p.PercentProcessorTime
echo $outrec
}
1秒スリープ
Start-Sleep -Seconds 1
cls
画面をクリア
} while ($a = 1)
67
パフォーマンスカウンター
パフォーマンスカウンタークラスの一覧を取得
C:\> Get-CimClass Win32_PerfFormatted* |ft CimClassName
C:\> Get-CimClass Win32_PerfRaw* |ft CimClassName
win32_perfformatteddata_perfos_processor クラスが持ってい
るカウンターの一覧を表示する
C:\> $PerfMon = Get-CimClass Win32_PerfFormattedData_perfos_processor
C:\> $PerfMon.CimClassProperties |ft Name
68
基礎編
4. バックグラウンドジョブ
69
バックグラウンドジョブ
• Windows PowerShell 2.0 よりサポート
• 長時間を要するコマンドレットを非同期に実行し、次の処理に移る
(例)get-eventlog “Security”
• ジョブの有効範囲は現在のセッション
関連コマンドレット
 Get-Job
 バックグラウンドジョブを取得
 Receive-Job
 バックグラウンドジョブの出力結果を取得
 Remove-Job
 バックグラウンドジョブを削除
 Start-Job
 バックグラウンドジョブを開始
 Stop-Job
 バックグラウンドジョブを停止
 Wait-Job
 バックグラウンドジョブが終了するまで待つ
JOB
結果
Background
Frontend
70
バックグラウンドジョブの基本操作
書式
start-job -scriptblock { <スクリプトブロック> }
5秒に1回日時を表示するジョブ
(例)
PS C:\> $job = start-job -scriptblock {do {$a = 0; echo (date) ; start-sleep 5} while ($a -eq 0) }
PS C:\> $job
出力結果が存在する
Id
-6
Name
---Job6
State
----Completed
PS C:\> Receive-Job $job -Keep
PS C:\> Stop-Job $job
PS C:\> Remove-job $job
HasMoreData
----------True
Location
-------localhost
Command
------get-eventlog "Windows ...
規定では、出力結果は一度取得するとクリアされてしま
うので、-Keep によって残すように指定
ジョブを停止
ジョブを削除
71
スクリプトをバックグラウンドジョブ化する
まずはスクリプトを作成する(イベントログを取得するスクリプト)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$flg = $true
WatchNewEventLog.ps1
$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 }
結果を Index をキーとして昇順に並べる
Start-Sleep -Seconds 1
$index_old = $index.Index
} While ($flg)
72
##作成したスクリプトをバックグラウンドで実行する
PS C:\> Start-Job -FilePath .\WatchNewEventLog.ps1 -Name WatchNewEventLog
Id
-4
Name
PSJobTypeName
---------------WatchNewEven... BackgroundJob
State
----Running
HasMoreData
----------True
Location
-------localhost
Command
------$flg = $true...
以下のコマンドで新しいイベントを書き込む
C:\> Write-EventLog -LogName TechFielders -Message "Hello" -Source "TechFielders" -EventId 5963
## 以下のコマンドで現在までの結果を収集する
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
73
基礎編
4. Tips
その他、知っていると便利な使用法について
74
True と False の指定
$True と $False が予約されている
C:\> $MyNameIsJunichi = $True
C:\> If ($MyNameIsJunichi -eq $True) {Echo 1}
1
75
日時を取得(Date オブジェクト)
プロパティ
PS C:\> (Date).Year
2012
メソッド
PS C:\> (date).adddays(10)
24年 5月 23日 12:49:10
Date
Day
DayOfWeek
DayOfYear
Hour
Kind
Millisecond
Minute
Month
Second
Ticks
TimeOfDay
Year
Add
AddDays
AddHours
AddMilliseconds
AddMinutes
AddMonths
AddSeconds
AddTicks
AddYears
CompareTo
Equals
GetDateTimeFormats
GetHashCode
GetType
GetTypeCode
DateTime
IsDaylightSavingTime
Subtract
ToBinary
ToFileTime
ToFileTimeUtc
ToLocalTime
ToLongDateString
ToLongTimeString
ToOADate
ToShortDateString
ToShortTimeString
ToString
ToUniversalTime
76
unix のあのコマンドは?
ls
cp
grep
sort
man
clear
cat
kill
tee
tail
→ get-ChildItem
→ copy-Object
→ select-String
→ sort-Object
→ help
→ clear-Host
→ get-Content
→ stop-Process
→ tee-Object
→ get-Content
「アレはあるかな?」と思ったら
Get-Alias <unix 上のコマンド>
77
Get-Content で Tail を模してみる
## テキストファイルの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
## 新しく追加された行に特定の文字列が含まれていたら表示
gc test.txt -wait | Select-String -Pattern ^a
78
まとめ
Windows PowerShell を始めたら、
PowerShell だけを使い続けましょう!
コマンドプロンプトに戻ってはいけません!
PowerShell に「一短」はありません!
79
80