最初にまとめ
検証したOSはWindowsServer2016 ドメインに参加したPC+ドメインユーザーでログインの環境からドメインに参加していないPCへRDP接続の許可設定を遠隔でやろうという試み。対象のPCの管理者アカウントのログイン情報を知っている前提。
全体的な流れとしては
- リモートレジストリの起動
- リモートデスクトップ許可の値をレジストリに追加
- ファイアウォールの設定を追加
ドメインに参加しているマシンからワークグループのマシンへSCコマンドを実行する時は runasコマンドに/netonlyオプションを付けると良い
リモートレジストリの起動
おそらくWindows10以降の世代ではRemoteRegistryの設定がデフォルトでは無効になっている。無効→手動の設定に切り替える
※{pcname}:リモート先のPC {username}:リモート先のユーザーアカウント
runas /user:{pcname}\{username} "sc \\{pcname} config RemoteRegistry start=demand"
次はサービスのスタート
runas /user:{pcname}\{username} "sc \\{pcname} start RemoteRegistry"
これで動いて欲しいのですが、パスワードが違うと蹴られちゃいます。
細かい動きは理解できていないのですが、/netonlyオプションを追記するとうまくいく
runas /netonly /user:{pcname}\{username} "sc \\{pcname} config RemoteRegistry start=demand"
runas /netonly /user:{pcname}\{username} "sc \\{pcname} start RemoteRegistry"
リモートデスクトップ許可の値をレジストリに追加
レジストリへの値追加 fDenyTSConnecitonsを0にします(1はリモート不可)
runas /netonly /user:{pcname}\{username} "reg add \"\\{pcname}\HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\" /v fDenyTSConnections /t REG_DWORD /d 00000000"
reg addコマンドを『"』(ダブルクォーテーション)で囲っています。今回の場合は囲った中のレジストリキーにスペースが入っているのでさらにそれを『"』で囲いたい。『"』で囲った中でさらに『"』を使いたい場合は『"』の前に『\』を付けて『\"』と記述します。
ファイアウォールの設定
下記のコマンドを実行したい。余談ですが、日本語OS環境の場合は指定するgroup名が日本語で入っているので日本語で指定しないといけないらしい(なんかヤダ…)
netsh advfirewall firewall set rule group="リモート デスクトップ" new enable=yes
netshコマンドのリモート実行については下記の情報があった
■以下だと失敗します。
C:\ netsh set machine name=10.0.0.1 user=10.0.0.1\username pwd=xxxxxxxx
■以下のとおり netsh コンテキストから実行すると無事成功し、リモートコンピュータのネットワーク設定が可能となります
C:\ netsh
netsh>set machine name=10.0.0.1 user=10.0.0.1\username pwd=xxxxxxxx
[10.0.0.1] netsh>
引用元:【解決】netsh でリモート管理が出来ない場合の対処 | Windows 10
権限設定まではできているようだったが、肝心のFirewallの設定コマンドは拒否されてしまった。色々試したがらちが明かなかったので、PsExecでFirewallを設定した。
PsExec.exe \\{pcname} -u {pcname}\{username} -p {password} netsh advfirewall firewall set rule group="リモート デスクトップ" new enable=yes
じゃあ全部PsExecでやれよって話になっちゃいますがご容赦ください(笑)
まとめ
事情があってドメインに参加させていないWindowsマシンにリモート接続する必要があった際に色々大変だったので、なんとか遠隔から設定できないか調べた結果のまとめました。ドメイン・非ドメインの混在環境でのユーザーアクセス権周りはややこしいですね。