利用遠程桌面管理winserver集群


在適用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,直接雙擊使用也可以,至於生成密鑰要不要封之類的細節就看個人需求了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM