利用远程桌面管理winserver集群

在适用mstsc链接winserver服务器的场景下(别问为何不VNC),能够利用rdp文件等方式减轻链接的操做负担html

  • 利用.rdp文件免密登陆

rdp文件本质上是一个mstsc的选择,或者不如说mstsc的手动链接窗口是一个由系统管理的rdp文件。服务器

> mstsc --helpdom

在mstsc命令中能够利用已有的rdp文件(中的已有信息)来补全当次的远程链接,最简单的rdp文件包含地址、用户名、密码ide

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的工具spa

若是有特殊场景不能使用不明exe,或者场景复杂须要批量操做,能够本身C++实现 ,有一些宽字符之类的细节,使用能够参考(一个10年前的文章).net

https://www.codeproject.com/Articles/59882/Decrypt-Remote-Desktop-Mobile-passwordcode

懒得看英文说明直接照抄转了八百手的博客也行↓这已经不知道是第几百手了server

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,直接双击使用也能够,至于生成密钥要不要封之类的细节就看我的需求了