Windows環境だと通常リモートデスクトップ(以下RDP)でサーバの管理を行う。
IPアドレスやアカウントのリストはExcelで管理されているので個別にRDPを起動してIDとパスワードを入力するのがほとんどだと思う。
リモートデスクトップ接続マネージャーという便利なツールもあるが、個別にダウンロードして設定しないと使えない。
インストール不要、既にあるアカウントリストのExcelファイルだけで自動でRDP接続する方法を紹介します。
この記事は、
- 何度もRDP接続するのが手間だ
- ツールを使わずExcelだけでRDPしたい
- パスワード入力やゲートウェイの情報も自動で入れたい
こんな方に読んでもらいたいです。
自動ログインする方法
まずは自動ログインを行う流れを説明するので、実際にやりたい内容と合っているか確認してください。
Excelのアカウントリストを使います。
接続に必要な情報が書かれています。
- IPアドレス(サーバ)
- ユーザー名
- パスワード
※この後のマクロの部分で説明します。
接続したい情報のある行を選択しておきます。
この例ではC4のセルを選択しています。
ここでALT+F8でマクロの一覧を表示させて「RDP接続」を動かします。
実行すると選択している行の情報を読み込んで接続を開始します。
接続までの流れは以上です。
今回は4行目を選択しているので4行目の情報を使用します。
ユーザー名やパスワードが空だった場合は確認の入力を求められるので、そこで入力してください。
入力したら自動で接続が始まります。
アカウントリストにマクロを設定する
実際にマクロを設定していきます。
今回は既にアカウントリストがある前提で進めていますが、無い場合は上の説明の画像と同じ内容で表を作って下さい。
ツールの[開発]から[Visual Basic]を選択して「Microsoft Visual Basic for Applications」を開く
ツールの[挿入]から[標準モジュール]を選択
真っ白な画面が出るので下のコードをコピーして貼り付けます。
'処理の待ち時間を待機する準備 Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Type 列の型 SV_IP As Long SV_ID As Long SV_PW As Long GW_IP As Long GW_ID As Long GW_PW As Long End Type Public Type 接続情報の型 SV_IP As String SV_ID As String SV_PW As String GW_IP As String GW_ID As String GW_PW As String End Type Dim ベースGW_IP, ベースGW_ID, ベースGW_PW As String Sub ベースGW情報を設定() ベースGW_IP = InputBox("ゲートウェイのIPを入力してください。") ベースGW_ID = InputBox("ゲートウェイのIDを入力してください。") ベースGW_PW = InputBox("ゲートウェイのPWを入力してください。") MsgBox "ゲートウェイ情報の設定が完了しました。" End Sub Sub RDP接続() 'アカウントリストに存在しないゲートウェイを使うか選択 ベースGW使用 = False '使う=True 使わない=False Dim 列 As 列の型 'サーバのIPの列番号 列.SV_IP = 2 'サーバのユーザ名の列番号 列.SV_ID = 3 'サーバのパスワードの列番号 列.SV_PW = 4 'ゲートウェイのIPの列番号 列.GW_IP = 5 'ゲートウェイのユーザ名の列番号 列.GW_ID = 6 'ゲートウェイのパスワードの列番号 列.GW_PW = 7 Dim 接続情報 As 接続情報の型 With ActiveWorkbook.ActiveSheet 選択行 = Selection.Row 接続情報.SV_IP = .Cells(選択行, 列.SV_IP) 接続情報.SV_ID = .Cells(選択行, 列.SV_ID) 接続情報.SV_PW = .Cells(選択行, 列.SV_PW) 接続情報.GW_IP = .Cells(選択行, 列.GW_IP) 接続情報.GW_ID = .Cells(選択行, 列.GW_ID) 接続情報.GW_PW = .Cells(選択行, 列.GW_PW) End With 'サーバ接続情報が足りない場合は入力画面を表示 If 接続情報.SV_IP = "" Then MsgBox "IPが設定されていません。処理を終了します。" Exit Sub End If If 接続情報.SV_ID = "" Then 接続情報.SV_ID = InputBox("サーバのユーザー名を入力してください。") End If If 接続情報.SV_PW = "" Then 接続情報.SV_PW = InputBox("サーバのパスワードを入力してください。") End If 'ベースGWが有の場合、ベースGWを使うか確認する画面を表示 If ベースGW使用 = True Then If MsgBox("ベースGWを使用しますか?", vbYesNo + vbQuestion, "確認") = vbYes Then 接続情報.GW_IP = ベースGW_IP 接続情報.GW_ID = ベースGW_ID 接続情報.GW_PW = ベースGW_PW End If Else 'ゲートウェイ接続情報が足りない場合は入力画面を表示 If 接続情報.GW_IP <> "" And 接続情報.GW_ID = "" Then 接続情報.GW_ID = InputBox("ゲートウェイのユーザー名を入力してください。") End If If 接続情報.GW_IP <> "" And 接続情報.GW_PW = "" Then 接続情報.GW_PW = InputBox("ゲートウェイのパスワードを入力してください。") End If End If '処理の待ち時間を設定 待機時間_処理待ち = 2000 待機時間_入力 = 100 'RDPを起動 rc = Shell("mstsc.exe", vbNormalFocus) Call Sleep(待機時間_処理待ち) Application.SendKeys 接続情報.SV_IP, True Call Sleep(待機時間_入力) Application.SendKeys "%{o}", True Call Sleep(待機時間_入力) Application.SendKeys "{TAB}", True Call Sleep(待機時間_入力) Application.SendKeys 接続情報.SV_ID, True Call Sleep(待機時間_入力) 'ゲートウェイタブ Application.SendKeys "+{TAB}", True Call Sleep(待機時間_入力) Application.SendKeys "+{TAB}", True Call Sleep(待機時間_入力) Application.SendKeys "{RIGHT 5}", True Call Sleep(待機時間_入力) Application.SendKeys "%{s}", True Call Sleep(待機時間_入力) If 接続情報.GW_IP <> "" Then 'ゲートウェイ情報 Application.SendKeys "%{u}", True Call Sleep(待機時間_入力) Application.SendKeys "%{s}", True Call Sleep(待機時間_入力) Application.SendKeys 接続情報.GW_IP, True Call Sleep(待機時間_入力) Application.SendKeys "~", True Call Sleep(待機時間_入力) '接続ボタン Application.SendKeys "%{n}", True Call Sleep(待機時間_処理待ち) 'ゲートウェイユーザー・パスワード入力 Application.SendKeys 接続情報.GW_ID, True Call Sleep(待機時間_入力) Application.SendKeys "{TAB}", True Call Sleep(待機時間_入力) Application.SendKeys 接続情報.GW_PW, True Call Sleep(待機時間_入力) Application.SendKeys "~", True Call Sleep(待機時間_処理待ち) Else Application.SendKeys "%{d}", True Call Sleep(待機時間_入力) Application.SendKeys "~", True Call Sleep(待機時間_入力) '接続ボタン Application.SendKeys "%{n}", True Call Sleep(待機時間_処理待ち) End If 'サーバパスワード入力 Application.SendKeys 接続情報.SV_PW, True Call Sleep(待機時間_入力) Application.SendKeys "~", True Call Sleep(待機時間_入力) End Sub
Trueにするとマクロを実行した際に、実際にゲートウェイを使用するか質問されるようになります。
よくわからない場合はFalseのままにしてください。
36〜40行目の数字はRDP接続するサーバのIPアドレス、ユーザー名、パスワードが書かれている列番号に必ず書き直してください。
42〜46行目の数字はゲートウェイのIPアドレス、ユーザー名、パスワードの列番号に必ず書き直してください。ゲートウェイの列が無い場合や使わない場合は999にしてください。
マクロは空白だと判断して個別に入力を求めるようになります。
設定が終わったら、Excelを名前を付けて保存で拡張子を.xlsmにして保存してください。
ALT+F8でマクロの一覧を表示させて「RDP接続」で動けば自動化の完了です。
アカウントリストにないキーボード操作や実行間隔はマクロで指定しています。
うまく動かない場合は、この後に記載する下記の詳細を確認してください。
- 手動でRDPできるか
- RDPのバージョンを確認する
- 処理待ち時間を長くする
動かない場合の確認(手動でRDPできるか)
マクロは手動でログイン出来る事を前提に作成しています。
リモートデスクトップを開いて、アカウントリストにあるユーザ名とパスワードでログインできるか手動で確認してください。
手動で接続できない場合は、接続先のサーバが停止していたりRDPサービスが停止している可能性があります。
またIPアドレス、ユーザー名、パスワードいずれか又は複数の間違いの可能性もあるので手動で接続できる事を確認してからマクロを試してください。
動かない場合の確認(RDPのバージョンが合っているか)
RDPもWindowsのソフトなのでバージョンがあります。
この記事のマクロはRDPファイルバージョン10.0.19041.1266を参考にして作成しています。
ご自身の使っているRDPとバージョンに違いがあるか確認してください。
下記フォルダを開きます。
フォルダ内にあるmstsc.exeを右クリックしてプロパティを開きます。
次にプロパティの詳細タブを選択するとファイルバージョンが確認できます。
バージョンが違う場合はマクロが動作しない恐れがあるのでご了承ください。
動かない場合の確認(処理待ち時間を長くする)
RDPはソフトの起動や接続先サーバからの応答を確認する為、ネットワークやパソコンの処理によって動作が遅くなる事があります。
デフォルトでは処理待ちは2秒間の待機、文字入力などは0.1秒の間隔を開けて実行しています。
RDPソフトの起動が2秒以上かかる場合は、この時間を長くする事で改善する可能性があります。
時間の設定はマクロの○行目になります。
例えば処理待ち時間を4秒に変える場合は下記のようにします。
アカウントリストに存在しないゲートウェイを使う場合の操作
ここからはアカウントリストに、ゲートウェイの情報が無い場合の使い方を説明します。
RDPの場合はその呼び名がゲートウェイとなっています。
ゲートウェイはサーバのアカウントリストとは別で管理される事があるので、このような作りにしました。
それでは説明します。
マクロコピー後に32行目のベースGW使用をTrueに変更してください。
ゲートウェイの情報がない状態なので、最初に登録します。
Excelを起動したら、ALT+F8でマクロの一覧を表示させて「ベースGW情報を設定」を動かします。
するとゲートウェイのIPアドレス、ユーザー名、パスワードを求められるので3回入力します。
「ゲートウェイ情報の設定が完了しました。」と表示されれば準備完了です。
間違えた場合は「ベースGW情報を設定」を再度実行してください。
この設定はExcelファイルを一度閉じると消えるので、Excelファイルを開いて1度設定したら閉じずに使用することをおススメします。