Operations Lab.

Archive for the ‘Windows Client’ Category

Windows 10 with Hyper-V で NAT を使用する

leave a comment »

※ このポストで取り扱っている NAT は、内部ネットワークから外部へ通信を行う際の Source NAT(SNAT)です。実際はポート変換も実行されるため、SNAPT (Source Network Address/Port Translation)になります。

Windows 10 Anniversary Update (Version 1607)で、Hyper-V 上の仮想マシンが外部へ通信する際に NAT を行うことが(標準の機能のみで)できるようになりました。

いままでは

Hyper-V の機能、または仮想スイッチの機能としては NAT を行うことができなかったため、仮想マシンが外部と通信を行う場合は、以下何れかの方法で外部通信を実現していました。

  • 外部(External)仮想スイッチで直接外部に接続する
  • Hyper-V ホストで、「インターネット接続共有」(クライアント OS の場合)または「ルーティングとリモートアクセス」の役割(サーバー OS の場合)を構成する
  • (NAT 用の VM を作成して、NAT を適用する)
    ※この方法は、結局他の方法で NAT VM を外部接続させる必要があります。

ノート PC などで、Hyper-V ホストの外部インターネットアクセスが無線 LAN アダプターとなっているような環境では、External スイッチへ VM を直接接続しても正しく通信が行えない(※)ため、ホスト側で「インターネット接続共有」を有効化して使用していた方も多いと思います。

※ External 仮想スイッチの場合、VM の MAC アドレスは変換されない(VM の仮想 NIC に付与された MAC アドレスで通信を行う)ため、無線アクセスポイントとの通信が正しく行えません。

今回の機能(Hyper-V 仮想スイッチでの NAT)により、無線 LAN 環境下であっても、インターネット接続共有や RRAS を使用せず外部へ通信できるようになります。

利用するには

Hyper-V の機能が有効化された Windows 10 Build 14295 が必要です。Windows 10 Anniversary Update は Build 10393 なので利用することができます。Windows Server 2016 でも(リリースされれば)利用できると思われます。(サーバー OS に無線 LAN アダプターを接続する人は少ないと思いますので、直接的な恩恵は少ないと思いますが。)

注:後述の通り、NAT スイッチには制限があるため、サーバー(システム)環境で多数のセグメントを収容し、NAT を行いたい場合は、今まで通り RRAS を使うか NAT 用の VM (仮想アプライアンス)を使用したほうが良いと思います。

設定方法

以下の流れで設定します。

  1. Hyper-V ホスト側に外部通信可能なインタフェースを用意し、IP アドレスを設定する(ホストが外部通信できる状態にする)
  2. 「内部」の(Internal タイプの)仮想スイッチを作成する
  3. ホスト OS 上に作成された(Internal 仮想スイッチに接続された)仮想 NIC (vEthernet)に IP アドレスを設定する
  4. (仮想 NIC に設定した IP アドレスをレンジに含む)NAT ネットワークを設定する

ホスト側の外部通信可能なインタフェース

これは、通常通りホスト上で IP アドレスをアサインし、ホストが外部通信可能であれば OK です。外部通信用の NIC を仮想スイッチにバインドする必要はありません。

Internel vSwitch の作成

Hyper-V マネージャーまたは PowerShell で仮想スイッチを作成します。このとき、SwitchType に Internal (内部)を指定します。

※ PowerShell で作業を行う場合は「管理者として実行」します。(以下同様)

下記の例では、「Internal」という名前の内部(Internal タイプの)仮想スイッチを作成しています。(名前は他の仮想スイッチと重複しなければ何でも OK 。)

PS C:\> New-VMSwitch -Name Internal -SwitchType Internal

Name      SwitchType NetAdapterInterfaceDescription
----      ---------- ------------------------------
Internal  Internal

PS C:\> Get-VMSwitch -Name Internal | fl *

Name                                : Internal
Id                                  : c51a5bd2-c53c-48f0-af9d-742f477fbfec
Notes                               :
Extensions                          : {Microsoft Windows フィルタリング プラットフォーム, Microsoft NDIS キャプチャ}
BandwidthReservationMode            : Absolute
PacketDirectEnabled                 : False
EmbeddedTeamingEnabled              : False
IovEnabled                          : False
SwitchType                          : Internal
AllowManagementOS                   : True
NetAdapterInterfaceDescription      :
NetAdapterInterfaceDescriptions     :
IovSupport                          : False
IovSupportReasons                   :
AvailableIPSecSA                    : 0
NumberIPSecSAAllocated              : 0
AvailableVMQueues                   : 0
NumberVmqAllocated                  : 0
IovQueuePairCount                   : 0
IovQueuePairsInUse                  : 0
IovVirtualFunctionCount             : 0
IovVirtualFunctionsInUse            : 0
PacketDirectInUse                   : False
DefaultQueueVrssEnabledRequested    : True
DefaultQueueVrssEnabled             : False
DefaultQueueVmmqEnabledRequested    : False
DefaultQueueVmmqEnabled             : False
DefaultQueueVmmqQueuePairsRequested : 16
DefaultQueueVmmqQueuePairs          : 0
BandwidthPercentage                 : 0
DefaultFlowMinimumBandwidthAbsolute : 0
DefaultFlowMinimumBandwidthWeight   : 0
CimSession                          : CimSession: .
ComputerName                        : TAKAI02
IsDeleted                           : False

PS C:\>

Internal vSwitch のホスト側仮想インタフェース(vEthernet)に IP を設定

コントロールパネル(ネットワーク接続)または PowerShell で、ホスト側に作成された仮想 NIC に IP アドレスを設定します。ここで指定した IP アドレスが、VM から見た時の GW アドレスになります。

※ 上記ホスト側仮想 NIC にはデフォルトゲートウェイを設定する必要はありません。

下記の例では、192.168.137.1/24 をホスト側の仮想 NIC へアサインしています。(192.168.137.0/24 はインターネット接続共有で使用される IP アドレスレンジなので、競合する場合は他のレンジを使用したほうが良いでしょう。)

PS C:\> Get-NetAdapter | ft Name,ifIndex,InterfaceDescription,Status

Name                       ifIndex InterfaceDescription                     Status
----                       ------- --------------------                     ------
Bluetooth ネットワーク接続      20 Bluetooth Device (Personal Area Network) Disconnected
vEthernet (Internal)            12 Hyper-V Virtual Ethernet Adapter         Up
Wi-Fi                            3 Intel(R) Dual Band Wireless-AC 7260      Up

PS C:\> New-NetIPAddress -InterfaceIndex 12 -AddressFamily IPv4 -IPAddress 192.168.137.1 -PrefixLength 24

IPAddress         : 192.168.137.1
InterfaceIndex    : 12
InterfaceAlias    : vEthernet (Internal)
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Tentative
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : ActiveStore

IPAddress         : 192.168.137.1
InterfaceIndex    : 12
InterfaceAlias    : vEthernet (Internal)
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Invalid
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : PersistentStore

PS C:\> Get-NetIPAddress -InterfaceIndex 12

IPAddress         : fe80::103e:d542:892c:f48c%12
InterfaceIndex    : 12
InterfaceAlias    : vEthernet (Internal)
AddressFamily     : IPv6
Type              : Unicast
PrefixLength      : 64
PrefixOrigin      : WellKnown
SuffixOrigin      : Link
AddressState      : Preferred
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : ActiveStore

IPAddress         : 192.168.137.1
InterfaceIndex    : 12
InterfaceAlias    : vEthernet (Internal)
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Preferred
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : ActiveStore

PS C:\>

NAT ネットワークの設定

ホスト側で PowerShell を使用し、NAT ネットワークを作成します。New-NetNat コマンドに Name (ネットワーク識別名)と InternalIPInterfaceAddressPrefix (NAT 対象となるネットワークプレフィックス)を指定するだけです。

下記の例では、「VMNatNetwork」という名前の NAT ネットワーク(設定)を作成しています。InternalIPInterfaceAddressPrefix に指定した 192.168.137.0/24 からの通信が NAT 対象となります。

PS C:\> New-NetNat -Name VMNatNetwork -InternalIPInterfaceAddressPrefix 192.168.137.0/24

Name                             : VMNatNetwork
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 192.168.137.0/24
IcmpQueryTimeout                 : 30
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpIdleSessionTimeout            : 120
UdpInboundRefresh                : False
Store                            : Local
Active                           : True

PS C:\> Get-NetNat | fl *

Store                            : Local
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpInboundRefresh                : False
Active                           : True
Caption                          :
Description                      :
ElementName                      :
InstanceID                       : VMNatNetwork;0
ExternalIPInterfaceAddressPrefix :
IcmpQueryTimeout                 : 30
InternalIPInterfaceAddressPrefix : 192.168.137.0/24
InternalRoutingDomainId          : {00000000-0000-0000-0000-000000000000}
Name                             : VMNatNetwork
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
UdpIdleSessionTimeout            : 120
PSComputerName                   :
CimClass                         : root/StandardCimv2:MSFT_NetNat
CimInstanceProperties            : {Caption, Description, ElementName, InstanceID...}
CimSystemProperties              : Microsoft.Management.Infrastructure.CimSystemProperties

PS C:\>

InternalIPInterfaceAddressPrefix は、Internal vSwitch に接続されたホスト側の仮想 NIC にアサインした IPアドレスを含んでいる必要があります。例えば、ホスト側の仮想 NIC に 192.168.0.1/24 を設定した場合、InternalIPInterfaceAddressPrefix には 192.168.0.0/24 などを指定します。

※ NAT 先の IP アドレス(所謂、External IP Address)は指定しません。動的に決定されます。

制限事項

何れも現時点においての制限事項です。(将来どうなるかは不明です。)

  • NAT ネットワークは複数作成できません。複数作成すると意図しない動作をする可能性があります。
  • Windows Container (docker)を使用すると、NAT タイプのネットワークが自動的に作成されます。コンテナと併用する場合は、自動的に作成された NetNat を流用するか、一度 NAT 定義を削除した後両方をカバー可能な広いレンジの NAT ネットワークを定義してください。
  • NAT を行うインタフェースは指定できません。IP アドレスから動的に解決されます。

参考

広告

Windows 10 1607 Hyper-V で Windows Server 2016 TP5 を起動できない

leave a comment »

Windows 10 Anniversary Update (Version. 1607)が配信され、アップデート(アップグレード?)している方も多いかと思います。しかし、Windows Server 2016 Technical Preview 5 の検証を Hyper-V 仮想マシン上で実施していた方は要注意です。

Windows Server 2016 TP5 を起動できない

Windows 10 (Hyper-V ホスト側)を Version. 1607 (Build 10393)へアップデートすると、一部の環境で Windows Server 2016 TP5 をブートできなくなります。条件は以下の2つです。

  1. Gen 2 仮想マシン(第2世代仮想マシン)を使用している。
  2. ゲスト OS 側(Windows Server 2016 TP5)に KB3172729 がインストールされていない。

原因

セキュアブートの脆弱性(と言って良いか分かりませんが、セキュリティ上の問題)により、Windows Server 2016 TP5 (初期の)ブートコードがブラックリストに登録されています。Windows 10 Anniversary Update は、この新しい(Update された)ブラックリスト情報を持っているため、Windows Server 2016 TP5 の起動ができません。

回避策と対応策

回避策および恒久対応としては、以下の何れかを実施することにより起動が可能です。

  1. Gen 1 仮想マシンを使用する。
  2. セキュアブートを無効化する。
    • 単純に無効化するだけでなく、セキュアブートテンプレートを Linux 用のテンプレートに変更した後で無効化する必要があります。
  3. ゲスト OS 側に KB3172729 をインストールする。

KB3172729 はゲスト側のブートコードを更新し、ホスト側で正しく認証されるものに置き換えます。これにより、KB3172729 のインストール後は、正しくセキュアブートが機能するようになります。

KB3172729 をインストールするためには、原則として仮想マシンを起動する必要があります。(厳密には他の方法もありますが。)既に仮想マシンが起動できなくなっている場合は、上記 2 の方法で仮想マシンを一度起動し、Update を適用した後に、再度セキュアブートの設定を変更します。

具体的には、仮想マシンの設定で「セキュリティ」を選択し、テンプレートで「Microsoft UEFI 証明機関」を選択した後、「セキュアブートを有効にする」のチェックを外します。テンプレートが「Microsoft Windows」に設定されているとセキュアブートを無効化しても OS をブートできません。

変更前

win10-ws2016tp5-vm-002

変更後

win10-ws2016tp5-vm-003

仮想マシンが起動できたら、早々に Update を適用し、せえきゅあブートの設定を元に戻しておきましょう。

 

Written by kazu

2016/08/20 at 02:54

UEFI システム上で bootsect.exe が使えない?

leave a comment »

結論

bootsect.exe が古いです。

いきさつ

久しぶりに(?)Windows Server 2008 R2 を物理サーバーにインストールする必要が生じたため、Windows Server 2008 R2 のメディアから、インストール用の USB を作成しようとしたところ、bootsect.exe が動きませんでした。

bootsect-efi

E:\boot>bootsect.exe /nt60 D:
This tool can only be run on systems booted using a PC/AT BIOS.  This system was booted using EFI or some other firmware type.

使用したのは Windows Server 2008 R2 のメディアに入っている bootsect.exe です。パーティションを作成し、メディアの中身を xcopy でコピーした後、bootsect でブートローダーを書き込もうとしたところ、エラーになりました。

原因

Windows Server 2008 R2 の(おそらく Windows 7 も)bootsect.exe が古く、UEFI ブートしたシステム上では動作しないようになっているためです。最近の(少なくとも Windows 10 の)bootsect.exe は、UEFI ブートした OS 環境からも利用できるように(BIOS ブート向けのブート情報を書き込めるように)なっています。

対処法

Windows 10 などの bootsect.exe をそのまま使用します。

bootsect-efi2

UEFI ブートしているシステムでも C:\Windows\System32 配下に bootsect.exe などがインストールされているはずです。(デフォルトでパスが通っているので、インストールメディアの boot フォルダーなど別の bootsect.exe が存在するパスに移動していなければ、そのまま使えると思います。)

まとめ

いざという時のために、最新の Windows ADK から作成した WinPE 環境を USB ブートできるようにしておく(常に持ち歩く)と安心かも。

Written by kazu

2016/08/13 at 19:45

一時的に PowerShell スクリプト実行ポリシーを変更する

with one comment

意外と知らないという方が多かったので、まとめておきます。

PowerShell でスクリプトを実行するには

PowerShell でスクリプトを実行するためには、実行ポリシー(Execution Policy)が適切に設定されている必要があります。実行ポリシーは、ヘルプ トピックの about_Execution_Policies に詳しく書かれています。

Windows PowerShell の実行ポリシーを使用して、Windows PowerShell によって構成ファイルが読み込まれてスクリプトが実行される条件を決定できます。

実行ポリシーは、ローカル コンピューター、現在のユーザー、特定のセッションに設定できます。グループ ポリシー設定を使用して、複数のコンピューターやユーザーに実行ポリシーを設定することもできます。

ローカル コンピューターの実行ポリシーと現在のユーザーの実行ポリシーは、レジストリに格納されます。Windows PowerShell プロファイルに実行ポリシーを設定する必要はありません。特定のセッションの実行ポリシーは、メモリ内にのみ格納され、セッションが閉じられると失われます。

実行ポリシーはユーザーの操作を制限するセキュリティ システムではありません。たとえば、ユーザーはスクリプトを実行できないとき、コマンド ラインでスクリプトの内容を入力すると、容易にポリシーを回避できます。一方で、実行ポリシーを使用して基本的な規則を設定することで、意図せずに違反することを防止することができます。

PowerShell コンソール上でヘルプを表示する場合は、以下を実行します。

Get-Help about_Execution_Policies

現在の設定を取得する場合は、Get-ExecutionPolicy コマンドレットを使用します。

PS C:\> Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine    RemoteSigned


PS C:\>

各スコープに対して、現在どのようなポリシーが適用されているか確認できます。

Execution Policy の種類

簡潔に記載すると以下の通りです。詳細は、TechNet を参照してください。

Restricted

  • いかなる場合もスクリプトや外部モジュールの実行は禁止
  • クライアント系 OS および 2012 までのサーバー系 OS の既定

AllSigned

  • 全てのスクリプトに電子署名が必要
  • 電子署名の証明書が信頼されていない場合は、確認メッセージを表示

RemoteSigned

  • 原則 AllSigned と同じだが、ローカル(NTFS Zone.Identifier 的な意味で)のスクリプトについては署名なしで実行可能
  • 2012 R2 以降のサーバ系 OS の既定

Unrestricted

  • 全てのスクリプトを実行可能だが、ローカルのスクリプト以外は警告を表示

Bypass

  • 全てのスクリプトを実行可能で、かつ警告も出さない

スコープ

実行ポリシーはスコープに対して適用されます。スコープごとに異なるポリシーを設定することもできます。その場合、上位のスコープに設定されたポリシーが優先されます。(全て Undefined の場合は、Restricted とみなされます。)

  1. MachinePolicy : グループポリシーのコンピューターポリシーによる設定
  2. UserPolicy : グループポリシーのユーザーポリシーによる設定
  3. Process : ある PowerShell プロセス内(のみ)
  4. CurrentUser : あるコンピューターの、あるユーザーのみ(あるコンピューターの、特定ユーザーのグローバル設定)
  5. LocalMachine : あるコンピューターのみ(あるコンピューターの、全ユーザーのグローバル設定)

1 と 2 はグループポリシーによる設定、3 ~ 5 は、Set-ExecutionPolicy を使用して設定します。

一時的に Execution Policy を変更する

やっと本題です。上記に記載の通り、PowerShell の実行ポリシーはグループポリシーで強制されていない限りプロセス単位で変更が可能です。かつ、Process スコープ(および CurrentUser スコープ)は、管理者でなくともポリシーの設定が可能です。

PowerShell 起動後(開始後)に変更

PowerShell プロセス起動後は、Set-ExecutionPolicy の –Scope パラメーターで Process を指定すると、それ以降のポリシーを変更できます。

PS C:\> Get-Content C:\ps\sample01.ps1
$PSHOME
PS C:\> .\ps\sample01.ps1
.\ps\sample01.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\ps\sample01.ps1 を読み込むこと
ができません。詳細については、「about_Execution_Policies」(http://go.microsoft.com/fwlink/?LinkID=135170) を参照してく
ださい。
発生場所 行:1 文字:1
+ .\ps\sample01.ps1
+ ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
PS C:\> Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
PS C:\> .\ps\sample01.ps1
C:\Windows\System32\WindowsPowerShell\v1.0
PS C:\>

PowerShell 起動時に変更

PowerShell 起動時に、その(これから起動する)PowerShell プロセスのみポリシーを変更したい場合は、powershell.exe のオプションとしてポリシーを渡します。

C:\>powershell.exe -NoLogo -ExecutionPolicy RemoteSigned -File .\ps\sample01.ps1
C:\Windows\System32\WindowsPowerShell\v1.0

C:\>

まとめ

  • 特定のバッチやタスクのみ、一時的な対応などでスクリプトの実行が必要な場合は、一時的に(該当プロセスのみ)実行ポリシーを変更してスクリプトを実行できます。
  • 管理者としてユーザーによる一時的な実行ポリシーの変更が許容できない場合は、グループポリシーでのポリシー配布が必要です。

ネットワークの場所を「プライベート」に変更する

leave a comment »

いつも忘れるのでメモ。

PS C:\> Get-NetConnectionProfile | ? NetworkCategory -eq "Public" | Set-NetConnectionProfile -NetworkCategory "Private"

 

管理者権限に昇格して実行することを忘れずに。

ドメインネットワークは良いとして、ストレージ通信用やハートビート用のネットワークは忘れずに Private へ変更する。

Written by kazu

2015/03/12 at 13:00

PowerShell の $a –eq $b と $b –eq $a は同じ結果とは限らない

leave a comment »

一言で言うと、タイトルの通りなのですが。他の言語を使用している方は、(普段使っている言語によっては)違和感があるかもしれません。

もともと、PowerShell の –eq 演算子は、配列(リスト)に適用したときと値型(Scalar Value)に適用したときで動作が異なります。が、値型同士の比較であっても、結果が異なる場合があります。

PS C:\> $true -eq 10
True
PS C:\> 10 -eq $true
False

$true は bool 型、10 は int 型で、ともに値型ですが、上記の通り異なる結果になります。これは、Boolean や Null ($null)と数値を比較した場合、右側のオペランド(被演算子)が左オペランドの型へ暗黙的にキャストされるためです。ですので、上の例は、以下と同等になります。

PS C:\> [bool]10
True
PS C:\> $true -eq [bool]10
True
PS C:\> [int]$true
1
PS C:\> 10 -eq [int]$true
False

ちなみに、通常の数値型(int や double 等)を –eq 演算子で比較した場合は、左オペランドの型へキャストされるのではなく、左右のオペランドのうち精度の高い型や範囲の広い型へキャストされます。(つまり、必ず左オペランドの型へキャストされるわけではありません。)

PS C:\> 10 -eq 10.1
False
PS C:\> 10.1 -eq 10
False
参考

Written by kazu

2015/01/31 at 11:30

PowerShell で「続行しますか?」に「中断」を選択するとどうなるか

leave a comment »

文字通り「中断」されるのですが、「中断」って何?というお話。

例えば、Enable-PSRemoting コマンドレットをオプションなしで実行すると、以下の通り確認のプロンプトが表示されます。

PS C:\> Enable-PSRemoting

WinRM クイック構成
Windows リモート管理 (WinRM) サービスを使用して、このコンピューターのリモート管理を有効にするコマンド
"Set-WSManQuickConfig" を実行します。
 これには、次の処理が含まれます:
    1. WinRM サービスを開始または (既に開始されている場合は) 再起動します。
    2. WinRM サービスのスタートアップの種類を [自動] に設定します。
    3. どの IP アドレスでも要求を受け付けるリスナーを作成します。
    4. WS-Management トラフィック用の Windows ファイアウォールの受信規則の例外を有効にします (HTTP のみ)。

続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):

続行する場合は「はい」、続行しない場合(キャンセルする場合)は「いいえ」を選択すればよいのですが、それ以外に「中断」が選択できます。(なお、基本的には「すべて続行」は「すべてはい」、「すべて無視」は「すべていいえ」と同等です。)

「中断」を選択した場合は以下の様になります。

続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): S
PS C:\>>

一見、「いいえ」と何が違うのかわかりませんが、よく見るとプロンプトの「>」の数が異なります。

実は(と言うほどでもないですが)、「中断」はコマンドの実行を保留したまま、シェルのプロンプトを表示します。(ネストされたシェルを呼び出します。)コマンドの実行は保留されているため、exit でプロンプトから抜けると、先程中断した(選択を保留した)個所から再開されます。

PS C:\>> Get-Service WinRM

Status   Name               DisplayName
------   ----               -----------
Running  WinRM              Windows Remote Management (WS-Manag...


PS C:\>> Get-Item WSMan:\localhost\Client\TrustedHosts


   WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client

Type            Name                           SourceOfValue   Value
----            ----                           -------------   -----
System.String   TrustedHosts                                   *


PS C:\>> exit

WinRM クイック構成
Windows リモート管理 (WinRM) サービスを使用して、このコンピューターのリモート管理を有効にするコマンド
"Set-WSManQuickConfig" を実行します。
 これには、次の処理が含まれます:
    1. WinRM サービスを開始または (既に開始されている場合は) 再起動します。
    2. WinRM サービスのスタートアップの種類を [自動] に設定します。
    3. どの IP アドレスでも要求を受け付けるリスナーを作成します。
    4. WS-Management トラフィック用の Windows ファイアウォールの受信規則の例外を有効にします (HTTP のみ)。

続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):

「中断」は、上記の様に、コマンドの実行途中で、選択を一時的に保留し、別のコマンドレットを実行(して状態の確認などを行う)際に使用します。

なお、何度も(ネストされている中でさらに)中断すると、プロンプトの「>」の数が増えていきます。(昔は増えない仕様だった気がするのですが…。)いずれにせよ、何度も中断すると、戻ってきたときにいったい何の処理中だったのか訳が分からなくなるので、複数中断しないほうが良いと思います。

PS C:\> Enable-PSRemoting

WinRM クイック構成
Windows リモート管理 (WinRM) サービスを使用して、このコンピューターのリモート管理を有効にするコマンド
"Set-WSManQuickConfig" を実行します。
 これには、次の処理が含まれます:
    1. WinRM サービスを開始または (既に開始されている場合は) 再起動します。
    2. WinRM サービスのスタートアップの種類を [自動] に設定します。
    3. どの IP アドレスでも要求を受け付けるリスナーを作成します。
    4. WS-Management トラフィック用の Windows ファイアウォールの受信規則の例外を有効にします (HTTP のみ)。

続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): S
PS C:\>>
PS C:\>> Enable-PSRemoting

確認
この操作を実行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): S
PS C:\>>>
PS C:\>>> Enable-PSRemoting

確認
この操作を実行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): S
PS C:\>>>>
PS C:\>>>> exit

確認
この操作を実行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): L

確認
この操作を実行しますか?
対象 "" に対して操作 "" を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): L
PS C:\>>> exit

確認
この操作を実行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): L

確認
この操作を実行しますか?
対象 "" に対して操作 "" を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): L
PS C:\>> exit

WinRM クイック構成
Windows リモート管理 (WinRM) サービスを使用して、このコンピューターのリモート管理を有効にするコマンド
"Set-WSManQuickConfig" を実行します。
 これには、次の処理が含まれます:
    1. WinRM サービスを開始または (既に開始されている場合は) 再起動します。
    2. WinRM サービスのスタートアップの種類を [自動] に設定します。
    3. どの IP アドレスでも要求を受け付けるリスナーを作成します。
    4. WS-Management トラフィック用の Windows ファイアウォールの受信規則の例外を有効にします (HTTP のみ)。

続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): L

確認
この操作を実行しますか?
対象 "名前: microsoft.powershell SDDL:
O:NSG:BAD:P(A;;GA;;;BA)(A;;GA;;;RM)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)。選択したユーザーがこのコンピューターに対して
Windows PowerShell コマンドをリモートで実行できるようにします。" に対して操作 "Set-PSSessionConfiguration"
を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): L
PS C:\>

「いいえ」で一旦処理をキャンセルし、確認後に改めてコマンドを実行してもよい状況であれば、「中断」は使わないほうが良いでしょう。その方が分かりやすく、オペレーションミスの可能性も低くなるはずです。

Written by kazu

2015/01/25 at 21:43