0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

リモートデスクトップ接続で対象ホストがスリープしていたら起こしてから接続するPowershellスクリプト

Last updated at Posted at 2023-04-12

What is this?

LAN内にあるリモートデスクトップ接続可能なPCにつなぎたい。でも接続対象ホストがスリープしていて接続できない……。そんなときありますよね。

そんなときはこのスクリプトを使ってください。ダブルクリックするだけで対象ホストにMagicPacketを投げて起こせます。パスワードについては安全のため毎回手入力する仕様になっていますが、
image.png
この画面はすっ飛ばしてパスワードを入力するだけでリモートデスクトップ接続ができます。

PowershellのスクリプトであるPS1自体はダブルクリックで起動できないのでバッチファイルで皮をかぶせてダブルクリックだけで起動できるようにしておきました。

事前準備

対象ホストをMagicPacktでスリープから復旧できるようにしておいてください。
nWOLがMacAddressとHostNameを調べるのにもMagicPacketで起動できるかどうかテストをするのにも便利です。

動作概要

  1. 接続前に対象ホストがスリープしているかチェック
  2. スリープしていたいたらMagicPacketを投げて起動を試行。
  3. 10秒待機したあとスリープチェック→スリープしていたら2に戻る
  4. スリープしていなかったらリモートデスクトップ接続用のプロンプトを出す
  5. 自身は終了する

スクリプト

冒頭のMacAddressHostNameは適切なものに変えてください。

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
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?