RDP接続で別ユーザにPCを(一時的に)使えるようにしたい、という要望があったので、バッチファイルで解決することになりました。そのやってみた内容をご報告です。
※注意点:本記事のバッチファイルはBitDefenderで誤検知されるので、ご自身の判断でご確認ください。
経緯と動機
やりたいことは、「mstsc -v PC01」でアクセスできるPC01へのリモートデスクトップを、別のユーザに一時的に提供したい、というものです。しかし、一時的に使用できるようにしつつ、そのリモートデスクトップ接続で使うユーザ名とパスワードを(一時的に使わせるユーザには)公開せず、対象ユーザのPCにも残らない形で接続できるようにしたい、とのことです。

条件としては、人間にユーザ名とパスワードを伝えずにRDP接続を使わせることができるようにすること、というポイントがあります。バッチファイルでなんとかできそうな感じもします。
なお、一時的に利用するユーザ側はそれほど詳しくないのでパスワードが平文でそのまま記載されているようなことがなければ問題なしという条件もありました。
いつも使っているバッチファイル
いつもリモートデスクトップ接続を平易にしているバッチファイルをひな形として、これを改造して条件を満たしてみようと思いました。(PC内だけで使う自分用なのでユーザ名もパスワードも平文となっています。)
--------------------------------------------------------------
※元のバッチファイル
--------------------------------------------------------------
@Echo off
Set SERVER=PC01
Set USERNAME=USERNAME
Set PASSWORD=PA$sword-1
Cmdkey /generic:TERMSRV/%SERVER% /user:%USERNAME% /pass:%PASSWORD%
pushd "c:\Windows\system32"
Start mstsc.exe /v:%SERVER%
echo 一時的に追加した認証情報をしばらく待って削除します。
timeout /T 30
Cmdkey /delete:TERMSRV/%SERVER%
popd
--------------------------------------------------------------
この平文の部分だけ、何とか難読化できれば条件を満たせると考えました。
Base64化して難読化で躓いたポイント
Base64化すると、バッチファイルを開くだけでは平文パスワードが判読可能な状態ではないため、条件を満たせそうです。ただしBase64は暗号化ではないので知っている人ならすぐ複合化できます。この辺りを割り切ってやってみることにします。
生成はPowerShellコマンドレットで実行します。
パスワードが「$」を含んでいることで、何度か失敗をしてうまく動作しないBase64文字列が生成されてしまったのですが、以下で成功しました。
--------------------------------------------------------------
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes('USERNAME:PA$sword-1'))
--------------------------------------------------------------
最初Base64化する文字列を「"」(ダブルコーテーション)で囲んでいたのですが、どうもそれではうまくいかず、他のバッチファイルで学んだように「'」(シングルクォート)で囲む必要がある、ということに気づき、Base64文字列の生成ができました。
確認は
--------------------------------------------------------------
[Text.Encoding]::UTF8.GetString( [Convert]::FromBase64String("生成されたBase64文字列"))
--------------------------------------------------------------
で画面表示されるので確認可能です。
ハマった(時間が掛かった)ポイントとして、最初に前述の「"」(ダブルコーテーション)を使っていた時に、生成されたBase64文字列を確認すると、期待した表示「USERNAME:PA$SWORD
」とならずに、実際には「USERNAME:PA
」と表示されて、なぜだろうとハマりました。
内部の話になりますが、「PA$sword-1」という文字列は「"」(ダブルコーテーション)を使うと、「PA」という文字列と「$sword-1」という変数(中身は空っぽの変数)の組み合わせとして扱われるようです。記号を使うパスワードをBase64化する場合は注意が必要という学びでした。
ともあれ、つまづきはありましたが、Base64化した文字列の生成ができました。
バッチファイル修正(ポイントのみ)
元のバッチファイルを以下のように変更しました。
※元のバッチファイルの変更した部分
--------------------------------------------------------------
Set SERVER=PC01
Set USERNAME=USERNAME
Set PASSWORD=PA$sword-1
--------------------------------------------------------------
ここを、以下のように変更。
※変更した部分
--------------------------------------------------------------
for /f "delims=" %%A in ('powershell -NoProfile -Command "[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('BASE64文字列'))"') do set CREDS=%%A
set USERNAME=%CREDS%
set PASSWORD=%CREDS%
set USERNAME=%USERNAME::=&rem.%
set PASSWORD=%PASSWORD:*:=%
rem -------デバッグ用
rem echo CREDS=[%CREDS%]
rem echo USERNAME=[%USERNAME%]
rem echo PASSWORD=[%PASSWORD%]
rem pause
Set SERVER=PC01
--------------------------------------------------------------
平文で入力していた%USERNAME%と%PASSWORD%は、あらかじめ生成したBASE64文字列から取得するように変更しました。rem文でコメントアウトしていますが、正しくBASE64文字列が認識していることを確認するようにecho行で確認できるようにしています。
また「%USERNAME::=&rem.%」でコロン以降を削除、「%PASSWORD:*:=%」ではコロンより以前を削除してそれぞれの変数に代入しています。
しかし、完成したバッチファイルを保存すると、
ZEROスーパーセキュリティが誤検知してしまう。

Base64化した文字列を使って、mstscしているというのがどうも引っかかるということなんでしょうか。

他のセキュリティスイート(Windows DefenderやMcAfee、Nortonなど)では検知しないので、BitDefenderで誤検知される、という結論としました。
完成したバッチ(全文)
こうしてあまりすっきりしない形になってしまった感じがあるのですが、BitDefenderで誤検知されてしまう仕様の完成したバッチファイルが以下となります。実際は事前に生成したBASE64文字列をバッチファイル内に記載しています。
--------------------------------------------------------------
@Echo off
if not "%1" == "1" (
start /min cmd /c call "%~f0" 1
exit
)
for /f "delims=" %%A in ('powershell -NoProfile -Command "[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('BASE64文字列'))"') do set CREDS=%%A
set USERNAME=%CREDS%
set PASSWORD=%CREDS%
set USERNAME=%USERNAME::=&rem.%
set PASSWORD=%PASSWORD:*:=%
rem -------デバッグ用
rem echo CREDS=[%CREDS%]
rem echo USERNAME=[%USERNAME%]
rem echo PASSWORD=[%PASSWORD%]
rem pause
Set SERVER=PC11
Cmdkey /generic:TERMSRV/%SERVER% /user:%USERNAME% /pass:%PASSWORD%
pushd "c:\Windows\system32"
Start mstsc.exe /v:%SERVER%
rem echo 一時的に追加した認証情報をしばらく待って削除します。
timeout /T 30
Cmdkey /delete:TERMSRV/%SERVER%
popd
Set SERVER=
Set USERNAME=
Set PASSWORD=
--------------------------------------------------------------
ただ、やっぱりセキュリティスイートに警告されるバッチというのはどうなのかなぁと思うところもあります。動作確認はしましたが、動作に問題はないことは確認できました。