• C#通过rdp账密直接打开远程桌面 be


           思路是首先新建一个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",0

    runRdp.bat文件里写

    mstsc rdesktop.rdp /console /v: 192.168.0.167:3389

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

    screen mode id:i:1 
    desktopi: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:Administrator
    domain:s:QCH
    alternate shell:s: 
    shell working directory:s: 
    password 51:b:01000000D08C9DDF0115D1118C7A00C04FC297EB01000000FBCFD336AC9B0D44B66EA56EE800C1E404000000020000000000106600000001000020000000EFDB7BB10E9F6509EEBF8C97E6BDC42BCB1E85AF5A801FC9623A21A4B628657B000000000E8000000002000020000000C0D7FAC8785CE745D7655BA1D97F2A16251EC23920D7B81DFE27BD29ED7A6D3910000000CAD751C2CEC0C749109F6C83AA90778F40000000751DB383D24B379C386A54EA93C50BA1B3AF96403D05BF252E7B10497C8BAE309AEF2F077C96EB241727A7D4023F7959DABFF48BC17615448681DAB3D1A3447A
    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

    我们可以看到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 
                               desktopi: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("10");//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","123456");
  • 相关阅读:
    windows如何安装python zmq
    vue.js 微信浏览器不支持lambda表达式
    Entity Framework贪婪加载筛选问题
    用swift开发自己的MacOS锁屏软件(3)
    用swift开发自己的MacOS锁屏软件(二)
    用swift开发自己的MacOS锁屏软件(一)
    The expression being assigned to optional parameter `v2' must be a constant or default value
    Laravel 使用firstOrCreate 报错MassAssignmentException
    一次PHP面试经历
    JUC学习!
  • 原文地址:https://www.cnblogs.com/CityOfThousandFires/p/10345436.html
Copyright © 2020-2023  润新知