C#使用RDP遠端桌面
阿新 • • 發佈:2019-02-06
由於本人是做資料庫維護經常使用到遠端桌面,但是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 裡面可以設定剪下板,磁碟對映之類的。