共有アカウントでRDPしていると他人を追い出す/追い出される・・・
Windowsのリモートデスクトップ(RDP)をする際に同じアカウントを利用している場合、
後から入った人が先に入っていた人を弾いてしまう。といった経験があると思います。
今回はそういったことが起こらないよう、
バッチとPowerShellを使ってRDPの追い出しを防止する仕組みを実現します。
↓まずはのようにbatとps1を同じフォルダに作ってください
(batの名前はなんでもよいです、文字コードをANSIにしないと文字化けするかも)
bat内の「My_Computername」変数に接続したいホスト名を記入して下さい
aaa.bat
@echo off
cls
rem 接続したいホスト名を設定
set My_Computername=ComputerAAAAA
PowerShell -ExecutionPolicy Bypass -File "%~dp0リモート接追い出し防止.ps1" %My_Computername%
ps1の方は何も弄らなくていいです
リモート接追い出し防止.ps1
# 変数の初期化
Remove-Variable -Name * -ErrorAction SilentlyContinue
Clear-Host
# 引数の取得
$MyHostname = $args[0]
$MyMode = $args[1]
$MyPID = $args[2]
# 観察モードでない場合の処理
if ($MyMode -ne "observation") {
# ホスト名に一致するファイルの検索
$MyHostnameFile = Get-ChildItem $PSScriptRoot -ErrorAction SilentlyContinue -Exclude "*.bat" | Where-Object { $_.Name -match $MyHostname }
if ($MyHostnameFile) {
# ログインユーザーの取得
$LoginUser = Get-Content $MyHostnameFile.FullName
Write-Host "既に $LoginUser さんがログオンしています"
Write-Host "$LoginUser さんに連絡を取るか、5分後に再度お試しください。`r`n"
Pause
Exit
}
# ログインユーザー名をファイルに保存
$env:USERNAME | Out-File "$PSScriptRoot\$MyHostname.txt"
"$(Get-Date):$env:USERNAME が $MyHostname へのリモートデスクトップ接続を開始しました" | Out-File "$PSScriptRoot\RDPlogs.log" -Append
# mstsc.exe を起動
$MyProcess = Start-Process mstsc.exe -ArgumentList " -v $MyHostname" -PassThru
# PowerShellスクリプトを観察モードで再度起動
Start-Process PowerShell -ArgumentList "-File `"$PSCommandPath`" $MyHostname `"observation`" $($MyProcess.Id)" -WindowStyle Hidden
Exit
}
# 観察モードの処理
while ($true) {
if (-not (Get-Process | Where-Object { $_.Id -eq $MyPID })) {
"$(Get-Date):$env:USERNAME が $MyHostname へのリモートデスクトップ接続を終了しました" | Out-File "$PSScriptRoot\RDPlogs.log" -Append
Remove-Item "$PSScriptRoot\$MyHostname.txt"
Exit
}
Start-Sleep 1
}
~仕組み~
RDPすると「My_Computername」変数に設定したホスト名のファイルが作成されます