Hyper-V を Windows PowerShell から管理する

12,748 views

Published on

無償の Hyper-V Server は以下からダウンロードできます!この資料のPPT版もダウンロードできます!
http://technet.microsoft.com/ja-jp/windowsserver/jj649374

0 Comments
26 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
12,748
On SlideShare
0
From Embeds
0
Number of Embeds
717
Actions
Shares
0
Downloads
277
Comments
0
Likes
26
Embeds 0
No embeds

No notes for slide

Hyper-V を Windows PowerShell から管理する

  1. 1. 勉強会キット Windows PowerShell 4.0 による Windows Server 2012 R2 の管理 ~ Hyper-V 編 第一版 2013.12.01 日本マイクロソフト株式会社 エバンジェリスト 安納 順一 Junichi Anno BLOG http://blogs.technet.com/junichia/ 1
  2. 2. はじめに この勉強会キットでは、Windows PowerShell を使用してリモートコンピューターから Hyper-V を管理するための手法を学習します。 演習では Windows Server 2012 R2 と Hyper-V Server 2012 R2 を使用していますが、多 くの操作は旧バージョンの OS でも動作します。 この勉強会キットは3部構成になっています。 第1部 基本的な操作方法 このセクションではインストール直後の OS を、PowerShell のコマンドレットだけ を使用して Hyper-V が使用できるように環境設定していきます。 第2部 ライブマイグレーション このセクションでは、第1部でセットアップした Hyper-V 環境にさらに手を入れてラ イブマイグレーションが実行できるようにします。 第3部 Windows PowerShell エキスパートを目指す方へ 第1部、第2部では細かな技術解説は行っていません。このセクションでは、Windows PowrShell の細かいテクニックも含め、Windows Server 全般を管理するためのスクリ プトを作成するのに必要なテクニックについて解説しています。 2
  3. 3. 事前準備 本勉強会キットの手順書に沿って学習する場合には、事前に以下の環境を準備してください。 なお、ホスト名やIPアドレスは演習中に Windows PowerShell コマンドレットを使用して 設定するので、事前設定は必要ありません。 いずれの OS も以下よりダウンロードできます (OSがインストールされたVHDファイルもダウンロードできます) http://technet.microsoft.com/ja-jp/evalcenter/dn205286.aspx 物理マシン Windows Server 2012 R2 (GUI使用サーバー) 物理マシン Hyper-V Server 2012 R2 Sysprep済の 仮想ハードディスク Windows Server 2012 R2 第1部で使用 第2部で使用 ライブマイグレーションを行う場合には2台の物理サーバーが必要です 3
  4. 4. Agenda 第1部 基本的な操作方法 このセクションではインストール直後の OS を、PowerShell のコマンドレットだ けを使用して Hyper-V が使用できるように環境設定していきます。 第2部 ライブマイグレーション このセクションでは、第1部でセットアップした Hyper-V 環境にさらに手を入れ てライブマイグレーションが実行できるようにします。 第3部 Windows PowerShell エキスパートを目指す方へ 第1部、第2部では細かな技術解説は行っていません。このセクションでは、 Windows PowrShell の細かいテクニックも含め、Windows Server 全般を管理する ためのスクリプトを作成するのに必要なテクニックについて解説しています。 4
  5. 5. 第1部 基本的な操作を学ぼう このセクションでは、OS インストール直後の状態から、Windows PowerShell だけを使用して、Hyper-V 上に仮想マシンを立ち上げます。 5
  6. 6. 1台目の Windows Server 1. Windows Server 2012 R2 のインストール 2. Windows PowerShell の基本設定  統合スクリプト環境の起動  実行ポリシーの設定  リモーティングの設定 3. 4. Windows Server の基本設定  IP アドレスの設定  DNS の設定  ローカルコンピューター名の設定  Windows Update の実行 Hyper-V の構成  Hyper-V 役割のインストール  Hyper-V ホストの規定値を変更する  仮想ハードディスクの保存先  仮想マシンの保存先  Hyper-V レプリカの有効化  仮想スイッチの作成 5. DNS サーバーの構成  DNS サーバー役割のインストール  DNS ゾーンの確認 6. Active Directory ドメインの構成  AD DS 役割のインストール  Active Directory ドメインの構築 7. DHCP Server の構成  DHCP サービスのインストール  DHCP サービスを構成する  スコープを作成する 8. 仮想マシンの構成  ゲスト OS の作成  ゲスト OS の初期設定  ゲスト OS の環境設定 6
  7. 7. 1.Windows Server 2012 R2 のインストール ① Windows Server 2012 R2 を「GUI付き」で普通にインストール してください。ここでは Windows PowerShell は使用しません。 以降の手順で Windows PowerShell を使用して環境設定を行い ます。 7
  8. 8. 2. Windows PowerShell の基本設定 統合スクリプト環境の起動 ① Windows Server 2012 R2 にサインインする ② デスクトップのタスクバーに登録されている Windows PowerShell アイコンをク リックして PowerShell コンソールを起動する。 ③ 一度コンソールを閉じる ④ Windows PowerShell アイコンを「右クリック」して「ISE を管理者として実行 する」を選択し、ISE(統合スクリプト環境)を起動する。 スクリプトエディタ スクリプト実行画面 コマンドレットを直接実行 コ マ ン 文字が小さい場合には ド [Ctrl]+[+] で拡大できます。 レ [Ctrl] + [-] で縮小できます。 ッ ト 検 索 8
  9. 9. 実行ポリシーの設定 ① 以下のコマンドレットを実行し、ローカルで作成したスクリプトは署名なしで実行 できるように実行ポリシーを変更する PS C:¥>Set-ExecutionPolicy RemoteSigned リモーティングの有効化 ① 以下のコマンドレットを実行し、PowerShell によるリモート管理を有効にする PS C:¥>Enable-PSRemoting –force 9
  10. 10. 3. Windows Server の基本設定 IP アドレスの設定 ① ネットワークアダプタの一覧を表示し、IPアドレスを設定するネットワークカードの InterfaceIndex を特定する PS C:¥> Get-NetAdapter | FT Name, InterfaceIndex, InterfaceDescription ② ターゲットとなるネットワークアダプターの情報を確認する(以下の例では InterfaceIndex = 13 としている) PS C:¥> Get-NetIPAddress -InterfaceIndex 13 -AddressFamily IPv4 ③ 既定では DHCP を利用するように設定されているので、以下のコマンドを使用して静的な IP アドレスを設定する PS C:¥>New-NetIPAddress -InterfaceIndex 13 -IPAddress 192.168.0.1 -AddressFamily IPv4 -PrefixLength 24 -DefaultGateway 192.168.0.254 ※ DefaultGateway は必要に応じて ※ 既存の静的アドレスを変更する場合には Set-NetIPAddress を使用する 10
  11. 11. DNS の設定 ① DNS サーバーのアドレスを設定する PS C:¥>Set-DnsClientServerAddress -Interface 24 -ServerAddress 192.168.0.1 ※ 複数の DNS サーバーが存在する場合にはカンマで区切って指定する 参考 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 11
  12. 12. ローカルコンピューター名を設定する ① 現在のコンピューター名を取得する PS C:¥> $Env:ComputerName ② 新しいコンピューター名を設定し、再起動する PS C:¥> Rename-Computer -NewName “HV01” -Force -Restart 12
  13. 13. Windows Update を実行する ① 以下のコマンドを実行して、Windows Update PowerShell Module をダウンロードする PS C:¥> $web = New-Object System.Net.WebClient PS C:¥> $zipfile = "http://gallery.technet.microsoft.com/scriptcenter/” PS C:¥> $zipfile = $zipfile + “2d191bcd-3308-4edd-9de2-88dff796b0bc/file/41459/28/PSWindowsUpdate.zip" PS C:¥> $web.DownloadFile($zipfile, "C:¥tmp¥PSWindowsUpdate.zip") 上記コマンドでダウンロードできない場合には、以下のサイトから Windows Update PowerShell Module の最新版をダウンロードしてください http://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc ※「Windows Update PowerShell Modules」で検索すればヒットします ② 以下のコマンドを使用して、ダウンロードした PSWindowsUpdate.zip ファイルを適当な場所に 展開する。ここでは C:¥tmp フォルダに展開しています。 PS C:¥> Add-Type -AssemblyName System.IO.Compression.FileSystem PS C:¥> $ZipFile = Get-Item C:¥tmp¥PSWindowsUpdate.zip PS C:¥> [IO.Compression.ZipFile]::ExtractToDirectory( $ZipFile, ‘C:¥tmp’ ) ③ Dir コマンドで、 PSWindowsUpdate フォルダが作成されていることを確認 13
  14. 14. ④ 以下のコマンドを実行し、フォルダの中に格納されているすべてのファイルの「ブロック 解除」を行う。この操作はファイルのプロパティ画面から「ブロックの解除」を行うのと 同様である。 PS C:¥>Unblock-File <ファイルの保存先>¥*.* (例) PS C:¥>Unblock-File c:¥tmp¥PSWindowsUpdate¥*.* ⑤ PowerShell モジュールの格納場所を確認する PS C:¥>$env:PSModulePath C:¥Users¥Administrator¥Documents¥WindowsPowerShell¥Modules;C:¥windows¥system32¥Wind owsPowerShell¥v1.0¥Modules¥;C:¥Program Files (x86)¥Microsoft SDKs¥Windows Azure¥PowerShell¥ ⑥ 既定では C:¥Users¥junichia¥Documents¥WindowsPowerShell¥Modules が存在しない ので、以下のコマンドで PowerShell モジュールの格納場所を作成する PS C:¥> md C:¥Users¥Administrator¥Documents¥WindowsPowerShell¥Modules 14
  15. 15. ⑦ 以下のコマンドを実行し PSWindowsUpdate フォルダーを C:¥Users¥Administrator¥Documents¥WindowsPowerShell¥Modules 配下に移動する 以下の例では PSWindowsUpdate フォルダーは C:¥tmp にあるものとしている PS C:¥> Move C:¥tmp¥PSWindowsUpdate C:¥Users¥Administrator¥Documents ¥WindowsPowerShell¥Modules ⑧ PSWindowsUpdate モジュールを読み込む PS C:¥> Import-Module PSWindowsUpdate ⑨ Windows Update を実行する PS C:¥> Get-WUInstall -AcceptAll 15
  16. 16. 4. Hyper-V の構成 Hyper-V 役割をインストールする ① 以下のコマンドで現在インストールされている役割と機能の一覧を参照する PS C:¥> Get-WindowsFeature ② 以下のコマンドを実行して、Hyper-V 役割と管理ツール群をインストールし再起動する PS C:¥> Add-WindowsFeature Hyper-V -IncrudeAllSubFeature -IncludeManagementTools -Restart ③ Hyper-V 関連のコマンドレットを確認する PS C:¥> Get-Command -Module Hyper-V 16
  17. 17. Hyper-V ホストの設定値を変更する ① Hyper-V ホストの規定値を確認する PS C:¥> Get-VMHost | FL ② 仮想ハードディスクの既定の保存先を設定する ※以下の例では仮想ハードディスクの既定の保存先を D:¥VM に指定しています PS C:¥> Set-VMHost -VirtualHardDiskPath D:¥VM ③ 仮想ハードディスクの構成ファイルの既定の保存先を設定する PS C:¥> Set-VMHost -VirtualMachinePath D:¥VM 17
  18. 18. Hyper-Vレプリカを有効にする ① Hyper-V レプリカの設定値を確認する PS C:¥> Get-VMReplicationServer | FL ② Hyper-V レプリカを有効にし、認証タイプを Kerberos にする PS C:¥> Set-VMReplicationServer -ReplicationEnabled $True -AllowedAuthenticationType Kerberos ③ どんなサーバーからの複製も受け入れ、複製の保存先を D:¥VM に設定する PS C:¥> Set-VMReplicationServer -ReplicationAllowedFromAnyServer $True -DefaultStorageLocation D:¥VM ④ Windows Firewall の受信規則を確認する PS C:¥> Get-NetFirewallRule -Direction Inbound 18
  19. 19. ⑤ Windows Firewall の受信規則の中から、Hyper-V レプリカに関する設定を確認する PS C:¥> Get-NetFirewallRule -Direction Inbound -Desctiption *レプリカ* ※ HTTP と HTTPS に関する規則が存在することがわかります ※ それぞれ、ルール名で保存されています HTTP : VIRT-HVRHHTTPL-In-TCP-NoScope HTTPS : VIRT-HVRHHTTPSL-In-TCP-NoScope ⑥ “Hyper-V レプリカ HTTP リスナー(TCP受信)”規則を有効にする PS C:¥> Set-NetFirewallRule -Name “VIRT-HVRHTTPL-In-TCP-NoScope” -Enabled True $ は必要ありません 19
  20. 20. 仮想スイッチの作成 ① 仮想スイッチの一覧を表示する PS C:¥> Get-VMSwitch ※まだ仮想スイッチは存在しません ② ネットワークアダプターの一覧を表示し、外部仮想スイッチにバインドするネットワーク アダプターの Name 値を確認する PS C:¥> Get-NetAdapter | FL ③ 新しい外部スイッチを “ExternalSwitch” という名前で作成する。以下の例ではバインド 先のネットワークアダプタ名は“イーサネット”として指定している。 PS C:¥> New-VMSwitch -Name “ExternalSwitch” -NetAdapterInterName “イーサネット” -AllowManagementOS $True ④ ②で確認したHyper-V ホストの NIC が仮想化され、“ExternalSwitch”に接続されたこと を確認する PS C:¥> Get-NetAdapter | FL ※ “vEthernet (ExternalSwitch)” という仮想NIC が新たに作成されたことを確認してく ださい 20
  21. 21. 5. DNS サーバーを構成する DNSサーバー役割をインストールする ① DNS をインストールする PS C:¥> Add-WindowsFeature dns -IncludeManagementTools -IncrudeAllSubFeature -Restart ② DNS サービス関連のコマンドレットを確認する PS C:¥> Get-Command *DNSServer* DNS ゾーン の確認 ① 現在のゾーン設定を確認する PS C:¥> Get-DNSServerZone 現時点ではゾーンは存在しません。以降の手順でActive Directory ドメインを構築します。 21
  22. 22. 6. Active Directory ドメインを構成する Active Directory Domain Service (AD DS)役割をインストールする ① AD DS をインストールする PS C:¥> Add-WindowsFeature AD-Domain-Services -IncludeManagementTools -IncrudeAllSubFeature -Restart ② AD DS 関連のコマンドレットを確認する PS C:¥> Get-Command -module ActiveDirectory Active Directory ドメインを構築する ここでは Contoso.com ドメインを作成します ① 必要なモジュールをインポートする PS C:¥> Import-Module ADDSDeployment ② 以下のコマンドを実行して回復モードパスワードを SecureString に変換し、$Password 変数に格納する。ここではパスワードを P@ssw0rd としています。 PS C:¥> $Password = ConvertTo-SecureString “P@ssw0rd” -AsPlainText -Force 22
  23. 23. ③ ドメインコントローラーに昇格する ※ 以下は便宜上改行していますが、実際には1行で入力してください PS C:¥> Install-ADDSForest -CreateDnsDelegation:$False -DatabasePath “C:¥Windows¥NTDS” -DomainMode “Win2012R2” -DomainName “contoso.com” -DomainNetbiosName “CONTOSO” -ForestMode “Win2012R2” -InstallDns:$True -LogPath C:¥Windows¥NTDS” -NoRebootOnCompletion:$False -SysvolPath “C:¥Windows¥Sysvol” -SafeModeAdministratorPassword $Password -Force:$True インストールが完了すると自動的に再起動されます。 23
  24. 24. ④ Contoso.com ゾーンが作成されていることを確認する PS C:¥> Get-DNSServerZone -Name contoso.com | FL 24
  25. 25. 7. DHCP サーバーを構成する DHCP サービスをインストールする 今後仮想マシンを作成した際にアドレスをリースできるようにするため、DHCPサーバーを セットアップしておきます。 ① 以下のコマンドで DHCP サービスをインストールする PS C:¥> Add-WindowsFeature DHCP -IncrudeAllSubFeature -IncludeManagementTools -Restart ※ -Restart パラメタは、再起動が必要な場合に限って再起動が行われます。DHCPサービスのインストールでは再起動は 行われません。 ② DHCPサービス関連のコマンドレットを確認する PS C:¥> Get-Command *DHCP* 25
  26. 26. DHCP サービスを構成する ① DHCP サーバーのバインディングが 192.168.0.1 に設定されていることを確認する ※バインディングが有効にされた NIC を通じて DHCP サービスによる IP アドレスリースが行われます PS C:¥> Get-DHCPServerV4Binding BindingState が True であることを確認してください。 ② DHCP サービスのバインディングを 192.168.0.1 に設定する(設定されていない場合) ※事前に Get-NetAdapter で NIC の Name プロパティを確認してください。以下の例で -InterfaceAlias に指定している値は NIC の Name プロパティです。 PS C:¥>Set-DHCPServerV4Binding -InterfaceAlias “vEthernet (ExternalSwitch)” -BindingState $True ③ DHCP サービスを Active Directory で承認する PS C:¥> Add-DHCPServerInDC -DnsName contoso.com ④ DHCP サービスに必要なセキュリティグループを作成する ※Netsh コマンドを使用します PS C:¥> Netsh dhcp add SecurityGroups 26
  27. 27. ⑤ DHCP サービスを再起動 PS C:¥> Restart-Service DHCPServer ⑥ もしサーバーマネージャー上に「DHCP サーバーの構成が必要です」が表示され続けるよ うであれば、以下のコマンドを実行してアラートをリセットする PS C:¥> Set-ItemProperty –Path registry::HKLM¥SOFTWARE¥Microsoft¥ServerManager¥Roles¥12 –Name ConfigurationState –Value 2 27
  28. 28. スコープを作成する ① IPV4 のスコープを追加 PS C:¥>Add-DHCPServerV4Scope -StartRange 192.168.0.10 -EndRange 192.168.0.20 -SubnetMask 255.255.255.0 -Name “Scope for VMs” -State Active ② 追加したスコープを表示し、Scope ID を確認する ※ この演習では 192.168.0.0 と設定されているはず PS C:¥>Get-DHCPServerV4Scope ③ 作成したスコープに DNS Server を追加する PS C:¥> Set-DhcpServerV4ScopeOptionValue -ScopeID 192.168.0.0 -DnsServer 192.168.0.1 28
  29. 29. 8. 仮想マシンの構成 ここでは既に OS がインストールされている仮想ハードディスクを使用して、新しいゲ ストOSを作成します ゲスト OS の作成 ① ゲストOSの一覧を取得する ※何も表示されません PS C:¥> Get-VM ② ゲストOS を作成する この例では VM01 という名前のゲストOSを作成します。仮想マシンの世代は「第一世代」 としています。また、仮想ハードディスクの保存先は D:¥VMs¥VM01.vhd です。 PS C:¥> New-VM -Name “VM01” -MemoryStartupBytes 1024MB -VHDPath D:¥VMs¥VM01.vhd -SwitchName “ExternalSwitch” -Generation 1 -BootDevice IDE 29
  30. 30. ③ 作成したゲストOS VM01 の設定値を確認する PS C:¥> Get-VM -Name VM01 | FL ④ 動的メモリを有効にし、仮想CPUの割り当て数を 2 に変更する PS C:¥> Set-VM -Name VM01 -ProcessorCount 2 -DynamicMemory ⑤ ゲストOSを起動する PS C:¥> Start-VM VM01 30
  31. 31. ゲスト OS の初期設定(この部分だけゲストOS側で実施します) この演習では、ゲスト OS として Sysprep が適用された Windows Server 2012 R2 を使用しています。 ※評価版ダウンロードサイトからダウンロードした「VHD」ファイル そのため、リモート(Hyper-V ホスト)からの管理を有効にするには、Hyper-V マネージャーからゲス ト OS 「VM01」に接続して、以下の操作を行う必要があります。 • • OOBE セットアップ • 言語の選択(規定値は英語です) • 利用許諾への合意 • パスワードの設定(言語で En-US を選択した場合、キーボード配列は 101/102 となります。ご 注意ください) パスワードとして P@ssw0rd を使用する場合、 101/102 キーボードの場合、「@」は [Shift] + [2] となります。 ゲストOSの PowerShell コンソールから以下を実行してリモーティングを有効化 PS C:¥> Enable-PSRemoting -Force • ゲストOS の PowerShell コンソールから ネットワーク探索を有効化 PS C:¥> netsh advfirewall firewall set rule group=”network discovery” new enable=yes 31
  32. 32. ゲスト OS の環境設定を行う ※この操作は Hyper-V ホスト側でおこないます ① ゲストOSをリモート管理するために、Hyper-V ホスト側の TrustedHosts の設定を行う PS C:¥> Set-Item WSMan:¥localhost¥Client¥TrustedHosts 192.168.0.* -Concatenate ② ゲストOSに接続するための資格情報を作成する ※ここではゲストOSのパスワードが P@ssw0rd であるとします PS C:¥> $User = “Administrator” PS C:¥> $Pass = ConvertTo-SecureString “P@ssw0rd” -AsPlainText -Force PS C:¥> $Cred = New-Object System.Management.Automation.PSCredential $user, $pass ③ ゲストOSにリースされているIPアドレスを確認する PS C:¥> Get-DhcpServerV4Lease -ScopeId 192.168.0.0 ④ 作成したクレデンシャルを使用して、ゲストOSに接続する ※ ゲストOS VM01 には、DHCPサーバーより 192.168.0.11 がリースされているものとします PS C:¥> Enter-PSSession 192.168.0.11 -Credential $Cred 32
  33. 33. ⑤ ゲストOS のネットワークアダプター情報を確認する (InterfaceIndex を確認してください) ※ゲストOSのセッションに接続したまま実行します [192.168.0.11] :PS C:¥> Get-NetAapter ⑥ ゲストOS のIPアドレスを確認する(InterfaceIndex = 12 としています) ※PrefixOrigin が DHCPであることを確認してください ※ゲストOSのセッションに接続したまま実行します [192.168.0.11] :PS C:¥> Get-NetIPAddress -InterfaceIndex 12 -AddressFamily IPv4 ⑦ ゲスト OS の IP アドレスを 192.168.0.100 に設定する ※ゲストOSのセッションに接続したまま実行します [192.168.0.11] :PS C:¥> New-NetIPAddress -InterfaceIndex 12 -IPAddress 192.168.0.100 -AddressFamily IPv4 -PrefixLength 24 このコマンドを実行すると ゲストOSのIPアドレス変更によってセッションが切断されます。 これは正しい動作です。自動的に再接続が試みられますが、[Ctrl]+[C] でキャンセルして ください。 33
  34. 34. ⑧ 再度ゲストOSに接続する PS C:¥> $User = “Administrator” PS C:¥> $Pass = ConvertTo-SecureString “P@ssw0rd” -AsPlainText -Force PS C:¥> $Cred = New-Object System.Management.Automation.PSCredential $user, $pass PS C:¥> Enter-PSSession 192.168.0.100 -Credential $Cred [192.168.0.100] :PS C:¥> ⑨ DNSサーバーの設定を行う ※ゲストOSのセッションに接続したまま実行します [192.168.0.100] PS C:¥>Set-DnsClientServerAddress -Interface 12 -ServerAddress 192.168.0.1 ⑩ コンピューター名を変更する ※ゲストOSのセッションに接続したまま実行します [192.168.0.100] :PS C:¥> Rename-Computer -NewName “HV01” -Force -Restart ⑪ セッションを閉じる [192.168.0.100] :PS C:¥> Exit PS C:¥> 34
  35. 35. ⑫ VM01 を DNS に登録する PS C:¥> Add-DnsServerResourceRecordA -Name VM01 -IPAddress 192.168.0.100 -ZoneName contoso.com ⑬ 再度ゲストOSに接続する PS C:¥> $User = “Administrator” PS C:¥> $Pass = ConvertTo-SecureString “P@ssw0rd” -AsPlainText -Force PS C:¥> $Cred = New-Object System.Management.Automation.PSCredential $user, $pass PS C:¥> Enter-PSSession 192.168.0.100 -Credential $Cred [192.168.0.100] :PS C:¥> 35
  36. 36. ⑫ VM01 を ドメインに参加させる ※ゲストOSのセッションに接続したまま実行します [192.168.0.100] :PS C:¥> $Domain = “contoso.com” [192.168.0.100] :PS C:¥> $Client = $Env:COMPUTERNAME [192.168.0.100] :PS C:¥> $User = “Administrator” [192.168.0.100] :PS C:¥> $Pass = ConvertTo-SecureString “P@ssw0rd” -AsPlainText -Force [192.168.0.100] :PS C:¥> $Cred = New-Object System.Management.Automation.PSCredential $user , $pass [192.168.0.100] :PS C:¥> $DomainUser = “Contoso¥Administrator” [192.168.0.100] :PS C:¥> $DomainPass = ConvertTo-SecureString “P@ssw0rd” -AsPlainText -Force [192.168.0.100] :PS C:¥> $DomainCred = New-Object System.Management.Automation.PSCredential $DomainUser , $DomainPass [192.168.0.100] :PS C:¥> Add-Computer -ComputerName $Clienit -LocalCredential $Cred -Credential $DomainCred -DomainName $Domain ⑬ セッションを閉じる [192.168.0.100] :PS C:¥> Exit PS C:¥> 36
  37. 37. ⑫ 仮想マシン VM01 を再起動する PS C:¥> Restart-VM VM01 -Force ⑬ 資格情報なしで VM01 に接続できることを確認する PS C:¥> Enter-PSSession VM01 [VM01]: PS C:¥> ⑭ セッションを閉じる [VM01]: PS C:¥> Exit PS C:¥> 37
  38. 38. 第2部 ライブマイグレーション このセクションでは、第1部で作成した環境に Hyper-V サーバーをもう1台加 え、ライブマイグレーションが行える環境を構築します。 もちろん、各種設定は Windows PowerShell のみで行います。 38
  39. 39. 以降の作業ではライブマイグレーションを行うため、Hyper-V がインストールされた2台目 の Windows Server が必要となります。ここでは、Hyper-V Server 2012 R2 を使用してい ます。 2台目の Windows Server 9. Hyper-V Server 2012 R2 のインストール 10. Windows PowerShell の基本設定  実行ポリシーの設定  リモーティング(リモート管理)の設定 11. Windows Server の基本設定  IP アドレスの設定  DNS の設定  コンピューター名の設定  Active Directory ドメインへの参加  Windows Update の実行 12. Hyper-V の構成  PowerShell モジュールのインストール  Hyper-V ホストの規定値を変更する • 仮想ハードディスクの保存先 • 仮想マシンの保存先  Hyper-V レプリカの有効化  仮想スイッチの作成 ライブマイグレーションの設定を実行 ※1台目のサーバー HV01 で実施 13. ライブマイグレーションの環境設定  ライブマイグレーションの有効化  仮想マシンの「プロセッサの互換性」の設定  委任の設定 14. ライブマイグレーションの実行 39
  40. 40. 9. Hyper-V Server 2012 R2 のインストール 2台目の PC を用意し、Hyper-V がインストールされた Windows Server 2012 R2 を用意してください。 ここでは Hyper-V Server 2012 R2 を使用します。 Hyper-V Server 2012 R2 をインストールすると自動的に Hyper-V もイ ンストールされます。 40
  41. 41. 10. Windows PowerShell の基本設定 Hype-V Server 2012 R2 では統合スクリプト環境(ISE)を使用することはできません。 スクリプト環境の起動 ① Hyper-V Server 2012 R2 にサインインする ② コマンドプロンプトで以下のコマンドを実行して PowerShell コンソールを起動する。プロン プトが 「PS」に変わったことを確認してください。 C:¥> PowerShell PS C:¥> 実行ポリシーの設定 ① 以下のコマンドレットを実行し、ローカルで作成したスクリプトは署名なしで実行できるよう に実行ポリシーを変更する PS C:¥>Set-ExecutionPolicy RemoteSigned リモーティングの有効化 ① 以下のコマンドレットを実行し、PowerShell によるリモート管理を有効にする PS C:¥>Enable-PSRemoting –force 41
  42. 42. 11. Hyper-V Server の基本設定 IP アドレスの設定 ① ネットワークアダプタの一覧を表示し、IPアドレスを設定するネットワークカードの InterfaceIndex を特定する PS C:¥> Get-NetAdapter | FT Name, InterfaceIndex, InterfaceDescription ② ターゲットとなるネットワークアダプターの情報を確認する(以下の例では InterfaceIndex = 13 としている) PS C:¥> Get-NetIPAddress -InterfaceIndex 13 -AddressFamily IPv4 ③ 既定では DHCP を利用するように設定されているので、以下のコマンドを使用して静的な IP アドレスを設定する PS C:¥>New-NetIPAddress -InterfaceIndex 13 -IPAddress 192.168.0.2 -AddressFamily IPv4 -PrefixLength 24 ※ DefaultGateway は必要に応じて ※ 既存の静的アドレスを変更する場合には Set-NetIPAddress を使用する 42
  43. 43. DNS の設定 ① DNS サーバーのアドレスを設定する PS C:¥>Set-DnsClientServerAddress -Interface 13 -ServerAddress 192.168.0.1 ※ 複数の DNS サーバーが存在する場合にはカンマで区切って指定する 参考 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 43
  44. 44. ローカルコンピューター名を設定する ① 現在のコンピューター名を取得する PS C:¥> $Env:ComputerName ② 新しいコンピューター名を設定し、再起動する PS C:¥> Rename-Computer -NewName “HV02” -Force -Restart ③ 再起動後サインインして、再度 PowerShell コンソールを起動する C:¥> PowerShell PS C:¥> 44
  45. 45. Hyper-V Server “HV02” を Contoso ドメインに参加させる ① ドメインに参加させる PS C:¥> $Domain = “contoso.com” PS C:¥> $Client = $Env:COMPUTERNAME PS C:¥> $User = “Administrator” PS C:¥> $Pass = ConvertTo-SecureString “P@ssw0rd” -AsPlainText -Force PS C:¥> $Cred = New-Object System.Management.Automation.PSCredential $user , $pass PS C:¥> $DomainUser = “Contoso¥Administrator” PS C:¥> $DomainPass = ConvertTo-SecureString “P@ssw0rd” -AsPlainText -Force PS C:¥> $DomainCred = New-Object System.Management.Automation.PSCredential $DomainUser , $DomainPass PS C:¥> Add-Computer -ComputerName $Clienit -LocalCredential $Cred -Credential $DomainCred -DomainName $Domain ② コンピューターを再起動する PS C:¥> Restert-Computer ③ 再起動後、ドメインアカウント(contoso¥administrator)でサインインしてください 45
  46. 46. Windows Update を実行する ① 以下のコマンドを実行して、Windows Update PowerShell Module をダウンロードする PS C:¥> $web = New-Object System.Net.WebClient PS C:¥> $zipfile = "http://gallery.technet.microsoft.com/scriptcenter/” PS C:¥> $zipfile = $zipfile + “2d191bcd-3308-4edd-9de2-88dff796b0bc/file/41459/28/PSWindowsUpdate.zip" PS C:¥> $web.DownloadFile($zipfile, "C:¥tmp¥PSWindowsUpdate.zip") 上記コマンドでダウンロードできない場合には、以下のサイトから Windows Update PowerShell Module の最新版をダウンロードしてください http://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc ※「Windows Update PowerShell Modules」で検索すればヒットします ② 以下のコマンドを使用して、ダウンロードした PSWindowsUpdate.zip ファイルを適当な場所に 展開する。ここでは C:¥tmp フォルダに展開しています。 PS C:¥> Add-Type -AssemblyName System.IO.Compression.FileSystem PS C:¥> $ZipFile = Get-Item C:¥tmp¥PSWindowsUpdate.zip PS C:¥> [IO.Compression.ZipFile]::ExtractToDirectory( $ZipFile, ‘C:¥tmp’ ) ③ Dir コマンドで、 PSWindowsUpdate フォルダが作成されていることを確認 46
  47. 47. ④ 以下のコマンドを実行し、フォルダの中に格納されているすべてのファイルの「ブロック 解除」を行う。この操作はファイルのプロパティ画面から「ブロックの解除」を行うのと 同様である。 PS C:¥>Unblock-File <ファイルの保存先>¥*.* (例) PS C:¥>Unblock-File c:¥tmp¥PSWindowsUpdate¥*.* ⑤ PowerShell モジュールの格納場所を確認する PS C:¥>$env:PSModulePath C:¥Users¥Administrator¥Documents¥WindowsPowerShell¥Modules;C:¥windows¥system32¥Wind owsPowerShell¥v1.0¥Modules¥;C:¥Program Files (x86)¥Microsoft SDKs¥Windows Azure¥PowerShell¥ ⑥ 既定では C:¥Users¥junichia¥Documents¥WindowsPowerShell¥Modules が存在しない ので、以下のコマンドで PowerShell モジュールの格納場所を作成する PS C:¥> md C:¥Users¥Administrator¥Documents¥WindowsPowerShell¥Modules 47
  48. 48. ⑦ 以下のコマンドを実行し PSWindowsUpdate フォルダーを C:¥Users¥Administrator¥Documents¥WindowsPowerShell¥Modules 配下に移動する 以下の例では PSWindowsUpdate フォルダーは C:¥tmp にあるものとしている PS C:¥> Move C:¥tmp¥PSWindowsUpdate C:¥Users¥Administrator¥Documents ¥WindowsPowerShell¥Modules ⑧ PSWindowsUpdate モジュールを読み込む PS C:¥> Import-Module PSWindowsUpdate ⑨ Windows Update を実行する PS C:¥> Get-WUInstall -AcceptAll 48
  49. 49. 12. Hyper-V の構成 Hyper-V Server には既にHyper-Vの役割がインストールされていますが、PowerShell 管理 用モジュールはインストールされていません。ここでは管理モジュールをインストールします。 Windows PowerShell 用 Hyper-V モジュールをインストールする ① 以下のコマンドで現在インストールされている役割と機能の一覧を参照する PS C:¥> Get-WindowsFeature ② 以下のコマンドを実行して、Windows PowerShell 用 Hyper-V モジュールをインストー ルする PS C:¥> Add-WindowsFeature Hyper-V-PowerShell -IncludeAllSubFeature ③ Hyper-V 関連のコマンドレットを確認する PS C:¥> Get-Command -Module Hyper-V 49
  50. 50. Hyper-V ホストの設定値を変更する ① Hyper-V ホストの規定値を確認する PS C:¥> Get-VMHost | FL ② 仮想ハードディスクの既定の保存先を設定する ※以下の例では仮想ハードディスクの既定の保存先を E:¥VM に指定しています PS C:¥> Set-VMHost -VirtualHardDiskPath E:¥VM ③ 仮想ハードディスクの構成ファイルの既定の保存先を設定する PS C:¥> Set-VMHost -VirtualMachinePath E:¥VM 50
  51. 51. Hyper-Vレプリカを有効にする ① Hyper-V レプリカの設定値を確認する PS C:¥> Get-VMReplicationServer | FL ② Hyper-V レプリカを有効にし、認証タイプを Kerberos にする PS C:¥> Set-VMReplicationServer -ReplicationEnabled $True -AllowedAuthenticationType Kerberos ③ どんなサーバーからの複製も受け入れ、複製の保存先を E:¥VM に設定する PS C:¥> Set-VMReplicationServer -ReplicationAllowedFromAnyServer $True -DefaultStorageLocation E:¥VM ④ Windows Firewall の受信規則を確認する PS C:¥> Get-NetFirewallRule -Direction Inbound 51
  52. 52. ⑤ Windows Firewall の受信規則の中から、Hyper-V レプリカに関する設定を確認する PS C:¥> Get-NetFirewallRule -Direction Inbound -Desctiption *レプリカ* ※ HTTP と HTTPS に関する規則が存在することがわかります ※ それぞれ、ルール名で保存されています HTTP : VIRT-HVRHHTTPL-In-TCP-NoScope HTTPS : VIRT-HVRHHTTPSL-In-TCP-NoScope ⑥ “Hyper-V レプリカ HTTP リスナー(TCP受信)”規則を有効にする PS C:¥> Set-NetFirewallRule -Name “VIRT-HVRHTTPL-In-TCP-NoScope” -Enabled True $ は必要ありません 52
  53. 53. 仮想スイッチの作成 ライブマイグレーションを実行するには、HV01と同じ名前の仮想スイッチを作成しておく必 要があります) ① ネットワークアダプターの一覧を表示し、外部仮想スイッチにバインドするネットワーク アダプターの Name 値を確認する PS C:¥> Get-NetAdapter | FL ② 新しい外部スイッチを “ExternalSwitch” という名前で作成する。以下の例ではバインド 先のネットワークアダプタ名は“イーサネット”として指定している。 PS C:¥> New-VMSwitch -Name “ExternalSwitch” -NetAdapterInterName “イーサネット” -AllowManagementOS $True ③ ②で確認したHyper-V ホストの NIC が仮想化され、“ExternalSwitch”に接続されたこと を確認する PS C:¥> Get-NetAdapter | FL ※ “vEthernet (ExternalSwitch)” という仮想NIC が新たに作成されたことを確認してく ださい 53
  54. 54. ⑤ 仮想スイッチ ExternalSwitch が作成されたことを確認する PS C:¥> Get-VMSwitch 54
  55. 55. 13.ライブマイグレーションの有効化と実行 ここまでの作業で以下のような環境が構築できました。 ここからは HV01 と HV02 間でライブマイグレーションを行うための設定をしていきます。 ここからの作業は HV01 上の PowerShell ISE から実行します。 Active Directory ドメイン Contoso.com 物理マシン 物理マシン Windows Server 2012 R2 Hyper-V Server 2012 R2 (GUI使用サーバー) HV01 192.168.0.1 • • • • Hyper-V AD DS DNS DHCP 仮想スイッチ ExternalSwitch 仮想マシン Windows Server 2012 R2 HV02 192.168.0.2 • Hyper-V VM01 192.168.0.3 仮想スイッチ ExternalSwitch 55
  56. 56. ここからの作業は HV01 上から実行します。 Hyper-V ホストのライブマイグレーションを有効にする ① HV01 と HV02 のライブマイグレーションを有効にする PS C:¥> Enable-VMMigration -ComputerName HV01, HV02 ② 任意のネットワークカードを使用してライブマイグレーションを受信できるようにする Set-VMHost -ComputerName HV01, HV02 -UseAnyNetworkForMigration $True ③ パフォーマンスオプションを「圧縮」モードに設定する Set-VMHost -ComputerName HV01, HV02 -VirtualMachineMigrationPerformanceOption Compression ④ ライブマイグレーションの認証プロトコルを「Kerberos」に設定する Set-VMHost -ComputerName HV01, HV02 -VirtualMachineMigrationAuthenticationType Kerberos 56
  57. 57. ⑤ 同時に移行できる仮想マシンの数を 10 に変更する PC C:¥> Set-VMHost -ComputerName HV01, HV02 -MaximumVirtualMachineMigrations 10 移行の対象となる仮想マシンの「プロセッサの互換性」を設定する ライブマイグレーションに使用する物理コンピューターが異なるプロセッサバージョンを搭載している場 合には、仮想マシンごとに「プロセッサバージョンが異なる物理コンピューターへ移行する」を有効にし て置く必要があります。 ① 仮想マシンをシャットダウンする PS C:¥> Stop-VM -ComputerName HV01 -Name VM01 ② HV01 上の VM01 の「プロセッサバージョンが異なる物理コンピューターへ移行する」を有効にする PS C:¥> Set-VMProcessor -ComputerName HV01 -VMName VM01 -CompatibilityForMigrationEnabled $True ③ 仮想マシンを起動する PS C:¥> Start-VM -ComputerName HV01 -Name VM01 57
  58. 58. Kerberos 委任の設定を行う 委任の設定は、ライブマイグレーションを行う全てのコンピューター間で行う必要がありま す。また、委任を許可する対象となるのは各コンピューターが持つ以下の 2 つのサービスで す。 • CIFS • Microsoft Virtual System Migration Service Hyper-V over SMB を使用している場合にはファイルサーバーの CIFS も委任の対象となる ことに注意してください。 今回は、HV01 と HV02 間での委任を許可するように設定します。 HV01 委任 HV02 CIFS CIFS Microsoft Virtual System Migration Service Microsoft Virtual System Migration Service 58
  59. 59. ① HV01 に HV02 CIFS サービスへの委任を許可する PS C:¥> $TargetServer = “HV01” PS C:¥> $TargetServerDN = (Get-ADComputer $TargetServer) PS C:¥> $HVServer = Get-ADComputer HV02 PS C:¥> $HVServerName = $HVServer.Name PS C:¥> $HVServerDNS = $HVServer.DNSHostName PS C:¥> Set-ADObject -Identity $TargetServerDN -Add @{ “msDS-AllowedToDelegateTo” = “cifs/$HVServerName”, “cifs/$HVServerDNS” } ② HV02 に HV01 CIFS サービスへの委任を許可する PS C:¥> $TargetServer = “HV02” PS C:¥> $TargetServerDN = (Get-ADComputer $TargetServer) PS C:¥> $HVServer = Get-ADComputer HV01 PS C:¥> $HVServerName = $HVServer.Name PS C:¥> $HVServerDNS = $HVServer.DNSHostName PS C:¥> Set-ADObject -Identity $TargetServerDN -Add @{ “msDS-AllowedToDelegateTo” = “cifs/$HVServerName”, “cifs/$HVServerDNS” } 59
  60. 60. ③ HV01 に HV02 Microsoft Virtual System Migration サービスへの委任を許可する PS C:¥> $ServiceName = “Microsoft Virtual System Migration Service” PS C:¥> $TargetServer = “HV01” PS C:¥> $TargetServerDN = (Get-ADComputer $TargetServer) PS C:¥> $HVServer = Get-ADComputer HV02 PS C:¥> $HVServerName = $HVServer.Name PS C:¥> $HVServerDNS = $HVServer.DNSHostName PS C:¥> Set-ADObject -Identity $TargetServerDN -Add @{ “msDS-AllowedToDelegateTo” = “$ServiceName/$HVServerName”, “$ServiceName/$HVServerDNS” } ④ HV02 に HV01 Microsoft Virtual System Migration サービスへの委任を許可する PS C:¥> $ServiceName = “Microsoft Virtual System Migration Service” PS C:¥> $TargetServer = “HV02” PS C:¥> $TargetServerDN = (Get-ADComputer $TargetServer) PS C:¥> $HVServer = Get-ADComputer HV01 PS C:¥> $HVServerName = $HVServer.Name PS C:¥> $HVServerDNS = $HVServer.DNSHostName PS C:¥> Set-ADObject -Identity $TargetServerDN -Add @{ “msDS-AllowedToDelegateTo” = “$ServiceName/$HVServerName”, “$ServiceName/$HVServerDNS” } 60
  61. 61. ⑤ HV02 を再起動する(再起動が完了するまで待ち合せる) ※委任の設定を適用するためにコンピューターを再起動する必要があります PS C:¥> Restart-Computer -ComputerName HV02 -Wait -Force ⑥ HV01 を再起動する ※HV02の再起動が完了してから実行してください。 PS C:¥> Restart-Computer -Force コンピューターアカウントに移行先となるストレージへのアクセス権を与える ※ライブマイグレーションはコンピューターアカウントによる処理であるため、移行先のス トレージ対してコンピューターアカウントによるフルアクセス権が必要です。 61
  62. 62. ライブマイグレーションを実行する 今回は共有ボリュームや共有フォルダを使用しない シェアード ナシング ライブ マイグ レーション を実行してみます。 ① 仮想マシン VM01 が HV01 上で動作していることを確認 PS C:¥> Get-VM -ComputerName HV01 ② 仮想マシン VM01 を HV02 に移動する ※HV02 上の E:¥VM¥VM01 に仮想ハードディスクごと移動するものとします PS C:¥> Move-VM -ComputerName HV01 -Name VM01 -DestinationHost HV02 -IncludeStorage -DestinationStoragePath E:¥VM¥VM01 統合スクリプト環境上で実行すると、画面上に移行のプログレスバーが表示されます。 ③ 仮想マシン VM01 が HV02 上で動作していることを確認する PS C:¥> Get-VM -ComputerName HV01 62
  63. 63. 第3部 エキスパートを目指す方へ ここからは、Hyper-V だけに特化した手法ではなく、Windows PowerShell の 基本的なテクニックから、バックグラウンドジョブ、ワークフローなどの高度な テクニックまでを解説します。 Visual Studioからの呼び出し方法についても解説しています。 63
  64. 64. 第3部 ~ PowerShell エキスパートを目指す方へ Windows PowerShell には他にもさまざまなテクニックが用意されています。特に、バック グラウンドジョブの概念はシステム管理を行う上で重要です。 Part1 基礎編 1.Windows PowerShell の位置づけ 2.基本的なコマンドレットと書式の基礎 3.基本的な文法とスクリプトの作り方 4.Tips Part4 ワークフロー編 11. 12. 13. 14. Windows PowerShell Workflow とは Windows PowerShell Workflow の基礎 ワークフロー特有の記述 ワークフロージョブとデータの永続化 Part2 リモーティング編 5.リモーティングの準備と基礎 6.-ComputerNameを使用したリモート操作 7.PS セッションとは 8.コネクションの永続化と再利用可能なPSセッション 9.Windows PowerShell Web Access(PSWA) Part3 バックグラウンドジョブ 10. バックグラウンドジョブ Part5 開発者編 15. 16. 17. 18. 開発者にとっての Windows PowerShell とは 開発者のための Windows PowerShell 基礎知識 開発者として必要な情報の取得 コマンドレット以外からオブジェクトのインスタン スを作成する 19. Visual Studio(C#)から PowerShell を呼び出す 64
  65. 65. Part 1 基礎編 65
  66. 66. 基礎編 1. Windows PowerShell の位置づけ 66
  67. 67. Windows PowerShell の位置づけ Windows Familiar – インフラエンジニアから見ると • Windows Script(WSH)に変わる管理プラットフォーム • 高機能なスクリプティング機能による自動管理 • WinRM を介したリモートサーバー管理 Windows Familiar – 開発者 から見ると • 高機能なクラスライブラリ • コーディング、テスティングの大幅なコスト削減 Non-Windows Familiar から見ると • OMI(Open Management Infrastructure)を実装したリモートサーバー • 手元のプラットフォームからリモート管理が可能 • 使い慣れた言語からリモート管理が可能 67
  68. 68. 代表的なスクリプト言語 バッチファイル(拡張子 .bat) OSに合わせて継続的なエンハンス MS-DOS時代から使われてきたコマンドシェル上のスクリプト。脈々と現代に引き継がれて おり、利用者が多い。豊富なコマンド群によって支えられており、案外使い出がある。複数 のスクリプトを取りまとめる役割としても便利。 Visual Basic のスクリプト版。「Visual」とあるが、Visual ではない。わかりやすい文法と、 緩い規則によって根強いファンが多い。亜種として VBA もあるが微妙に文法は異なる。 Jscript(拡張子 .js) 今後エンハンスの予定は無い JavaScript のMS 実装版として、VBScript とともに登場。JavaScript を Microsoft の独自 仕様によって拡張することで、汎用性を増している。 Windows Script 今後エンハンスの予定は無い VBScript(拡張子 .vbs) PowerShell(拡張子 .ps1) いわずと知れた高機能スクリプト言語。.NET Framework が使えると言うメリットから、利 用者は爆発的に増殖中。多くの製品がPowerShell用のコマンドレットを提供しており、 Windows Script Host は Server Coreのメニュー程度でしかお目にかかれなくなりつつある。 68
  69. 69. スクリプトの実行環境 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 69
  70. 70. コマンドシェルの進化と機能の包含 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 70
  71. 71. 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" 71
  72. 72. WBEM - Web Based Enterprise Management http://www.dmtf.org/standards/wbem マイクロソフトやインテル、シスコシステムズ、旧コンパック・コンピュータなどによって提案され、標準化 団体DMTF(Desktop Management Task Force)によって標準化された規格である。その名の通り、「Web ベー スのエンタープライズ管理」のための仕様であり、ネットワーク上に存在するサーバーや OS、ネットワーク 機器などの統合管理に必要なプロトコルやデータ構造を規定する。要するに、従来の SNMP(Simple Network Management Protocol)や syslog に代わる、HTTP と XML をベースとした新世代のネットワーク管理プロトコ ルである。すでにマイクロソフト Windows や HP-UX などのおもなOSをはじめ、サーバー製品、ストレージ製 品、ネットワーク機器、そしてHP OpenView をはじめとするネットワーク管理ツールにおいて、業界標準の ネットワーク管理プロトコルとしてサポートされている。 出典 http://h50146.www5.hp.com/products/software/oe/hpux/developer/column/smh_02/ 72
  73. 73. HP における WBEM の実装 出典 http://h50146.www5.hp.com/products/software/oe/hpux/developer/column/smh_02/ 73
  74. 74. Solaris における WBEM の実装 出典 http://docs.oracle.com/cd/E19455-01/8067119/6jg10nqef/index.html 74
  75. 75. Microsoft の 実装 75
  76. 76. History of Microsoft Management Framework 2000年 Windows 2000 に WMI をインプリメント – 29 WMI プロバイダを含む – 同時に Windows NT, 98, 95 用の WMI もダウンロード開始 (15 WMI プロバイダー) ※どちらかといえば ”プロバイダー” 提供ベンダー向けのテクノロジー ※ Windows ファミリ間の相互運用性に留まる WS-Management とは Web Services for Management のこと。Windows Server ではない。 2005年 WS-Management が DMTF へ提出、承認 2007年 Windows Server 2008 に WS-Management を実装(WinRM) • HTTP/S を介して他プラットフォームとの接続が可能に • Windows PowerShell で WinRM を介したリモートサーバー管理が標準手法 として取り込まれる 76
  77. 77. Windows Management Framework http://www.microsoft.com/downloads/ OS WMF 3.0 WMF 4.0 Windows 7 SP1 以降 SP1 以降 Windows Server 2008 SP2 以降 × Windows Server 2008 R2 SP1 以降 SP1 以降 Windows 8 標準 ○ Windows 8.1 ー 標準 Windows Server 2012 標準 ○ Windows Server 2012 R2 ー 標準 前提条件 • Windows PowerShell ISE がインストールされていること • Microsoft .NET Framework 4.0 がインストールされていること 77
  78. 78. Windows Management Framework IT Pro IT Developer Solution Developer Service Provider Windows Management Framework 開 発 誰が作るの? 標準化されたアクセス Windows PowerShell 標準化されたプロトコル WS-Management(WinRM) (Web Service for Management) 標準化された CIMOM、SMI-S オブジェクトモデル CPU 他の プラットフォーム http WS-Man CIMOM、 SMI-S Storage Network Devices SMI-S(Storage Management Initiative - Specification) 78
  79. 79. The Open Group Membership 2012/10/5 時点 Platinum - 5 • Capgemini Netherlands • Hewlett-Packard USA • IBM USA • Kingdee Software (China) Co. Ltd China • Oracle Corporation USA Gold – 44(抜粋) • Microsoft Corporation USA • NTT Data Corporation • ReGIS Inc. Silver – 256 (Japan のみ抜粋) • Asahi Techneion Co., Ltd • AXE, Inc. • eflow Inc. • Information-technology Promotion Agency, Japan • Japan Aerospace Exploration Agency (JAXA) • Mizuho Information and Research Institute, Inc. • Nissan Motor Co., Ltd. • Nomura Research Institute, Ltd. • Rococo Co Ltd • SIOS Technology, Inc. • Sony CSL • Symphony Ltd. Academic – 38 (Japan のみ抜粋) • Aoyama Gakuin University • Kyoto University • Nagoya University • The University of Tokyo Information Technology Center 79
  80. 80. Open Management Infrastructure(nanoWBEM) • オープンソース版 CIM Server • 軽量 250KB、C で開発されている Windows PowerShell、その他 WinRM Client WinRM Server WS-Management(WinRM) Providers : CIMOM,SMI-S CPU Storage Network Devices 各種言語 OMI Client OMI Server WS-Management(OMI) Providers : CIMOM,SMI-S CPU Storage Network Devices 80
  81. 81. 81
  82. 82. OMI サポート プラットフォーム • HP-UX 11i v2 and v3 (PA-RISC and IA64) • Sun Solaris 8 and 9 (SPARC) and Solaris 10 (SPARC and x86) • Red Hat Enterprise Linux 4 (x86/x64) and 5 (x86/x64) Server • Novell SUSE Linux Enterprise Server 9 (x86) and 10 SP1 (x86/x64) • IBM AIX v5.3 and v6.1 (POWER) • MacOS 10.5 (Intel) • Windows(限定的) 最新版は OMI Source - v.1.0.7a (2013年5月) 82
  83. 83. http://www.opengroup.org/ 83
  84. 84. マイクロソフト製品と Windows PowerShell の関係 • 製品ごとに専用の”コマンドレット”が用意されている • 多くの管理 GUI は裏でコマンドレットを呼んでいる • インフラ担当者に、各製品への”標準化されたアクセス方法”を提供する Active Directory 管理センター PowerShell コンソール System Center Virtual Machine Manager Active Directory PowerShell Module Hyper-V PowerShell Module Active Directory Hyper-V 84
  85. 85. Windows PowerShell ISE • Powershell_ise.exe • Windows PowerShell 専用エディタ • IntelliSense に対応 スクリプトエディタ スクリプト実行画面 コマンドレットを直接実行 英語圏の人たちは”アイス” と読むらしい コ マ ン ド レ ッ ト 検 索 85
  86. 86. 基礎編 2. 基本的なコマンドレットと書式の基礎 86
  87. 87. 事前準備 • コンソールの環境設定 • 簡易編集を有効に • エクスプローラー(フォルダー)の環境設定 • 「拡張子を表示しない」を無効に • 実行ポリシーの設定 ※オンプレミスの”署名無しスクリプト”を実行できるようにする PS C:¥>Set-ExecutionPolicy RemoteSigned • リモートからの操作を有効にする(リモーティングの有効化) PS C:¥>Enable-PSRemoting –force • 必要に応じて自分専用の初期設定ファイルを作成(規定では存在しない) PS C:¥>notepad $profile 87
  88. 88. 実行ポリシーの設定~ Set-ExecutionPolicy http://technet.microsoft.com/ja-jp/library/dd347628.aspx • • “管理者として実行” する必要がある 実行ポリシー – – – – – “ポリシーの設定”は、規定では Restricted:制限つき (オペレーターモード)(規定値) コンピューター全体に影響する。 • 対話形式のみ 適用範囲を制限するには、 • スクリプトは実行できない Scope も同時に定義する。 AllSigned:署名 • スクリプトは、信頼された発行元による署名が必要 RemoteSigned:リモートの署名 • “インターネットゾーン” のスクリプトは信頼された発行元による署名が必要 Unrestricted:無制限 • すべてのスクリプトを実行可能 • リモートのスクリプトについては常に警告 Bypass:バイパス • 何もブロックされず警告も表示されない 88
  89. 89. コマンドレットの構造 <操作>-<ターゲット> (例) 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 89
  90. 90. コマンドレットとモジュール • PowerShell の実行単位は「コマンドレット」 • コマンドレットはモジュール(Module)によって提供される • モジュールが読み込まれていないとコマンドレットを使用することは できない(Import-Module <モジュール名>) 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 例 90
  91. 91. モジュールに関するコマンドレット • 読み込まれているモジュール一覧の取得 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 91
  92. 92. コマンドレット情報を取得する • 使用可能なコマンドレット一覧を取得する 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 92
  93. 93. エイリアス コマンドレットにはエイリアスが用意されているものがある • 入力の簡易化 • DOSコマンドやLinux系シェルとの互換性 • エイリアスの一覧を取得する PS C:¥> Get-Alias 93
  94. 94. コマンドレットの戻り値 • コマンドレットの戻り値は“オブジェクト”である • PowerShell はオブジェクトを操作する言語 • 戻り値を「どのように操作できるか」を知っていることが重要 • オブジェクトには「メソッド」と「プロパティ」が用意されている 戻り値を直接、”操作”することが可能 Get-Service サービス一覧 stop() オブジェクト 94
  95. 95. もしも”オブジェクト”が自転車だったら... プロパティ メソッド 操作 プロパティ 色 メソッド ペダルをこいで前に進む サイズ ハンドルを右に切る 型 ハンドルを左に切る ブランド フロント ブレーキをかける パーツ リア ブレーキをかける 95
  96. 96. もしも”オブジェクト”が「Windows のサービス」だったら。。。 プロパティ メソッド DisplayName Stop() MachineName Start() Status DependentServices Windows サービス Pause() 96
  97. 97. メソッドとプロパティを調べるには • コマンドレットのメソッドとプロパティを表示 <コマンドレット> | 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 97
  98. 98. TIPS オブジェクトであるということは... PS C:¥>$a = “abc” #普通ならば $a は”文字列” になるけれど... #オブジェクトだからメソッドとプロパティが用意されている PS C:¥>$a.ToUpper() PS C:¥>ABC PS C:¥>$a.ToUpper().Split("B")[0] PS C:¥>A 98
  99. 99. コマンドからの出力もオブジェクト化される ipconfig の出力結果からIPアドレスを取りだす PS C:¥> (ipconfig)[18].Split(":")[1].Trim() object ipconfig の の18行目 出力結果 (0から数えて) コロンで分割した (0から数えて)2 つ目の値 前後の空白を トリミング IPv4 アドレス . . . . . . . . . . : 192.168.1.100 99
  100. 100. PSドライブ ファイルシステムだけではなく、さまざまなオブジェクトがドライブとしてアク セス可能(CD コマンドで移動可能) PS C:¥> Get-PSDrive           ファイルシステム エイリアス(Alias:) レジストリ(HKLM:、HKCU:) 証明書(Cert:) 環境変数(Env:) 変数(Variable:) WSMAN設定(Wsman:) Active Directory(AD:) IIS(IIS:) Remote Desktop Service(RDS:) モジュールが読み込まれて いないと使えないドライブ もある (例)ActiveDirectory 100
  101. 101. 基礎編 3. 基本的な文法とスクリプトの作り方 さまざまな使用例から使い方を学びましょう 101
  102. 102. 1. 2. 3. 4. 5. 6. 7. 8. 起動中のサービス一覧  パイプライン  Where-Object による条件指定 特定のサービスを停止する  () でオブジェクトを表現する ネットワーク情報を取得する  出力結果のフォーマット変換 ネットワークの設定を変更する ローカルコンピューター名を変更する  変数の宣言  変数の遅延展開  Array 値  ハッシュテーブル  環境変数 リモートからコンピューター名を変更する ※標準コマンドレット or WMI  クレデンシャルの使い方  WMI に必要なアクセス権 ドメインに参加させる ※標準コマンドレット or WMI 複数のコンピューターをドメインに参加させる  スクリプトの継続行  ファイルの入出力方法  ファイルのコード変換  CSV のヘッダー行について  繰り返し処理 9. イベントログを収集する  Select-Object により必要な要素のみを取り出す 10. イベントログをバックアップする 11. 独自のイベントログを登録する 12. 仮想マシンを作成して起動する  スクリプトの引数を定義する  名前付き引数 13. Hyper-V ライブマイグレーションを実行する 14. パフォーマンスログを取得する 15. 役割と機能をインストールする 16. 仮想ドメインコントローラを複製する 17. Hyper-V 仮想スイッチを作成する 18. リモートコンピューターから機能を一括で削除する 19. リモートコンピューターを一括でシャットダウンする 20. すべての Hyper-V ホストの仮想マシンを強制的にシャッ トダウンする 21. すべてのHyper-V ホストのライブマイグレーションを有効 化する 102
  103. 103. 1.起動中のサービス一覧を取得する object サービス一覧 パイプ PS C:¥>get-service | where-object {$_.Status -eq "Running"} サービス一覧 を出力 object まオ まブ 渡ジ さェ れク るト の サービス一覧 103
  104. 104. パイプラインについて コマンドレット1 コマンドレット2 結果 結果 オブジェクト 入力パラメタ コマンドレット3 入力パラメタ PS > Get-Service | Where-Object {$_.Status -EQ "Running"} | Select-Object -Property Name, Servicetype | Sort-Object -Property ServiceType PS > Get-Service | Where-Object Status -EQ "Running" | Select-Object Name, Servicetype | Sort-Object ServiceType V3ではこう書ける • • • • サービスの一覧を取得 Status が Running のみを抽出 Name プロパティとServiceType プロパティを抽出 ServiceType でソート 104
  105. 105. TIPS 条件を指定して結果を絞り込む Where-Object #サイズが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 105
  106. 106. TIPS PS 3.0 では書式を簡略化できます PS C:¥>get-service | where-object {$_.Status -eq "Running"} V3 ではこう書ける PS C:¥>get-service | where-object Status -eq "Running" 106
  107. 107. 2.特定のサービスを停止する PS C:¥>Stop-Service WSerarch メソッド PS C:¥>(Get-Service -Name WSearch).Stop() Windows Search サービスの インスタンスを取得 インスタンスに対して メソッドを実行 object Windows Search 107
  108. 108. TIPS()で括るとオブジェクトを表す #Dir の出力結果の最初の行から #Nameプロパティだけを取り出す (dir)[0].Name #変数を使用すると以下のように書き換えられる $D = Dir $D[0].Name 108
  109. 109. 3.ネットワーク情報を取得する ネットワークアダプタの一覧 Format-List の略 PS C:¥> Get-NetAdapter | FL Name, InterfaceIndex, MacAddress IP アドレスの取得 PS C:¥> Get-NetIPAddress -InterfaceIndex 28 -AddressFamily IPv4 109
  110. 110. TIPS 出力結果のフォーマットを変換 dir | format-table Name,Length dir | format-list Name,Length dir | format-wide Name -column 6 dir | out-gridview 110
  111. 111. 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 111
  112. 112. 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 112
  113. 113. TIPS 変数を使うには $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 出力結果 113
  114. 114. TIPS 変数の宣言について 通常は自動判別 PS > $A = 1 PS > $B = “1” PS > $A + $B 2 PS > $B + $A 11 PS > $A = “abc” PS > $A + $B abc1 System.Int32 System.String 先にある System.Int32 に自動変換 自動変換できない値で あればエラーとなる 先にあるSystem.String に自動変換 System.String で置き換えが可能 114
  115. 115. 明示的に宣言することも可能 PS > [System.Int32] $A = 1 PS > [System.String] $B = “abc” PS > [System.Array] $C = “今年は”, 2012, “年です” 0: 今年は 1: 2012 2: 年です [System.String] [System.Int32] [System.String] PS > $A = 987.654 PS > $A Int32 にキャストされる 988 明に宣言すると自動変換はできない PS > $A = “Hello” Cannot convert value "Hello" to type "System.Int32“ PS > [System.String] $A = “Hello” 115
  116. 116. 変数を削除する PS > [System.Int32] $A = 1 PS > Remove-Variable A 自分で作成した変数を全て削除 ※削除できないものについてエラーが出る PS > Get-Variable | Remove-Variable 116
  117. 117. TIPS 変数の展開について PS >$FirstName = "Junichi" PS >$LastName = "Anno" PS >$FullName = “$FirstName $LastName” PS >Write-Output $FullName Junichi Anno PS >$FullName = ‘$FirstName $LastName’ PS >Write-Output $FullName $FirstName $LastName ダブルクオーテーションで 括った場合は変数は展開さ れる シングルクオーテーション で括った場合には変数は展 開されない 117
  118. 118. TIPS 変数の遅延展開 通常 PS > $Name = “Junichi” PS > $Message = “Hello $Name” PS > $Message Hello Junichi この時点で変数は展開される 遅延展開 PS > $Name = “Junichi” {} で括ると変数は展開されない PS > $Message = { “Hello $Name” } $Message を定義した後で $Name に値を入れているこ PS > $Name = “Taro” とに注意 PS > $Message Hello $Name PS > & $Message Echo の代わりに & を使用 Hello Taro 118
  119. 119. 遅延展開を利用して関数として定義 PS > $Message = { Param( $Name ) “Hello $Name” } PS > & $Message Junichi Hello Junichi 119
  120. 120. TIPS Array 値 Array の作り方 空のアレイを作成(あえてしなくてもよい) PS > $Users = @() PS > $Users = “Junichi”, ”Naoko”, “Kazunori” PS > $Users.Count 3 PS > $Users Junichi Naoko Kazunori PS > $Users += “Maki” 値を追加 数値を追加 PS > $Users += 512 {}で括っているので遅延展開変数 PS > $a = { [system.math]::Pow( 2, $N ) } PS > $Users += $a 遅延展開変数を追加 120
  121. 121. Array 値の参照 PS > $Users[3] Maki 配列の一番最後 PS > $Users[-1] PS > $N = 6 遅延展開変数の入った行を参照 PS > & $Users[5] 64 $users から値を取りだし PS > Foreach ($u in $Users) { New-ADUser -Name $u } ながらユーザーを作成 PS > $Users[2..4] 配列の2番から4番を取りだす kazunori と一致するものがあるかどうかを検査 PS > ($Users -eq “Kazunori”).Count Kazunori 以外のものを抽出 PS > $Users -ne “Kazunori” M が含まれる行を抽出 PS > $Users -like “*M*” 121
  122. 122. PS > $arrINT = 1,2,3,4,5,6,7,8,9 PS > $arrINT -ge 5 2つの配列を合成 PS > $Users += $arrINT 2つの配列を合成 PS > $Users | Sort-Object $_ 昇順に並べ替えて出力 PS > $Users = $Users -ne “Kazunori” Kazunori を削除 PS > [System.Array]::Reverse($Users) Users の中の並び順を逆にする 122
  123. 123. 空白を文字列で埋める(PadLeft / PadRight) ## $N[] に、001 ~ 100 の文字列を格納する PS > $N = @() PS > 001..100 | % { $N += ("$_").Padleft(3,"0")} PS > User$N 001 002 ・ 100 PS > $VMs = $N | % {echo VM$_} PS > $VMs VM001 VM002 ・ VM100 123
  124. 124. TIPS HashTable HashTable の作り方 PS > $Users = @{} 注意 Array は () PS > $Users.0001 = “Junichi” キー 1 に 値 Junichi を登録 PS > $Users.”0001” = “Junichi” キー 0001 に 値 Junichi を登録 PS > $Users.Add( “0001”, “Junichi” ) PS > $Users.Remove(“0001”) キー 0001 の行を削除 124
  125. 125. CSV ファイルから値を読み込んでHashTable を作成 PS > $USDJPY = Import-CSV -Path C:¥tools¥USDJPY.csv –Encoding Default PS > $HT = @{} PS > While ( $i -lt $USDJPY.Count ) {$HT.Add( $USDJPY.日付[ $i ], $USDJPY.終値 [ $i ] ) ; $i++ } PS > $HT.”2012/2/10” 77.65 125
  126. 126. TIPS 環境変数の取得 #環境変数の一覧を取得 cd env: dir #特定の環境変数を取得 $env:computername $env:username $env:userdomain $env:SessionName 126
  127. 127. 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 127
  128. 128. 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 128
  129. 129. TIPS クレデンシャルの作成 その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 129
  130. 130. TIPS WMI Tester http://technet.microsoft.com/en-us/library/cc782719(v=ws.10) • WMI への接続性をテストするツール • リモートコンピューターへの接続も テストできる 130
  131. 131. TIPS 非ドメインメンバーから WMI接続 が拒否される原因と対処 代表的なエラー番号 • 0x800706ba • 0x80041003 • 0x80070005 代表的な原因 • Firewall の設定 • アクセス権 131
  132. 132. 必要なアクセス権 • Distributed COM Users メンバーである こと • (規定では)システム管理者であること ※wmimgmt.msc で変更可能 132
  133. 133. 必要な Firewall の設定 • Windows Management Instrumentation のルール 133
  134. 134. 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 134
  135. 135. 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: コンピューターアカウントの作成 135
  136. 136. 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" $Admin = "tf¥administrator" tfwin8-01,192.168.205.101,経理部 $Pass = "P@ssword" tfwin8-02,192.168.205.102,営業部 # いったん、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 } 136
  137. 137. TIPS 行継続 アクサン グラーブ記号 (`) を使用する copy-item C:¥tmp¥*.txt ` -destination C:¥ こ い つ 137
  138. 138. TIPS 入出力方法 これを抑えておけば、ひとまずたいていのことはできます #標準出力 Write-Output “Hello” #ファイルから入力 Echo “Hello” $file = Get-Content -Path c:¥tmp¥list.txt $file = type c:¥tmp¥list.txt #標準入力 $InputData = Read-Host #CSVファイルから入力 $file = Import-CSV -Path c:¥test.csv #ファイルに出力 Out-File -filepath C:¥tmp¥list.txt -inputobject $Record 138
  139. 139. TIPS 出力方法の違い 空白で区切られる PS C:¥> 1 + 2 + 3 6 PS C:¥> “1” + “2” + “3” 123 PS C:¥> Windows PowerShell <エラー> ※ Echo は Write-Output のAlias PS C:¥> Write-Output 1 + 2 + 3 1 + 2 + 3 PS C:¥> Echo Windows PowerShell Windows PowerShell PS C:¥> Echo “Windows PowerShell” Windows PowerShell 139
  140. 140. TIPS ファイルのコード変換 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 140
  141. 141. TIPS 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 141
  142. 142. TIPS Out-GridView を使用して出力結果をながめる 入力したグリッド形式データを参照するための EXCEL VIEWER 的ツール Import-CSV -Path $File | Out-GridView 142
  143. 143. TIPS 繰り返し処理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 } 143
  144. 144. TIPS 繰り返し処理2 #1から10までを出力 1..10 #1から10 をリダイレクトして出力 1..10 | % {echo $_ } #User1 から User10 を作成 1..10 | % {New-ADUser “User$_” } ※ % は foreach のエイリアス 144
  145. 145. TIPS 繰り返し処理3 $i = 0 do { } Write-Host $i $i++ while ($i -lt 10) $i = 0 do { } Write-Host $i $i++ until ($i -ge 10) 145
  146. 146. 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 “*ログオン*” 146
  147. 147. イベントログを集計する 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 147
  148. 148. TIPS Select-Object で必要な要素のみを取りだす 結果から必要な要素だけを抜き出して処理する パイプの後ろで使用することをお勧め(なんかおかしい...) PS C:¥> $Data = Dir × PS C:¥> Select-Object -InputObject $Data -Property Name ○ PS C:¥> $Data | Select-Object -Property Name 重複データを除く $data |Select-Object -Unique -Property Name 最後の10個だけ取得 $data | Select-Object -Last 10 最初の5個だけ取得 $data | Select-Object -First 5 148
  149. 149. 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) 149
  150. 150. 11.独自のイベントログを登録する ログファイル名 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 ダァ!" 150
  151. 151. 12. 仮想マシンを作成して起動する PS C:¥> .¥CreateVirtualMachine.ps1 -VMName “VM01" -Mem 1024mb CreateVirtualMachine.ps1 1 param([string] $VMName = "NA", [int] $CPU = 1, [int] $Mem = 10MB) 2 echo -InputObject $VMName, $CPU, $Mem 3 $SwitchName = "Intel(R) 82579LM Gigabit Network Connection - Virtual Switch" 4 New-VM -BootDevice CD ` 5 -MemoryStartupBytes $Mem ` 6 -Name $VMName ` 7 -SwitchName $SwitchName ` 8 -VHDPath ¥¥junichia-vdi¥$VMName¥$VMName.vhdx 9 Set-VM -ProcessorCount $CPU -DynamicMemory -Name $VMName 10 Add-VMNetworkAdapter -VMName $VMName -SwitchName $SwitchName 11 Start-VM -Name $VMName 151
  152. 152. TIPS 引数を受け取る 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 . 152
  153. 153. TIPS 名前付き引数の使い方 引数を所定の名前の変数に格納することで、文法チェック等が行いやすくなる C:¥> hogehoge.ps1 -userid anno param([string] $UserID = “ID", [string] $Password =“PASS") Write-Output $userid Write-Output $Password 規定値 anno PASS 出力結果 153
  154. 154. 13. Hyper-V ライブマイグレーション メモリ内データ Guest Host01 構成情報 Guest Host01 ¥¥Server¥Share¥xxx.vhdx $Source の中の VM で始ま るゲストOSを検索している $Source = “HostSV01” $Dist = “HostSV02” $VMs = get-vm -ComputerName $Source -Name VM* foreach ($VMName in $VMs.Name) { Move-VM -ComputerName $Source -Name $VMName -DestinationHost $Dist } 154
  155. 155. 14. パフォーマンスログを取得する プロセッサー(コア単位)の利用率を1秒に1回取得して表示する 1 2 3 4 5 6 7 8 9 10 11 Do { $perf =Get-WmiObject -Class win32_perfformatteddata_perfos_processor ` -Property PercentProcessorTime 目的のパフォーマンスカウン foreach ($p in $perf) { タ(今回はCPU使用率)が含ま $outrec = "Processor" + $i + ":" + $p.PercentProcessorTime れているWMIクラスを指定する echo $outrec } 1秒スリープ Start-Sleep -Seconds 1 cls 画面をクリア } while (-1) 155
  156. 156. TIPS パフォーマンスカウンターの調査方法 パフォーマンスカウンタークラスの一覧を取得するには 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 156
  157. 157. 15. 役割と機能をインストールする 役割/機能の一覧を取得する C:¥> Get-WindowsFeature C:¥> Get-WindowsFeature |Select-Object Name 157
  158. 158. ServerCore にすべての GUI をインストールする(フルインストール) PS C:¥> Add-WindowsFeature -Name User-Interfaces-Infra -IncludeAllSubFeature -IncludeManagementTools ServerCore に管理ツールだけをインストールする(MinShell) PS C:¥> Add-WindowsFeature –Name Server-gui-mgmt-infra -IncludeManagementTools 158
  159. 159. (参考)Windows Server 2012 GUI オプション Server Core MinShell Server W/GUI Desktop Experience コマンドプロンプト Available Available Available Available Windows PowerShell サーバーマネージャー Available Available Available Available Not Available Available Available Available MMC コントロールパネル Not Available Available Available Available Not Available Not Available Available Available コントロールパネル内 のアプレット Not Available Some Available Available Available Windows Explorer タスクバー Not Available Not Available Available Available Not Available Not Available Available Available 通知エリア Not Available Not Available Available Available Internet Explorer ヘルプ Not Available Not Available Available Available Not Available Not Available Available Available テーマ Not Available Not Available Not Available Available スタートスクリーン Not Available Not Available Not Available Available WinRTアプリ Not Available Not Available Not Available Available メディアプレーヤー Not Available Not Available Not Available Available 159
  160. 160. ServerManager モジュールでサポートされている コマンドレット PS C:¥> Import-Module ServerManager PS C:¥> Get-Command -Module ServerManager Alias Alias Function Function Cmdlet Cmdlet Cmdlet Add-WindowsFeature Remove-WindowsFeature Disable-ServerManagerStandardUserRemoting Enable-ServerManagerStandardUserRemoting Get-WindowsFeature Install-WindowsFeature Uninstall-WindowsFeature servermanager servermanager servermanager servermanager servermanager servermanager servermanager 160
  161. 161. 16. DC を複製する Windows Server 2012 以降では、仮想化されたドメインコントローラーを複製して展 開することがでる。 (条件) • 複製元はPDCエミュレーターであってはならない • 複製元は Clonable Domain Controllers グループのメンバーでなくてはならない • Hyper-V ホストは Windows Server 2012 • DCは Windows Server 2012 DC01 (pdc) DC02 Hyper-V ホスト Hyper-V ホスト Export VHD Import DC03 Hyper-V ホスト 161
  162. 162. $SourceDC = "DC02" $DistDC = "DC03" $distPDCEmu = DC01" $HyperVHost = “ITCAMP-TMP" PDCエミュレーターを複製元となるDC以外に移動 Move-ADDirectoryServerOperationMasterRole -Identity $distPDCEmu -OperationMasterRole PDCEmulator Get-ADComputer $SourceDC | %{Add-ADGroupMember -Identity "Cloneable Domain Controllers" -Members $_.samAccountName} 複製元DCをClonable Domain Controllers グループのメンバーにする Invoke-Command -ComputerName $SourceDC -ScriptBlock { Get-ADDCCloningExcludedApplicationList -GenerateXml -Force } $SB = "New-ADDCCloneConfigFile -Static ` 新しいドメインコンローラーの -IPv4Address ""192.168.210.51"" ` 構成ファイルを作成 -IPv4DNSResolver ""192.168.210.50"" ` -IPv4SubnetMask ""255.255.255.0"" ` -IPv4DefaultGateway ""192.168.210.254"" ` -CloneComputerName " + $DistDC + ` " -SiteName ""Default-First-Site-Name""" Invoke-Command -ComputerName $SourceDC -ScriptBlock { $SB } Stop-VM $SourceDC 複製元DCをシャットダウン 162
  163. 163. つづき Get-VM $SourceDC | %{ Export-VM $_ -Path C:¥VMs} 複製元DCをエクスポート Start-VM -Name $SourceDC 複製元DCを起動 エクスポートした仮想マシンをインポート $CFG = (Dir “C:¥VMs¥$SourceDC¥Virtual Machines¥*.xml”).FullName md E:¥$DistDC Import-VM -Path "$CFG" -ComputerName $HyperVHost -GenerateNewId -Copy -VhdDestinationPath E:¥$DistDC VMの名前が複製元と同じになってしまうので、変更する。ここでは同じHyper-Vホストを使用して いるので、OffになっているほうのDCを変名している。 Get-VM $SourceDC |Where-Object {$_.State -EQ "Off"} | Rename-VM -NewName $DistDC 複製先を起動。起動後自動的にDC間複製が始まる。 Start-VM $DistDC 163
  164. 164. 17. 仮想スイッチを作成する $PCName = "itcamp-pc01" Invoke-Command -ComputerName $PCName -ScriptBlock {New-VMSwitch -Name "External" ` -AllowManagementOS $True -NetAdapterInterfaceDescription "Intel(R) 82579LM Gigabit Network Connection"} New-VMSwitch -ComputerName $PCName -Name "WS2012Labs-Public" -SwitchType Private New-VMSwitch -ComputerName $PCName -Name "WS2012Labs-CorpNet" -SwitchType Private New-VMSwitch -ComputerName $PCName -Name "WS2012Labs-Storage" -SwitchType Private New-VMSwitch -ComputerName $PCName -Name "WS2012Labs-Internet" -SwitchType Private New-VMSwitch -ComputerName $PCName -Name "WS2012Labs-HA" -SwitchType Private 164
  165. 165. 18. リモートコンピューターから機能を一括で削除する ワークフローを使用してリモートコンピューターからフェールオーバークラス タリングを削除する Workflow RemoveFOCsWF { $PCs = Import-Csv -Path pclist.txt -Header "PC","IP" itcamp-pc01,192.168.210.1 itcamp-pc02,192.168.210.2 itcamp-pc03,192.168.210.3 itcamp-pc04,192.168.210.4 itcamp-pc05,192.168.210.5 itcamp-pc06,192.168.210.6 ・ ・ foreach -Parallel ($pc in $PCs) { Write-Output -InputObject $pc.pc Remove-WindowsFeature -ComputerName $pc.pc Failover-Clustering -IncludeManagementTools Restart } } RemoveFOCsWF 165
  166. 166. 19. リモートコンピューターを一括でシャットダウンする Workflow RestartAllPCsWF { $PCs = Import-Csv -Path pclist.txt -Header "PC","IP" foreach -Parallel ($pc in $PCs) { Write-Output -InputObject $pc.pc ##Restart-Computer -PSComputerName $pc.PC -Force Stop-Computer -PSComputerName $pc.PC -Force } itcamp-pc01,192.168.210.1 itcamp-pc02,192.168.210.2 itcamp-pc03,192.168.210.3 itcamp-pc04,192.168.210.4 itcamp-pc05,192.168.210.5 itcamp-pc06,192.168.210.6 ・ ・ } RestartAllPCsWF 166
  167. 167. 20. すべての Hyper-V ホストの仮想マシンを強制的にシャットダウン ワークフローを使用して一斉にシャットダウン Workflow StopAllVMs { $PCs = Import-Csv -Path pclist.txt -Header "PC","IP" foreach -Parallel ($pc in $PCs){ ##Get-VM -ComputerName $pc.pc |Start-VM Get-VM -ComputerName $pc.pc |Stop-VM -Force } itcamp-pc01,192.168.210.1 itcamp-pc02,192.168.210.2 itcamp-pc03,192.168.210.3 itcamp-pc04,192.168.210.4 itcamp-pc05,192.168.210.5 itcamp-pc06,192.168.210.6 ・ ・ } 167
  168. 168. 21. すべての Hyper-V ホストのマイグレーション設定を有効化 Workflow DisableMigrationWF { $PCs = Import-Csv -Path c:¥tools¥ps¥HOLSetup¥pclist.txt -Header "PC","IP" foreach -Parallel ($pc in $PCs) { itcamp-pc01,192.168.210.1 itcamp-pc02,192.168.210.2 itcamp-pc03,192.168.210.3 itcamp-pc04,192.168.210.4 itcamp-pc05,192.168.210.5 itcamp-pc06,192.168.210.6 ・ ・ ##Disable-VMMigration -ComputerName $pc.pc ##Set-VMHost -ComputerName $pc.pc -VirtualMachineMigrationAuthenticationType CredSSP ` -MaximumVirtualMachineMigrations 2 -UseAnyNetworkForMigration $true Enable-VMMigration -ComputerName $pc.pc Set-VMHost -ComputerName $pc.pc -VirtualMachineMigrationAuthenticationType Kerberos ` -MaximumVirtualMachineMigrations 2 -UseAnyNetworkForMigration $True } } DisableMigrationWF 168
  169. 169. 基礎編 5. その他の Tips その他、知っていると便利な使用法について 169
  170. 170. True と False の指定 $True と $False は予約語である C:¥> $MyNameIsJunichi = $True C:¥> If ($MyNameIsJunichi -eq $True) {Echo 1} 1 170
  171. 171. 日時を取得(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 171
  172. 172. unix のあのコマンダ

×