思路是首先新建一个vbs脚本,再创建一个bat脚本,再创建rdp文件,运行顺序是vbs->bat->rdp。rdp文件里面包含远程电脑的账密和其它信息,这样就可以不用再输入账密,而在程序里完成账密的设置,直接启动远程桌面(bat文件用vbs启动运行可以避免显示cmd的exe窗口),用C#语言写出这几个脚本,直接调用就可以实现功能(C#代码文尾),如下图

runBat.vbs文件里写

set ws=WScript.CreateObject("WScript.Shell")
ws.Run"runRdp.bat",

runRdp.bat文件里写

mstsc rdesktop.rdp /console /v: 192.168.0.167:

rdesktop.rdp里面写如下代码,注意username和password分别是远程电脑的登录账密

screen mode id:i:
desktopwidth:i:
desktopheight:i:
session bpp:i:
winposstr:s:,,,,,
full address:s:MyServer
compression:i:
keyboardhook:i:
audiomode:i:
redirectdrives:i:
redirectprinters:i:
redirectcomports:i:
redirectsmartcards:i:
displayconnectionbar:i:
autoreconnection
enabled:i:
username:s:Administrator
domain:s:QCH
alternate shell:s:
shell working directory:s:
password :b:01000000D08C9DDF0115D1118C7A00C04FC297EB01000000FBCFD336AC9B0D44B66EA56EE800C1E404000000020000000000106600000001000020000000EFDB7BB10E9F6509EEBF8C97E6BDC42BCB1E85AF5A801FC9623A21A4B628657B000000000E8000000002000020000000C0D7FAC8785CE745D7655BA1D97F2A16251EC23920D7B81DFE27BD29ED7A6D3910000000CAD751C2CEC0C749109F6C83AA90778F40000000751DB383D24B379C386A54EA93C50BA1B3AF96403D05BF252E7B10497C8BAE309AEF2F077C96EB241727A7D4023F7959DABFF48BC17615448681DAB3D1A3447A
disable wallpaper:i:
disable full window drag:i:
disable menu anims:i:
disable themes:i:
disable cursor setting:i:
bitmapcachepersistenable:i:

我们可以看到rdp文件里的密码很长,如下

01000000D08C9DDF0115D1118C7A00C04FC297EB01000000FBCFD336AC9B0D44B66EA56EE800C1E404000000020000000000106600000001000020000000EFDB7BB10E9F6509EEBF8C97E6BDC42BCB1E85AF5A801FC9623A21A4B628657B000000000E8000000002000020000000C0D7FAC8785CE745D7655BA1D97F2A16251EC23920D7B81DFE27BD29ED7A6D3910000000CAD751C2CEC0C749109F6C83AA90778F40000000751DB383D24B379C386A54EA93C50BA1B3AF96403D05BF252E7B10497C8BAE309AEF2F077C96EB241727A7D4023F7959DABFF48BC17615448681DAB3D1A3447A

密码是怎么来的呢,如下是加密算法,传入的参数pw是明文密码,比如上面的密码是123456,通过如下方法加密即可得到rdp里的密码

 /// <summary>
/// 获取RDP密码
/// </summary>
private string GetRdpPassWord(string pw)
{
byte[] secret = Encoding.Unicode.GetBytes(pw);
byte[] encryptedSecret = Protect(secret);
string res = string.Empty;
foreach (byte b in encryptedSecret)
{
res += b.ToString("X2"); //转换16进制的一定要用2位
            }
return res;
} /// <summary>
/// 加密方法
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private static byte[] Protect(byte[] data)
{
try
{
//调用System.Security.dll
                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;
}
}

基本思路就是这样,附上打开远程桌面的C#类

  public class OpenRemoteDesktop
{
/// <summary>
/// 密码因子
/// </summary>
static byte[] s_aditionalEntropy = null; /// <summary>
/// 打开远程桌面
/// </summary>
/// <param name="ip">IP地址</param>
/// <param name="admin">用户名</param>
/// <param name="pw">明文密码</param>
public void Openrdesktop(string ip, string admin = null, string pw = null)
{
string password = GetRdpPassWord(pw); #region newrdp
//创建rdp
string fcRdp = @"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
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:"+admin+@"
domain:s:QCH
alternate shell:s:
shell working directory:s:
password 51:b:"+password+@"
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"; string rdpname = "rdesktop.rdp";
CreationBat(rdpname, fcRdp);
#endregion //创建bat
string fcBat = @"mstsc rdesktop.rdp /console /v:" + ip + ":3389";
string batname = "runRdp.bat";
CreationBat(batname, fcBat);
//创建vbs string vbsname = "runBat.vbs";
string fcVbs = @"set ws=WScript.CreateObject(""WScript.Shell"")" + "\r\nws.Run\"runRdp.bat\",0";
CreationBat(vbsname, fcVbs);
//NewVbs(vbsname);
ExecuteVbs(vbsname);
} /// <summary>
/// 获取RDP密码
/// </summary>
private string GetRdpPassWord(string pw)
{
byte[] secret = Encoding.Unicode.GetBytes(pw);
byte[] encryptedSecret = Protect(secret);
string res = string.Empty;
foreach (byte b in encryptedSecret)
{
res += b.ToString("X2"); //转换16进制的一定要用2位
            }
return res;
} /// <summary>
/// 加密方法
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private static byte[] Protect(byte[] data)
{
try
{
//调用System.Security.dll
                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;
}
} //解密方法
private 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;
}
} /// <summary>
/// 创建bat脚本
/// </summary>
/// <param name="batName">文件名</param>
/// <param name="fileContent">文件内容</param>
/// <param name="u"></param>
private void CreationBat(string batName, string fileContent, string u = null)
{
string filepath = System.IO.Directory.GetCurrentDirectory();
string batpath = filepath + @"\" + batName;
writeBATFile(fileContent, batpath);
} /// <summary>
/// 写入文件
/// </summary>
/// <param name="fileContent">文件内容</param>
/// <param name="filePath">路径</param>
private void writeBATFile(string fileContent, string filePath)
{
if (!File.Exists(filePath))
{
FileStream fs1 = new FileStream(filePath, FileMode.Create, FileAccess.Write);//创建写入文件
StreamWriter sw = new StreamWriter(fs1);
sw.WriteLine(fileContent);//开始写入值
sw.Close();
fs1.Close();
}
else
{
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Write);
StreamWriter sr = new StreamWriter(fs);
sr.WriteLine(fileContent);//开始写入值
sr.Close();
fs.Close();
}
} /// <summary>
/// 调用执行bat文件
/// </summary>
/// <param name="batName">文件名</param>
/// <param name="thisbatpath">路径</param>
private void ExecuteBat(string batName, string thisbatpath)
{
Process proc = null;
try
{
string targetDir = string.Format(thisbatpath);//this is where testChange.bat lies
proc = new Process();
proc.StartInfo.WorkingDirectory = targetDir;
proc.StartInfo.FileName = batName;
proc.StartInfo.Arguments = string.Format("");//this is argument
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//这里设置DOS窗口不显示,经实践可行
proc.Start();
proc.WaitForExit();
}
catch (Exception ex)
{
Console.WriteLine("Exception Occurred :{0},{1}", ex.Message, ex.StackTrace.ToString());
}
} /// <summary>
/// 调用执行vbs文件
/// </summary>
/// <param name="vbsName">文件名</param>
private void ExecuteVbs(string vbsName)
{
string path = System.IO.Directory.GetCurrentDirectory() + @"\" + vbsName;
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "wscript.exe";
startInfo.Arguments = path;
Process.Start(startInfo);
} /// <summary>
/// 创建vbs文件
/// </summary>
/// <param name="vbsName">vbs文件名</param>
private void NewVbs(string vbsName)
{
string path = System.IO.Directory.GetCurrentDirectory() + @"\" + vbsName;
FileStream fsvbs = new FileStream(path, FileMode.Create, FileAccess.Write);
StreamWriter runBat = new StreamWriter(path);
runBat.WriteLine("set ws=WScript.CreateObject(\"WScript.Shell\")");
runBat.WriteLine("ws.Run\"runRdp.bat\",0");
runBat.Close();
fsvbs.Close();
}
}

OpenRemoteDesktop

调用示例

  OpenRemoteDesktop m_open = new ServicesBLL.Common.OpenRemoteDesktop();
m_open.Openrdesktop(ip, "Administrator","");

C#通过rdp账密直接打开远程桌面的更多相关文章

  1. Windows:打开MSDTC,恢复Windows任务栏,查看windows日志,打开远程桌面,打开Services,资源监控

    Windows 服务器系列: Windows:查看IP地址,IP地址对应的机器名,占用的端口,以及占用该端口的应用程 Windows:使用Dos命令管理服务(Services) Windows:任务调 ...

  2. windows7如何打开远程桌面&nbsp;-…

    单位的机器,刚装上了windows7旗舰版(当然不是花银子滴),想打开远程桌面连接,这样从别的机器登录也方便.可是问题来了,windows7对安全的设置比较高,不像windows XP那么随便一点就可 ...

  3. Windows 10打开远程桌面的方法

    今天使用windows 10,想要用远程桌面连接,可是怎么都找不到,哎,win10相比于win7和XP系统,感觉还是有点使用不习惯.不过后来还是找到了两个方法,在此记录下来,分享给需要的朋友. 1. ...

  4. 打开远程桌面时总提示无法打开连接文件default.rdp

    删除C:\Users\Administrator\Documents\default.rdp,再启动远程就好了 http://www.chahushequ.com/read-topic-94-2fa9 ...

  5. Ubuntu 12.04设置打开远程桌面登录1

    teamviewer_linux.deb sudo dpkg --install teamviewer_linux.deb

  6. 使用 OpenSSL为WindowsServer远程桌面(RDP)创建自签名证书 (Self-signed SSL certificate)

    前言 笔者查阅很多资料,才写成此文章,如有错误,请读者们及时提出. 一般大家使用远程桌面(Remote Desktop)连接Windows Server时,总会有一个警告提示,如图1 图1 出现此警告 ...

  7. 远程桌面协议RDP

    远程桌面协议RDP(Remove Desktop Protocol) 通过mstsc客户端远程连接计算机,并对其进行管理等操作. 与TELNET的区别在于,TELNET显示的是远程计算机的命令行窗口, ...

  8. 关于KeePass实现mstsc远程桌面(rdp协议)的自动登录

    本文的Keepass版本:KeePass Password Safe Version 2.45 首先介绍一下Keepass,引用官网的解释如下: KeePass is a free open sour ...

  9. CMD打开远程并使用空白密码远程登录

    记录一下,在单位管理局域网机器时 写出的小程序: 应用场景:比如异地A的局域网内主机需要远程登录进入系统调试,而A电脑的Radmin之类的远程控制软件无效,就只能使用操作系统自带的远程桌面功能,而,异 ...

随机推荐

  1. [leetcode]238. Product of Array Except Self除了自身以外的数组元素乘积

    Given an array nums of n integers where n > 1,  return an array output such that output[i] is equ ...

  2. 20-java 对象链表空没空呢

    写了一个 对象链表,往里面add了一些对象,最后我想看下链表是否为空,用  == null  为假,也看不出, 看下长度? 好吧, size() = 1: 打印  null ,  那到底是不是空 啊, ...

  3. Volley的使用

    Volley加载图片到控件上 VolleyUtils.getLoader(getContext()).get(zixun.getPicurl(), ImageLoader.getImageListen ...

  4. IBM MQ 学习

    import java.io.IOException; import java.util.HashMap; import java.util.Map; import com.ibm.mq.MQC; i ...

  5. pthread_exit pthread_join

    int pthread_join(pthread_t thread, void **retval); int pthread_detach(pthread_t thread); void pthrea ...

  6. Luugu 3084 [USACO13OPEN]照片Photo

    很神仙的dp...假装自己看懂了,以后回来复习复习... 设$f_{i}$表示从$1$到$i$,且$i$这个点必放的最大数量. 一个区间有两个限制条件:至少放一个,至多放一个. 因为一个区间至多要放一 ...

  7. 编译器C1001问题

    https://ask.csdn.net/questions/184495 http://blog.sina.com.cn/s/blog_7822ce750100szed.html

  8. How to Install and Configure Bind 9 (DNS Server) on Ubuntu / Debian System

    by Pradeep Kumar · Published November 19, 2017 · Updated November 19, 2017 DNS or Domain Name System ...

  9. 另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新

    目的:vue-cli构建的vue单页面应用,某些特定的页面,实现前进刷新,后退不刷新,类似app般的用户体验.注: 此处的刷新特指当进入此页面时,触发ajax请求,向服务器获取数据.不刷新特指当进入此 ...

  10. [BAT]win7下用批处理脚本自动删除7天以前创建的文件

    set JmeterPath=D:\apache-jmeter-2.7 forfiles /p %JmeterPath%\extras /m *.html -d -7 /c "cmd /c ...