在适用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,直接双击使用也可以,至于生成密钥要不要封之类的细节就看个人需求了