1. 程式人生 > >C#使用RDP遠端桌面

C#使用RDP遠端桌面

由於本人是做資料庫維護經常使用到遠端桌面,但是windows自帶的遠端桌面難以區分很不方便,所以我自己寫了一個RDP。
RDP一共修改了兩次。
第一種思路就是使用windows自帶的RDP,儲存成RDP檔案,然後寫個程式呼叫即可,但是這樣有個弊端,在沒有登入過的計算機上,需要重新輸入使用者名稱密碼,十分苦惱。

try
            {
                System.Diagnostics.Process.Start("mstsc.exe", address + ".rdp");
            }
            catch (Exception)
            {
                MessageBox.Show
("啟動失敗,可能沒有遠端檔案");
}

於是摒棄了第一種思路,開始寫第二種方法,自己可以手動新增RDP遠端資訊,然後呼叫COM元件來遠端,這就涉及到資料儲存,選擇XML吧
這是在百度找的XML操作文件,個人感覺相當好用

public static class XmlHelper
    {
        public static string XmlSerialize(object o, Encoding encoding)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                XmlSerializeInternal(stream, o, encoding);

                stream.Position = 0
; using (StreamReader reader = new StreamReader(stream, encoding)) { return reader.ReadToEnd(); } } } /// /// 從XML字串中反序列化物件 /// /// 結果物件型別 /// 包含物件的XML字串 /// 編碼方式 /// 反序列化得到的物件 public static
List<RDP> XmlDeserialize(string s, Encoding encoding) { if (string.IsNullOrEmpty(s)) throw new ArgumentNullException("s"); if (encoding == null) throw new ArgumentNullException("encoding"); XmlSerializer mySerializer = new XmlSerializer(typeof(List<RDP>)); using (MemoryStream ms = new MemoryStream(encoding.GetBytes(s))) { using (StreamReader sr = new StreamReader(ms, encoding)) { return (List<RDP>)mySerializer.Deserialize(sr); } } } private static void XmlSerializeInternal(Stream stream, object o, Encoding encoding) { if (o == null) throw new ArgumentNullException("o"); if (encoding == null) throw new ArgumentNullException("encoding"); XmlSerializer serializer = new XmlSerializer(o.GetType()); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.NewLineChars = "\r\n"; settings.Encoding = encoding; settings.IndentChars = " "; using (XmlWriter writer = XmlWriter.Create(stream, settings)) { serializer.Serialize(writer, o); writer.Close(); } } /// /// 將一個物件按XML序列化的方式寫入到一個檔案 /// /// 要序列化的物件 /// 儲存檔案路徑 /// 編碼方式 public static void XmlSerializeToFile(object o, string path, Encoding encoding) { if (string.IsNullOrEmpty(path)) throw new ArgumentNullException("path"); using (FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write)) { XmlSerializeInternal(file, o, encoding); } } /// /// 讀入一個檔案,並按XML的方式反序列化物件。 /// /// 結果物件型別 /// 檔案路徑 /// 編碼方式 /// 反序列化得到的物件 public static List<RDP> XmlDeserializeFromFile(string path, Encoding encoding) { if (string.IsNullOrEmpty(path)) throw new ArgumentNullException("path"); if (encoding == null) throw new ArgumentNullException("encoding"); string xml = File.ReadAllText(path, encoding); return XmlDeserialize(xml, encoding); } }

這是設計的介面
我是將所有的RDP資訊放在LIST裡面,然後寫在XML中,再讀取出來。

下面就是RDP一些設定,我的思想上,用tabcontral,一個遠端就動態構造一個tabpege但是沒有關閉啊!於是我在百度上找了一個在tabpage上面繪畫關閉按鈕的程式碼,總之很多很多啊這是c#新增遠端控制元件的方法
這裡也很簡單,就是一些設定前期怎麼也找不到,後來發現並不是在構造的例項裡面設定的。

IMsRdpClientAdvancedSettings7 AdvancedSettings7 = (IMsRdpClientAdvancedSettings7)RDP.AdvancedSettings;
            AdvancedSettings7.RedirectClipboard = rdp.Clipbrd;
            AdvancedSettings7.RedirectDrives = rdp.Disk;
            if (rdp.Port != null && rdp.Port != "")
                AdvancedSettings7.RDPPort = int.Parse(rdp.Port);
            AdvancedSettings7.ClearTextPassword = rdp.PassWord;
            AdvancedSettings7.ConnectToServerConsole = true;
            AdvancedSettings7.ConnectToAdministerServer = true;
            RDP.Connect();
            tab_rdp.SelectedTab = tp;

原來還有個AdvancedSettings7 裡面可以設定剪下板,磁碟對映之類的。