在適用mstsc連線winserver伺服器的場景下(別問為什麼不VNC),可以利用rdp檔案等方式減輕連線的操作負擔
- 利用.rdp檔案免密登入
rdp檔案本質上是一個mstsc的選擇,或者不如說mstsc的手動連線視窗是一個由系統管理的rdp檔案。
> mstsc --help
在mstsc命令中可以利用已有的rdp檔案(中的已有資訊)來補全當次的遠端連線,最簡單的rdp檔案包含地址、使用者名稱、密碼
address:s:遠端桌面地址 username:s:使用者名稱 password 51:b:加密後的密碼
如只提供部分資訊,如不包含地址,在指令中補全即可
mstsc D://file.rdp -v:10.10.2.128
rdp檔案麻煩的地方在於password是經過一次加密的,加密方法在crypt32.lib,WinCrypt.h是有的
BOOL WINAPI CryptProtectData ( DATA_BLOB * pDataIn , LPCWSTR szDataDescr , DATA_BLOB * pOptionalEntropy , PVOID pvReserved , CRYPTPROTECT_PROMPTSTRUCT * pPromptStruct , DWORD dwFlags , DATA_BLOB * pDataOut ) ;
直接使用rdp加密工具即可,百度一大堆,應該也都是封了CryptProtectData的工具
如果有特殊場景不能使用不明exe,或者場景複雜需要批量操作,可以自己C++實現 ,有一些寬字元之類的細節,使用可以參考(一個10年前的文章)
https://www.codeproject.com/Articles/59882/Decrypt-Remote-Desktop-Mobile-password
懶得看英文說明直接照抄轉了八百手的部落格也行↓這已經不知道是第幾百手了
https://blog.csdn.net/wzsy/article/details/14120853
void main ( ) { DATA_BLOB DataIn ; DATA_BLOB DataOut ; // mstsc.exe中使用的是unicode,所以必須做寬字元轉換 BYTE * pbDataInput = ( BYTE * ) L "freedom" ; DWORD cbDataInput = wcslen ( L "freedom" ) * sizeof(wchar_t ) ; DataIn . pbData = pbDataInput ; DataIn . cbData = cbDataInput ; if ( CryptProtectData ( &DataIn, L"password", NULL, NULL, NULL, 0, &DataOut ) ) { printf ( "The encryption phase worked.\n" ) ; int count = 0 ; while ( count // 因為一個unsigned int 佔32位 // 轉換成成16進位制要佔兩位 // 所以這裡需要用%02 printf ( "%02X" , DataOut . pbData [ count ] ) ; count ++ ; } else { printf ( "Encryption error using CryptProtectData.\n" ) ; return - 1 ; } }
- 進一步減少操作:忽略證書和連結身份確認
使用rdp開啟遠端連線需要進行兩次確認,證書的跳過方法參照
https://stackoverflow.com/questions/20686361/how-to-ignore-the-certificate-warning-on-remote-desktop-connection
reg add "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client" /v "AuthenticationLevelOverride" /t "REG_DWORD" /d 0 /f
rdp的簽名則可以參照
https://vircloud.net/operations/rdpsign.html
或者也直接上登錄檔,參照
https://blog.csdn.net/weixin_41111659/article/details/893722537
建立一個test.reg
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\LocalDevices] "127.0.0.1"=dword:0000004c
或者直接使用cmd
reg add "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\LocalDevices" /v "127.0.0.1" /t "REG_DWORD" /d 76
- 根據適用場景的封裝
在我這個環境下,很多server屬於同一個網段,且使用者密碼都一樣,所以不用為每一個server建立一個rdp,只建立一個含使用者密碼的rdp檔案即可:ys.rdp
然後稍微包一個bat指令碼
set input=%1% echo %input% ^ ^ @start reg add "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\LocalDevices" /v "127.0.0.%input%" /t "REG_DWORD" /d 76 @start mstsc F://ys.bat -v:127.0.0.%input%
需要的時候直接可以連線127.0.0.125
>ys.bat 125
如果server情況比較複雜,根據密碼錶批量建立對應的rdp,直接雙擊使用也可以,至於生成金鑰要不要封之類的細節就看個人需求了