What is this?
LAN内にあるリモートデスクトップ接続可能なPCにつなぎたい。でも接続対象ホストがスリープしていて接続できない……。そんなときありますよね。
そんなときはこのスクリプトを使ってください。ダブルクリックするだけで対象ホストにMagicPacketを投げて起こせます。パスワードについては安全のため毎回手入力する仕様になっていますが、
この画面はすっ飛ばしてパスワードを入力するだけでリモートデスクトップ接続ができます。
PowershellのスクリプトであるPS1自体はダブルクリックで起動できないのでバッチファイルで皮をかぶせてダブルクリックだけで起動できるようにしておきました。
事前準備
対象ホストをMagicPacktでスリープから復旧できるようにしておいてください。
nWOLがMacAddressとHostNameを調べるのにもMagicPacketで起動できるかどうかテストをするのにも便利です。
動作概要
- 接続前に対象ホストがスリープしているかチェック
- スリープしていたいたらMagicPacketを投げて起動を試行。
- 10秒待機したあとスリープチェック→スリープしていたら2に戻る
- スリープしていなかったらリモートデスクトップ接続用のプロンプトを出す
- 自身は終了する
スクリプト
冒頭のMacAddress
とHostName
は適切なものに変えてください。
WakeAndConnectRDP.bat
@echo off
pushd %~dp0
powershell -ExecutionPolicy Bypass -File ".\WakeAndConnectRDP.ps1" %*
popd
WakeAndConnectRDP.ps1
$HostsSettings = @{
MacAddress = '00:00:00:00:00:00'
HostName = 'YORER-HOST-NAME-HEER'
}
function Test-ConnectionToHost {
param([string]$hostName)
Write-Host "Testing connection to $hostName"
$ping = Test-Connection -ComputerName $hostName -Count 1 -Quiet
if ($ping) {
Write-Host "Connection to $hostName successful"
return $true
}
Write-Host "Failed to connect to $hostName"
return $false
}
function Send-MagicPacket {
param([string]$macAddress)
Write-Host "Sending magic packet to $macAddress"
$macAddr=[byte[]]($macAddress.split(":") | ForEach-Object{[Convert]::ToInt32($_, 16)});
$magicPacket=([byte[]](@(0xff)*6)) + $macAddr * 16;
$udpClient=new-object System.Net.Sockets.UdpClient;
$WakeUpTarget=[System.Net.IPAddress]::Broadcast;
$udpClient.Connect($WakeUpTarget, 9);
$udpClient.Send($magicPacket, $magicPacket.Length)|out-null;
$udpClient.Close();
}
function Connect-ToRemoteHost {
param([string]$macAddress, [string]$hostName)
if ((Test-ConnectionToHost $hostName)) {
Write-Host "Connecting to remote host $hostname"
mstsc /v:$hostname
}else{
Send-MagicPacket $macAddress
$title = "Waiting for the host to boot up. While waiting, a connection is attempted every 10 seconds."
$progress = 0
for ($i = 0; $i -le 5; $i++) {
for ($j = 0; $j -le 10; $j++) {
$progress = [Math]::Truncate(($i + (($j+1) /11)) / 6 *100)
Write-Progress -Activity $title -Status "$progress %" -PercentComplete $progress -SecondsRemaining (50 - ($i * 5 + $j))
Start-Sleep 1
}
if (Test-ConnectionToHost $hostName) {
Write-Host "Connecting to remote host $hostname"
mstsc /v:$hostname
break
}
}
}
}
Connect-ToRemoteHost -MacAddress $HostsSettings.MacAddress -HostName $HostsSettings.HostName