C#通过rdp账密直接打开远程桌面
思路是首先新建一个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账密直接打开远程桌面的更多相关文章
- Windows:打开MSDTC,恢复Windows任务栏,查看windows日志,打开远程桌面,打开Services,资源监控
Windows 服务器系列: Windows:查看IP地址,IP地址对应的机器名,占用的端口,以及占用该端口的应用程 Windows:使用Dos命令管理服务(Services) Windows:任务调 ...
- windows7如何打开远程桌面 -…
单位的机器,刚装上了windows7旗舰版(当然不是花银子滴),想打开远程桌面连接,这样从别的机器登录也方便.可是问题来了,windows7对安全的设置比较高,不像windows XP那么随便一点就可 ...
- Windows 10打开远程桌面的方法
今天使用windows 10,想要用远程桌面连接,可是怎么都找不到,哎,win10相比于win7和XP系统,感觉还是有点使用不习惯.不过后来还是找到了两个方法,在此记录下来,分享给需要的朋友. 1. ...
- 打开远程桌面时总提示无法打开连接文件default.rdp
删除C:\Users\Administrator\Documents\default.rdp,再启动远程就好了 http://www.chahushequ.com/read-topic-94-2fa9 ...
- Ubuntu 12.04设置打开远程桌面登录1
teamviewer_linux.deb sudo dpkg --install teamviewer_linux.deb
- 使用 OpenSSL为WindowsServer远程桌面(RDP)创建自签名证书 (Self-signed SSL certificate)
前言 笔者查阅很多资料,才写成此文章,如有错误,请读者们及时提出. 一般大家使用远程桌面(Remote Desktop)连接Windows Server时,总会有一个警告提示,如图1 图1 出现此警告 ...
- 远程桌面协议RDP
远程桌面协议RDP(Remove Desktop Protocol) 通过mstsc客户端远程连接计算机,并对其进行管理等操作. 与TELNET的区别在于,TELNET显示的是远程计算机的命令行窗口, ...
- 关于KeePass实现mstsc远程桌面(rdp协议)的自动登录
本文的Keepass版本:KeePass Password Safe Version 2.45 首先介绍一下Keepass,引用官网的解释如下: KeePass is a free open sour ...
- CMD打开远程并使用空白密码远程登录
记录一下,在单位管理局域网机器时 写出的小程序: 应用场景:比如异地A的局域网内主机需要远程登录进入系统调试,而A电脑的Radmin之类的远程控制软件无效,就只能使用操作系统自带的远程桌面功能,而,异 ...
随机推荐
- VMware下centos7安装VMware Tools
右键虚拟机设置,找到CD/DVD,选择使用ISO映像文件,在VMware安装目录下找到linux.iso. 挂载iso文件 > mount -t auto /dev/cdrom /mnt/c ...
- Jmeter通过BeanShell Sampler获取Jmeter的Bin路径,并存入变量供后面的脚本调用
Jmeter的Bin路径是其运行路径,当把自动化测试的脚本放在Bin目录下时,为了将存储CSV的数据文件以及脚本的路径都设置成相对路径,我们需要获取到Jmeter的运行路径: 通过BeanShell ...
- Netty 零拷贝(一)Linux 零拷贝
Netty 零拷贝(一)Linux 零拷贝 本文探讨 Linux 中主要的几种零拷贝技术以及零拷贝技术适用的场景. 一.几个重要的概念 1.1 用户空间与内核空间 操作系统的核心是内核,独立于普通的应 ...
- /etc/inittab加入自动启动格式
R01:35:respawn:/usr/bin/exe_program 说明 R01:标识,每一行必须唯一(R01并无特殊含义,可自定义). 35:有效模式,3字符界面启动,5图形界面启动 respa ...
- eclipse 配置动态web项目在servers中运行
第一步: window->preferences:Server->Runtime Environments窗口,add. 第二步: window->preferences:Proje ...
- 首页焦点图myFocus插件
首页焦点图myFocus插件 myFocus特性 小巧却高效强大 myFocus v2.0.min版只有9.89KB,却能使你的网页上可以运行超过30款风格各异的焦点图,在互联网独一无二哦~ 极其 ...
- 20155333 2016-2017-2 《Java程序设计》第八周学习总结
20155333 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 认识NIO NIO(New IO)-from JDK1.4 Channel: 衔接数据节点( ...
- 2018.10.16 spoj Can you answer these queries V(线段树)
传送门 线段树经典题. 就是让你求左端点在[l1,r1][l1,r1][l1,r1]之间,右端点在[l2,r2][l2,r2][l2,r2]之间且满足l1≤l2,r1≤r2l1\le l2,r1 \l ...
- 2018.09.14 codeforces364D(随机化算法)
传送门 根据国家集训队2014论文集中胡泽聪的随机化算法可以通过这道题. 对于每个数,它有12" role="presentation" style="posi ...
- hdu-1253(bfs+剪枝)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 思路:简单的bfs,就是要注意剪枝. #include<iostream> #inc ...