日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C#實現Windows Server遠程桌面RDP文件用戶的密碼加密、解密算法并自動登錄,親測可用!

admin
2021年6月17日 22:57 本文熱度 6200
背景:由于項目需要,使用RDP文件來遠程登錄,需要實現點擊rdp文件就可以自動連接遠程桌面,并且實現自動登錄功能!自動登錄!自動登錄!

自動登錄:密碼需要經過加密,本文的核心!!!廢話少說,看代碼!


1、首先添加“引用”是必須的!

using System;

using System.Security.Cryptography;


2、核心算法

using System;

using System.Security.Cryptography;

static byte[] s_aditionalEntropy = null;         //附加的加密因子,自定義


private void test()

{

    string plainText = "qweR+-*yuioP0";        //此處提供原始密碼

    byte[] secret = Encoding.Unicode.GetBytes(plainText);

    byte[] encryptedSecret = Protect(secret);

    Console.WriteLine("The encrypted byte array is:");

    string res = string.Empty;

    foreach(byte b in encryptedSecret)

    {

        res += b.ToString("X2");  //炒雞坑爹的,轉換16進制的一定要用2位,不然就像我一樣被坑了半個多月

    }    

    Console.WriteLine("加密之后的密碼:" + res);

    PrintValues(encryptedSecret);

    // Decrypt the data and store in a byte array.

    byte[] originalData = Unprotect(encryptedSecret);

    Console.WriteLine("{0}The original data is:", Environment.NewLine);

    string str = Encoding.Default.GetString(originalData);

    Console.WriteLine("解密之后的密碼: " + str);

    PrintValues(originalData);

}


//加密方法

public static byte[] Protect(byte[] data)

{

    try

    {

        // Encrypt the data using DataProtectionScope.CurrentUser. The result can be decrypted

        //  only by the same current user.

        return ProtectedData.Protect(data, s_aditionalEntropy, DataProtectionScope.LocalMachine);

    }

    catch (CryptographicException e)

    {

        Console.WriteLine("Data was not encrypted. An error occurred.");

        Console.WriteLine(e.ToString());

        return null;

    }

}


//解密方法

public static byte[] Unprotect(byte[] data)

{

    try

    {

        //Decrypt the data using DataProtectionScope.CurrentUser.

        return ProtectedData.Unprotect(data, s_aditionalEntropy, DataProtectionScope.LocalMachine);

    }

    catch (CryptographicException e)

    {

        Console.WriteLine("Data was not decrypted. An error occurred.");

        Console.WriteLine(e.ToString());

        return null;

    }

}


public static void PrintValues(Byte[] myArr)

{

    foreach (Byte i in myArr)

    {

        Console.Write("\t{0}", i);

    }

    Console.WriteLine();

}

總結:

  • 生成的字節數組直接轉換成16進制輸出,添加到rdp文件的密碼里面就會解析不出來;
  • 坑爹的轉換成16進制時需要占位2位,不然就出錯,弄了N久才搞定!


3、自動登錄代碼(親測可用,實現了完全的自動登錄):

string ip = "192.168.0.21";   //如果是其他端口,則形如192.168.0.21:888

string username = "administrator";     //連接用戶名

string password = "qweR+-*yuioP0";     //連接密碼

if (username != "" && password != "")

{

    byte[] secret = Encoding.Unicode.GetBytes(password);

    byte[] encryptedSecret = Protect(secret);

    string res = string.Empty;

    //炒雞坑爹的,轉換16進制的一定要用2位

    foreach (byte b in encryptedSecret) { res += b.ToString("X2"); }

    File.WriteAllText("conn.rdp", $"full address:s:{ip}\nusername:s:{username}\npassword 51:b:{res}");

    Process.Start("mstsc.exe", "conn.rdp");

}

else

{

    Process.Start("mstsc", $"/v:{ip} /console");

}


4、附RDP文件的一些注釋(轉)

上面3中的rdp配置文件只提供了IP、username、password三個字段,完整信息如下,可以根據實際需要添加其他字段:

screen mode id:i:1 

desktopwidth:i:1280 

desktopheight:i:750 

session bpp:i:24 

winposstr:s:2,3,188,8,1062,721 

full address:s:MyServer    //服務器地址 一般填IP地址

compression:i:1 

keyboardhook:i:2 

audiomode:i:0 

redirectdrives:i:0 

redirectprinters:i:0 

redirectcomports:i:0 

redirectsmartcards:i:0 

displayconnectionbar:i:1 

autoreconnection enabled:i:1  

username:s:MyUserName   //用戶名

domain:s:MyDomain    //域名 可以不填。

alternate shell:s: 

shell working directory:s: 

password 51:b:01000000D08C9DDF0115D1118C7A00C04FC297EB0100000052A9E191EA75A948B359790578C9371A0000000008000000700073007700000003660000A8000000100000000A1DCCD2E50775CA25EC3857164B34DC0000000004800000A000000010000000FCE1A645B9B61AA450946BB6F955058108020000D83591CA47562D6DDAA689F050AE145039EBE22E00D1D3AEAA98373C7B63C3E8E7149072DF989EA43EFCE20513AD3D27B11BE7F17066A688E1DCE828AF85460AAC327B38E90776DB962888E4393D19637578984B19A187AAD95F6D2726ADE7DD315FF56C15FF5B3031014EDDCC3C24D1B81779AFDB006EE575F5BEFB8D2D2138D9D9D642BBB251CC5ED7226968764856EC660A646BACE748A13D6002A9A537AA70710615650B9387EED66DE28BD57B304BBDD7B581B943DA628EB0289E30A8BA784B76F7885BECCAB4FEF7820E97EE3C6E036EEAF6EAA669288DF2FCACC9BEC045C907EBBDE87AFB8CC6B07A600BD63AC891B61D95C2265DD9FD5E635D61BFBF5EDC28311375066611C610FB533D64515B643C82F57D9B183B05C156D91BC0974D38E546022B139E82452E6F1EDF76E52F732C3904E5E433F8F3D488DB0698427DBB0791A9F207F8CB6654CB8410BAF4A59C4F9E821E589ABC1E6E6E1D432181B690408F6884FE1007895A4D26D4A5A2C7458EE747DA35D44AC9FB08AB5477EA3E7CCDB3E37EE20FAFD0D0CF9584E420598B7003B347943AC28048F45E0FD21AD08148FFADCE0E7877219259A7BE722FFAE845A429BA2CF0A71F2D19EA7495530FABDB5106E8D404A38A7E6394C38457640EA7398C5D55F0C4D342CC6A39C77E10A2A5145AEA40B14F5C7C3760334D83C9BE748383FADE231248537353817D51F7B44F61B406ABC61400000071C354139F458B02D978015F785B97F7F6B307380    //這么一長串就是密碼了,“password 51:b:”后面改為你自己生成的密碼串

disable wallpaper:i:1 

disable full window drag:i:1 

disable menu anims:i:1 

disable themes:i:0 

disable cursor setting:i:0 

bitmapcachepersistenable:i:1


該文章在 2025/3/5 13:09:14 編輯過

全部評論2

admin
2021年6月17日 23:22
可以用這個程序對比你生成的密碼是否一致。
admin
2021年6月17日 23:48

最近由于項目需要,需要做一個rdp文件上成,然后可以直接連遠程桌面的功能,在度娘和谷叔搜索一番,所得甚少。閑話少說,來點干貨:


看看系統給提供的是啥樣的


我們要關心得是 用戶名和密碼,其他參數可以慢慢了解,可是這個密碼是怎么加密的呢?

使用的是一個win32里面一個叫crypt32.dll的CryptProtectData方法,好了,關鍵的時候來咯~~~~

 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

internal struct DATA_BLOB
{
    public int cbData;
    public IntPtr pbData;
}
 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
internal struct CRYPTPROTECT_PROMPTSTRUCT
{
    public int cbSize;
    public int dwPromptFlags;
    public IntPtr hwndApp;
    public string szPrompt;
}
 [DllImport("crypt32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern bool CryptProtectData(ref DATA_BLOB pDataIn, string szDataDescr, ref DATA_BLOB pOptionalEntropy, IntPtr pvReserved, ref CRYPTPROTECT_PROMPTSTRUCT pPromptStruct, int dwFlags, ref DATA_BLOB pDataOut);

引用一下win32程序為我們生成密碼。

private static string Encrypt(string password)
 2 {
 3     byte[] bytes = Encoding.Unicode.GetBytes(password);
 4     DATA_BLOB dATA_BLOB = default(DATA_BLOB);
 5     DATA_BLOB dATA_BLOB2 = default(DATA_BLOB);
 6     DATA_BLOB dATA_BLOB3 = default(DATA_BLOB);
 7     dATA_BLOB.cbData = bytes.Length;
 8     dATA_BLOB.pbData = Marshal.AllocHGlobal(bytes.Length);
 9     Marshal.Copy(bytes, 0, dATA_BLOB.pbData, bytes.Length);
10     dATA_BLOB3.cbData = 0;
11     dATA_BLOB3.pbData = IntPtr.Zero;
12     dATA_BLOB2.cbData = 0;
13     dATA_BLOB2.pbData = IntPtr.Zero;
14     CRYPTPROTECT_PROMPTSTRUCT cRYPTPROTECT_PROMPTSTRUCT = new CRYPTPROTECT_PROMPTSTRUCT
15     {
16         cbSize = Marshal.SizeOf(typeof(CRYPTPROTECT_PROMPTSTRUCT)),
17         dwPromptFlags = 0,
18         hwndApp = IntPtr.Zero,
19         szPrompt = null
20     };
21     if (CryptProtectData(ref dATA_BLOB, "psw", ref dATA_BLOB3, IntPtr.Zero, ref cRYPTPROTECT_PROMPTSTRUCT, 1, ref dATA_BLOB2))
22     {
23          if (IntPtr.Zero != dATA_BLOB.pbData)
24          {
25               Marshal.FreeHGlobal(dATA_BLOB.pbData);
26          }
27          if (IntPtr.Zero != dATA_BLOB3.pbData)
28          {
29               Marshal.FreeHGlobal(dATA_BLOB3.pbData);
30          }
31          byte[] array = new byte[dATA_BLOB2.cbData];
32          Marshal.Copy(dATA_BLOB2.pbData, array, 0, dATA_BLOB2.cbData);
33          return BitConverter.ToString(array).Replace("-", string.Empty);
34     }
35     return string.Empty;
36 }

有密碼了,替換掉開始另存為的文件里的密碼,我們自己的rdp文件就有咯!

附一個文件內容方法

private static void rdpProfile(string filename, string address, string username, string password, string colordepth)

{

    if (File.Exists(filename))

    {

        File.Delete(filename);

    }

    using (StreamWriter streamWriter = new StreamWriter(filename, true))

    {

        streamWriter.WriteLine("screen mode id:i:2");

        streamWriter.WriteLine("desktopwidth:i:0");

        streamWriter.WriteLine("desktopheight:i:0");

        streamWriter.WriteLine("session bpp:i:" + colordepth);

        streamWriter.WriteLine("winposstr:s:0,1,0,0,1234,792");

        streamWriter.WriteLine("compression:i:1");

        streamWriter.WriteLine("keyboardhook:i:2");

        streamWriter.WriteLine("audiocapturemode:i:0");

        streamWriter.WriteLine("videoplaybackmode:i:1");

        streamWriter.WriteLine("connection type:i:6");

        streamWriter.WriteLine("displayconnectionbar:i:1");

        streamWriter.WriteLine("disable wallpaper:i:1");

        streamWriter.WriteLine("allow font smoothing:i:1");

        streamWriter.WriteLine("allow desktop composition:i:1");

        streamWriter.WriteLine("disable full window drag:i:1");

        streamWriter.WriteLine("disable menu anims:i:1");

        streamWriter.WriteLine("disable themes:i:1");

        streamWriter.WriteLine("disable cursor setting:i:0");

        streamWriter.WriteLine("bitmapcachepersistenable:i:0");

        streamWriter.WriteLine("full address:s:" + address);

        streamWriter.WriteLine("audiomode:i:0");

        streamWriter.WriteLine("redirectprinters:i:0");

        streamWriter.WriteLine("redirectcomports:i:0");

        streamWriter.WriteLine("redirectsmartcards:i:0");

        streamWriter.WriteLine("redirectclipboard:i:1");

        streamWriter.WriteLine("redirectposdevices:i:0");

        streamWriter.WriteLine("redirectdirectx:i:1");

        streamWriter.WriteLine("drivestoredirect:s:");

        streamWriter.WriteLine("autoreconnection enabled:i:1");

        streamWriter.WriteLine("authentication level:i:2");

        streamWriter.WriteLine("prompt for credentials:i:0");

        streamWriter.WriteLine("negotiate security layer:i:1");

        streamWriter.WriteLine("remoteapplicationmode:i:0");

        streamWriter.WriteLine("alternate shell:s:");

        streamWriter.WriteLine("shell working directory:s:");

        streamWriter.WriteLine("gatewayhostname:s:");

        streamWriter.WriteLine("gatewayusagemethod:i:4");

        streamWriter.WriteLine("gatewaycredentialssource:i:4");

        streamWriter.WriteLine("gatewayprofileusagemethod:i:0");

        streamWriter.WriteLine("promptcredentialonce:i:1");

        streamWriter.WriteLine("use redirection server name:i:0");

        streamWriter.WriteLine("use multimon:i:0");

        if (!string.IsNullOrEmpty(username))

        {

            streamWriter.WriteLine("username:s:" + username);

        }

        if (!string.IsNullOrEmpty(password))

        {

            streamWriter.WriteLine("password 51:b:" + password);

        }

    }

}


該評論在 2021/6/17 23:50:37 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 欧美色欧洲免费无线码 | 中国领先的综合视频网站 | 99在线观看视频免费精品9 | 桃花视频免| 日韩精品一区二区三区在线观看 | 在线视频观看免费视频18 | 国产网站免费精品网站 | 亚洲精品一区二区三区四区高清 | 尤物视频在线免费观看 | 亚洲男同gv在线观看 | 秋霞网国产 | 国产精品素人福利 | 热播影视剧在线观看 | 日本成人动漫私人影院 | 亚洲日本aⅴ片在线观看香蕉 | 亚洲欧美国产精品一区二区 | 看一级特黄a大一片电影 | 亚洲手机在线人成网站 | 午夜国产精品蝌蚪在线观看 | 国产精品专区第一页 | 福利导航 | 色综合伊人色综合网站 | 国产网站大全在线观看 | 秋霞理伦韩国在线电影 | 干天堂在| 精品无人区 | 日韩一级一欧美一级国产 | 日韩精品一区二区三区在线观看 | 亚洲色成人www永久网站 | 激情综合五月 | 亚洲欧美日韩国产精品专区网 | 91福利国产在线 | 国产精品亲子乱子伦xxxx | j8又粗又大又长又爽又硬电影 | 911精品国产一区二区在线 | 人与禽性视频77777 | 亚洲精品在看在线观看高清 | 亚洲国产剧情一区在线观看 | 又粗又大又黄又爽的免费视频 | 国产日韩高清制服一区 | 国产99视频精品免费视频6 |