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
© Copyright 2024 ExpyDoc