今までに、SSHでの選択型の自動ログインについてはTeratermマクロやPythonのスクリプトを作ってみたりしたが、そういえばRDPの接続ではやってないなぁ…
と思ったので、簡素なものではあるがPowerShellで作ってみた。
まぁ、転職するので今後Windowsサーバを仕事で使うことがあるのやら不明だけど。
次のクライアントMacだし。
作りは、ホストのIPアドレスやらユーザ、パスワードを記述した「host.list」とスクリプト本体である「RDP_CONNECT.ps1」の2つ。
同じディレクトリ配下においておく。
1.host.list
「host.list」については、今まで書いたTeratermマクロなどと同じく、以下のようにカンマ区切りで作成している。
Azureなどへの接続でポート番号を指定する必要がある場合は、IPアドレスの後ろに普通に記述する。
host.list
# HOST_NAME, HOST_IP, HOST_USER, HOST_PASS
テスト1,172.28.0.1,test,test
テスト2,172.28.0.2,test,test
テスト3,172.28.0.3,test,test
テスト4,172.28.0.4:4444,test,test
テスト5,172.28.0.5,test,test
テスト6,172.28.0.6:6666,test,test
テスト7,172.28.0.7,test,test
2.RDP_CONNECT.ps1
スクリプト本体。
リストボックスの作成部分についてはこちらを参考に、RDPの接続部分についてはこれをまんま使った。
RDP_CONNECT.ps1
################
# - Function - #
##############
function ListBox($FOREACH_HOST_LIST)
{
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "RDP自動接続"
$objForm.Size = New-Object System.Drawing.Size(300,200)
$objForm.StartPosition = "CenterScreen"
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")
{$x=$objListBox.SelectedIndex;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")
{$objForm.Close()}})
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click({$x=$objListBox.SelectedIndex;$objForm.Close()})
$objForm.Controls.Add($OKButton)
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(150,120)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20)
$objLabel.Size = New-Object System.Drawing.Size(280,20)
$objLabel.Text = "接続先のコンピュータを選択してください:"
$objForm.Controls.Add($objLabel)
$objListBox = New-Object System.Windows.Forms.ListBox
$objListBox.Location = New-Object System.Drawing.Size(10,40)
$objListBox.Size = New-Object System.Drawing.Size(260,20)
$objListBox.Height = 80
Foreach($i in $FOREACH_HOST_LIST) {
[void] $objListBox.Items.Add($i)
}
$objForm.Controls.Add($objListBox)
$objForm.Topmost = $True
$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
$x
}
function RDPConnect($CONNECT_IP, $CONNECT_USER, $CONNECT_PASS)
{
# Cmdkey用に、接続先情報にポート番号が指定されている場合は除外する
$CMDKEY_CONNECT_IP = $CONNECT_IP | %{ $_.Split(":")[0]}
Cmdkey.exe /generic:TERMSRV/"$CMDKEY_CONNECT_IP" /user:"$CONNECT_USER" /pass:"$CONNECT_PASS"
Start mstsc /v:$CONNECT_IP
Timeout 5
Cmdkey.exe /delete:TERMSRV/$CMDKEY_CONNECT_IP
}
##########
# - Main - #
##########
# 『host.list』PATH取得
$SCRIPT_PATH = Split-Path $myInvocation.MyCommand.path
$LIST_FILE = Join-Path $SCRIPT_PATH "host.list"
# 空配列の作成
$HOST_NAME_LIST = @()
$HOST_IP_LIST = @()
$HOST_USER_LIST = @()
$HOST_PASS_LIST = @()
# 『host.list』読込み
Foreach ($i in Get-Content $LIST_FILE) {
# 空行・コメント行を無視する
If (($i -eq "") -Or ($i.substring(0,1) -eq "#")) {
Continue
}
# 変数へ代入
$HOST_NAME = $i | %{ $_.Split(",")[0]}
$HOST_IP = $i | %{ $_.Split(",")[1]}
$HOST_USER = $i | %{ $_.Split(",")[2]}
$HOST_PASS = $i | %{ $_.Split(",")[3]}
# 配列へ代入
$HOST_NAME_LIST = $HOST_NAME_LIST + $HOST_NAME
$HOST_IP_LIST = $HOST_IP_LIST + $HOST_IP
$HOST_USER_LIST = $HOST_USER_LIST + $HOST_USER
$HOST_PASS_LIST = $HOST_PASS_LIST + $HOST_PASS
}
# リストボックスを呼び出し、SeletedIndexを取得する
$SELECT_INDEX_NO = ListBox($HOST_NAME_LIST)
# 何も選択しなかった場合は処理を終了する
If ($SELECT_INDEX_NO -eq $null) {
exit
}
# RDP接続を行う
RDPConnect $HOST_IP_LIST[$SELECT_INDEX_NO] `
$HOST_USER_LIST[$SELECT_INDEX_NO] `
$HOST_PASS_LIST[$SELECT_INDEX_NO]
念のため、ファイルはここにあげておいた。