Enter-PSSessionコマンドレット徹底解説:PowerShellでリモートコンピューターに対話的に接続する方法
Enter-PSSession コマンドレットを使用すると、リモートコンピューターとの間に永続的な対話型PowerShellセッションを確立できます。セッション接続後に入力したすべてのコマンドは、ローカルではなくリモートコンピューター上で実行されます。この記事では、Enter-PSSessionの主な機能と、Windows 10/11 および Windows Server 2022/2019/2016 環境でのリモート管理への活用方法について詳しく解説します。
Enter-PSSessionの仕組み:PowerShell RemotingとWinRM
Enter-PSSessionコマンドレットは、PowerShell Remoting(PSRemoting)という基盤技術の上に構築されています。PSRemotingは WS-Management(Web Services for Management) プロトコルと WinRMサービス(Windows Remote Management) に基づいており、コンピューター間の通信はプロトコルレベルで暗号化されます(必要に応じてSSLによる暗号化を有効化することも可能です)。認証方式もNTLMやKerberosなど複数の方法から選択できます。
基本的な使い方:リモートセッションへの接続
最もシンプルなケースでは、接続先のコンピューター名を -ComputerName パラメーターで指定するだけで、対話型PowerShellセッションを開始できます。
Enter-PSSession hq-srv01.woshub.com現在のユーザーにリモートホストへの接続権限がある場合、そのままリモートコンピューターの対話型シェルに接続されます。
接続前に別のユーザーの資格情報を入力したい場合は、以下のように実行します。
Enter-PsSession –ComputerName hq-srv01.woshub.com –Credential woshub\maxbakまたは、Get-Credentialコマンドレットを使って資格情報オブジェクトを作成してから接続することもできます。
$creds = Get-Credential
Enter-PSSession -ComputerName hq-srv01 -Credential $credsリモートセッション中であることの確認方法
リモートセッションに接続すると、PowerShellプロンプトの先頭にリモートコンピューター名が角括弧で表示されます(例:[hq-srv01.woshub.com])。これにより、現在ローカルシェルとリモートシェルのどちらで作業しているかを一目で判別できます。
リモートで実行されたコマンドの出力は、すべてローカルコンソールに表示されます。hostname コマンドを実行すれば、実際にリモートコンピューター上でコマンドが実行されていることを確認できます。
リモートコンピューター上でのコマンド実行例
対話型プロンプトでは、自身の権限範囲内で任意のコマンドを実行できます。たとえば、リモートコンピューターのネットワーク設定を表示するには次のコマンドを使用します。
Get-NetIPConfigurationリモートコンピューターのDNSサーバー設定を変更することも可能です。
Set-DNSClientServerAddress –InterfaceIndex 6 –ServerAddresses 192.168.13.4, 192.168.100.4リモートセッションの終了
対話型リモートシェルを終了するには、Exit-PSSession または exit コマンドを実行します。プロンプトが通常の表示に戻り、ローカルのPowerShellコンソールへ復帰します。
PsExecとの比較
以前は、リモートWindowsコンピューター上で対話型のコマンドプロンプトを起動するために、管理者は主にPsExecツールを使用していました。しかしEnter-PSSessionの登場により、外部ツールに頼る必要はなくなりました。
PowerShell Remotingの有効化状態を確認する
Windows Server 2016/2019/2022では、PowerShell Remotingはデフォルトで有効になっています(サーバーマネージャー → ローカルサーバー → リモート管理 = 有効 で確認できます)。一方、デスクトップ版Windows(Windows 10/11)では、PSRemotingとWinRMはデフォルトで無効になっています。
現在のコンピューターでPSRemotingが有効かどうかは、次のコマンドで確認できます。
Get-PSSessionConfigurationこのコマンドは、WinRM経由での接続が許可されているユーザーやグループの一覧を取得する際にも使用されます。PSRemotingを利用するには、ユーザーアカウントが Administrators グループまたは Remote Management Users グループのメンバーである必要があります。
Test-WSManによる接続テスト
ローカル経由でPowerShell Remotingに接続できるかどうかをテストするには、次のコマンドを実行します。
Test-WSMan -ComputerName localhostWSManスキーマのバージョン情報が返ってくれば、そのコンピューターへのPS Remotingによるリモート接続が許可されています。
PowerShell Remotingが無効または未構成の場合は、次のようなエラーが表示されます。
Test-WSMan : The client cannot connect to the destination specified in the request. Verify that the service on the destination is running and is accepting requests... If the destination is the WinRM service, run the following command on the destination to analyze and configure the WinRM service: "winrm quickconfig".
Enable-PSRemotingでPowerShell Remotingを有効化する
PowerShell Remotingを有効にするには、次のコマンドを実行します。
Enable-PSRemoting -Forceこのコマンドは以下の処理を行います。
- WinRMサービスを有効化し、スタートアップの種類を「自動」に設定する
- デフォルトのWinRMポート(HTTP通信用TCP/5985)にリスナーを作成する
- WindowsファイアウォールにWS-Managementの例外規則を追加する(手動で構成する場合は、PowerShellまたはGPOでファイアウォール規則を追加してください)
- リモートPowerShellセッションを許可する
- WinRMサービスを再起動する
WinRMサービスが実行中で、自動起動が設定されていることを確認しましょう。
Get-Service WinRM | Select MachineName,Name,Status,StartTypeパブリックネットワークプロファイルでの注意点
Enable-PSRemotingコマンドは、ドメインおよびプライベートのネットワークプロファイルでのみ機能します。パブリックネットワーク上のコンピューターでPSRemotingを有効にしたい場合は、ネットワークの場所を「パブリック」から「プライベート」に変更するか、次のコマンドを使用します。
Enable-PSRemoting -SkipNetworkProfileCheck -ForceActive Directoryドメイン環境では、サーバーやクライアントコンピューターに対してWindows Remote Management(PSRemoting)を一元的に構成する最も簡単な方法は、グループポリシー(GPO)を利用することです。
SSH経由でのPowerShell Remoting接続
PowerShell 6以降(v6/v7)では、Secure Shell(SSH)プロトコルを使ったリモートコンピューターへの接続がサポートされています。この場合、リモートコンピューター側でSSH接続ポイント(OpenSSH Serverなど)が利用可能である必要があります。SSH経由で対話型のPSRemotingセッションを開始するには、次のコマンドを使用します。
Enter-PSSession -HostName maxbak@hq-srv01.woshub.comRSAキーを使ってSSH認証を行う場合は、次のように指定します。
Enter-PSSession -HostName maxbak@hq-srv01.woshub.com:22 -KeyFilePath c:\PS\max_rsa_keyNew-PSSessionとの組み合わせ
Enter-PSSessionは New-PSSession コマンドレットと併用することもできます。あらかじめ作成しておいたセッションオブジェクトを指定して接続できます。
$s = New-PSSession -ComputerName hq-srv01.woshub.com
Enter-PSSession -Session $s認証方式とTrustedHostsの設定
Enter-PSSessionは複数の認証方式をサポートしています。-Authenticationパラメーターを使用して、Basic、Digest、Kerberos、CredSSP、NegotiateWithImplicitCredential、Negotiateなどの方式を選択できます。
前述の例は、同じActive Directoryドメイン内のコンピューター間で対話型接続を作成するケースでした(FQDNまたは短いコンピューター名を指定するだけでよく、Kerberos認証が使用されます)。しかし、IPアドレスやCNAMEを使ってリモートコンピューターに接続しようとすると、認証エラーが発生します。
Enter-PSSession : Connecting to remote server 192.168.31.12 failed with the following error message: The WinRM client cannot process the request. Default authentication may be used with an IP address under the following conditions: the transport is HTTPS or the destination is in the TrustedHosts list...
IPアドレスでリモートコンピューターに接続するには、対象ホストを信頼されたホスト(TrustedHosts)の一覧に追加するか、WinRMでSSLを使用します(SSLの方がより安全です)。
TrustedHostsへのIPアドレス追加
IPアドレスを信頼されたホストに追加するには、次のコマンドを実行します。
Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.13.5ワイルドカードを使って追加することも可能です。
Set-Item WSMan:\localhost\Client\TrustedHosts -Value *.woshub.com信頼されたホストの一覧を表示するには、次のコマンドを使用します。
Get-Item WSMan:\localhost\Client\TrustedHosts同様の手順で、リモートコンピューター側の信頼されたホスト一覧に自分のホストを追加することもできます。設定変更後はWinRMサービスを再起動してください。
Restart-Service WinRMこれで、IPアドレスを指定してリモートコンピューターに接続できるようになります。
Enter-PSSession -ComputerName 192.168.13.5 -Credential (Get-Credential -UserName woshub\maxbak)まとめ:Enter-PSSessionとInvoke-Commandの使い分け
Enter-PSSession と New-PSSession コマンドレットは、1対1の永続的なリモートセッションを作成するものであり、主に対話的な操作シナリオで使用されます。一方、スクリプトやジョブを自動実行したい場合、あるいは複数のリモートコンピューターに対して同時に処理を行いたい場合は、Invoke-Command コマンドレットを使用するのが適しています。用途に応じて両者を使い分けることで、Windows環境のリモート管理をより効率的に行えます。
-
【Mac】「デフォルトのインタラクティブシェルはzshになりました」警告の意味と消し方
zshからbashに変更したばかりの方や、macOS Catalina/Big Sur/Montereyにアップデートした方は、ターミナルを開くたびに次のようなメッセージが表示されることがあります。「The default interactive shell is now zsh. To update your account to use zsh, please run chsh -s /bin/zsh. For more details, please visit https://support.apple.com/kb/HT208050.」AppleはmacOS Catalina以降、デ
-
ADB Android インストール ガイド:ドライバーとコマンド
この記事では、1 つ以上のデバイスとエミュレーターをインストール、テスト、診断、および管理する際に、ADB を使用して詳細な制御を行う方法について説明します。 ソフトウェア開発者としての最初の数年間は、主に Android SDK を扱っていましたが、Android Debug Bridge (ADB/adb) とは何か、それが何をするのか、いつ使用するのか、まったくわかりませんでした。 面白いことに、最初にそれについて学ぼうと思ったのは、何らかの専門的な目標ではありませんでした。むしろ、私が必死に復活させたかったのは、Nexus 6 をループするブートでした。そのような問題に対して、An