博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#实现远程机器管理
阅读量:7240 次
发布时间:2019-06-29

本文共 14087 字,大约阅读时间需要 46 分钟。

原文:

     目前处于待离职状态,原先所有的工作都在进行交接,过程当中不乏有很多先前整理的和动手尝试实现的功能;我的中已经列出来一部分内容,有兴趣的可以前往看一看。     

     接下来的内容主要介绍另外一个工具,用于对远程主机进行远程控制、进程管理、服务管理以及WMI相关信息显示等;其中仍然存在部分问题还没有得到有效的解决,希望曾经参与过或者有关相关经验的前辈能够指导一下。

一、很搓很搓的主界面

1、配置菜单里面包括远程主机连接配置信息的添加和编辑,界面如下:

2、功能菜单里面包括对远程主机远程控制、远程管理、服务管理和WMI信息查询;

3、添加完成后,功能菜单会进行相应的变化,如下图:

二、主要功能实现部分

远程主机配置信息

public class RemoteMachine    {        ///         /// 桌面名称        ///         public string DesktopName { get { return this._DesktopName ?? this.Server; } set { this._DesktopName = value; } }        private string _DesktopName = null;        ///         /// 远程桌面的IP地址或者域名        ///         public string Server { get; set; }        ///         /// 用户名        ///         public string UserName { get; set; }        ///         /// IP        ///         public string Domain { get; set; }        ///         /// 登录密码        ///         public string Password { get; set; }        ///         /// 允许查询进程        ///         public bool ShowProcess { get { return _ShowProcess; } set { _ShowProcess = value; } }        private bool _ShowProcess = true;        ///         /// 允许远程        ///         public bool RemoteAble { get { return _RemoteAble; } set { _RemoteAble = value; } }        private bool _RemoteAble = true;        ///         /// 允许查询服务        ///         public bool ShowService { get { return _ShowService; } set { _ShowService = value; } }        private bool _ShowService = true;        ///         /// 共享磁盘驱动器        ///         public bool RedirectDrives { get { return _RedirectDrives; } set { _RedirectDrives = value; } }        private bool _RedirectDrives = true;        ///         /// 共享打印机        ///         public bool RedirectPrinters { get { return _RedirectPrinters; } set { _RedirectPrinters = value; } }        private bool _RedirectPrinters = false;        ///         /// 共享端口        ///         public bool RedirectPorts { get { return _RedirectPorts; } set { _RedirectPorts = value; } }        private bool _RedirectPorts = false;        ///         /// 色彩深度        ///         public Colors ColorDepth { get { return _ColorDepth; } set { _ColorDepth = value; } }        private Colors _ColorDepth = Colors.Color24;        public override string ToString()        {            return string.Format("{0}:{1}", this.DesktopName, this.Server);        }        public void Save(IniFile iniFile)        {            Save(this, iniFile);        }        public void Delete(IniFile iniFile)        {            string section = string.Format("Remote({0})", this.DesktopName);            iniFile.DeleteSection(section);        }        public void Load(IniFile iniFile, string desktopName)        {            string section = string.Format("Remote({0})", desktopName);            this.DesktopName = desktopName;            this.Server = iniFile.ReadString(section, "Server", "");            this.UserName = iniFile.ReadString(section, "UserName", "");            this.Domain = iniFile.ReadString(section, "Domain", "");            this.Password = iniFile.ReadString(section, "Password", "");            this.RemoteAble = iniFile.ReadInt(section, "RemoteAble", 0) == 1;            this.ShowProcess = iniFile.ReadInt(section, "ShowProcess", 0) == 1;            this.ShowService = iniFile.ReadInt(section, "ShowService", 0) == 1;            this.RedirectDrives = iniFile.ReadInt(section, "RedirectDrives", 0) == 1;            this.RedirectPrinters = iniFile.ReadInt(section, "RedirectPrinters", 0) == 1;            this.RedirectPorts = iniFile.ReadInt(section, "RedirectPorts", 0) == 1;            this.ColorDepth = (Colors)iniFile.ReadInt(section, "ColorDepth", 0);        }        public static RemoteMachine Load(string desktopName, IniFile iniFile)        {            string section = string.Format("Remote({0})", desktopName);            RemoteMachine mac = new RemoteMachine();            mac.DesktopName = desktopName;            mac.Server = iniFile.ReadString(section, "Server", "");            mac.UserName = iniFile.ReadString(section, "UserName", "");            mac.Domain = iniFile.ReadString(section, "Domain", "");            mac.Password = iniFile.ReadString(section, "Password", "");            mac.RemoteAble = iniFile.ReadInt(section, "RemoteAble", 0) == 1;            mac.ShowProcess = iniFile.ReadInt(section, "ShowProcess", 0) == 1;            mac.ShowService = iniFile.ReadInt(section, "ShowService", 0) == 1;            mac.RedirectDrives = iniFile.ReadInt(section, "RedirectDrives", 0) == 1;            mac.RedirectPrinters = iniFile.ReadInt(section, "RedirectPrinters", 0) == 1;            mac.RedirectPorts = iniFile.ReadInt(section, "RedirectPorts", 0) == 1;            mac.ColorDepth = (Colors)iniFile.ReadInt(section, "ColorDepth", 0);            return mac;        }        public static void Save(RemoteMachine machine, IniFile iniFile)        {            string section = string.Format("Remote({0})", machine.DesktopName);            iniFile.WriteString(section, "DesktopName", machine.DesktopName);            iniFile.WriteString(section, "Server", machine.Server);            iniFile.WriteString(section, "UserName", machine.UserName);            iniFile.WriteString(section, "Domain", machine.Domain);            iniFile.WriteString(section, "Password", machine.Password);            iniFile.WriteInt(section, "RemoteAble", machine.RemoteAble ? 1 : 0);            iniFile.WriteInt(section, "ShowProcess", machine.ShowProcess ? 1 : 0);            iniFile.WriteInt(section, "ShowService", machine.ShowService ? 1 : 0);            iniFile.WriteInt(section, "RedirectDrives", machine.RedirectDrives ? 1 : 0);            iniFile.WriteInt(section, "RedirectPrinters", machine.RedirectPrinters ? 1 : 0);            iniFile.WriteInt(section, "RedirectPorts", machine.RedirectPorts ? 1 : 0);            iniFile.WriteInt(section, "ColorDepth", (int)machine.ColorDepth);        }        public static List
Load(IniFile iniFile) { string[] infos = iniFile.ReadAllSectionNames(); if (infos != null) { List
macs = new List
(); foreach (string info in infos) { string section = info.Substring(7, info.Length - 8); RemoteMachine mac = RemoteMachine.Load(section, iniFile); macs.Add(mac); } return macs; } return null; } } public enum Colors : int { Color8 = 8, Color16 = 16, Color24 = 24, Color32 = 32 }

1、远程控制功能

     工具内实现的远程控制功能需要引用AxInterop.MSTSCLib.dll和Interop.MSTSCLib.dll文件,具体代码如下:

public partial class DesktopForm : Form, IRemote    {        private AxMsRdpClient4 rdpc = null;        public RemoteMachine Machine { get; set; }        public DesktopForm(RemoteMachine machine)        {            InitializeComponent();            Text = string.Format("【远程】{0}", machine.DesktopName);            this.Machine = machine;        }        private void DesktopForm_Load(object sender, EventArgs e)        {            this.rdpc = new AxMsRdpClient4() { Dock = DockStyle.Fill };            this.rdpc.OnDisconnected += rdpc_OnDisconnected;            this.Controls.Add(this.rdpc);            this.SetRdpClientProperties(this.Machine);            Connect();        }        private void rdpc_OnDisconnected(object sender, IMsTscAxEvents_OnDisconnectedEvent e)        {        }        public bool Connect()        {            try            {                rdpc.Connect();                return true;            }            catch (Exception ex)            {                MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);                return false;            }        }        public void Disconnect()        {            try            {                if (rdpc.Connected == 1)                    rdpc.Disconnect();            }            catch (Exception ex)            {                MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);            }        }        private void SetRdpClientProperties(RemoteMachine machine)        {            rdpc.Server = machine.Server;            rdpc.UserName = machine.UserName;            rdpc.Domain = machine.Domain;            if (!string.IsNullOrEmpty(machine.Password))                rdpc.AdvancedSettings5.ClearTextPassword = machine.Password;            rdpc.AdvancedSettings5.RedirectDrives = machine.RedirectDrives;            rdpc.AdvancedSettings5.RedirectPrinters = machine.RedirectPrinters;            rdpc.AdvancedSettings5.RedirectPorts = machine.RedirectPorts;            rdpc.ColorDepth = (int)machine.ColorDepth;            rdpc.Dock = DockStyle.Fill;        }    }

通过使用RemoteMachine参数实例化并进行远程控制;

RemoteMachine mac = item.Tag as RemoteMachine;                    using (DesktopForm df = new DesktopForm(mac))                    {                        df.ShowDialog();                    }

 2、进程、服务管理等(WMI方式,需要引人System.Management.dll类库,以进程管理为例,ProcessInfo类包含的属性信息可查询,其他类似)

public partial class ProcessForm : Form, IRemote    {        private ManagementScope scope = null;        private ManagementClass managementClass = null;        private string path = null;        public RemoteMachine Machine { get; set; }        public ProcessForm(RemoteMachine machine)        {            InitializeComponent();            Text = string.Format("【进程】{0}", machine.DesktopName);            this.Machine = machine;            this.path = "\\\\" + this.Machine.Server + "\\root\\cimv2:Win32_Process";            this.managementClass = new ManagementClass(this.path);            ConnectionOptions options = null;            if (this.Machine.Server != "." && this.Machine.UserName != null && this.Machine.UserName.Length > 0)            {                options = new ConnectionOptions();                options.Username = this.Machine.UserName;                options.Password = this.Machine.Password;                //options.EnablePrivileges = true;                //options.Impersonation = ImpersonationLevel.Impersonate;                //options.Authority = "ntlmdomain:domain";             }            this.scope = new ManagementScope("\\\\" + this.Machine.Server + "\\root\\cimv2", options);            this.managementClass.Scope = this.scope;        }        private DataGridView dataGrid;        private ContextMenuStrip contextMenu;        private ProcessInfo[] processes;        private void ProcessForm_Load(object sender, EventArgs e)        {            this.contextMenu = new ContextMenuStrip();            ToolStripItem item = this.contextMenu.Items.Add("停止");            item.Click += item_Click;            this.dataGrid = new DataGridView() { Dock = DockStyle.Fill, ContextMenuStrip = this.contextMenu, SelectionMode = DataGridViewSelectionMode.FullRowSelect, AllowUserToAddRows = false, AllowUserToDeleteRows = false, ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize, ReadOnly = true, RowHeadersWidth = 21 };            this.Controls.Add(this.dataGrid);            ReLoad();        }        private void ReLoad()        {            this.dataGrid.DataSource = null;            this.processes = null;            if (Connect())            {                processes = GetProcess();                DataTable table = ProcessInfo.ConvertTo(processes);                BindData(table);            }        }        private void item_Click(object sender, EventArgs e)        {            if (this.dataGrid.SelectedRows.Count == 1)            {                try                {                    UInt32 processId = Convert.ToUInt32(this.dataGrid.SelectedRows[0].Cells[0].Value);                    string processName = this.dataGrid.SelectedRows[0].Cells[1].Value.ToString();                    if (processName != null && MessageBox.Show(string.Format("是否停止\"{0}\"进程?", processName), "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)                    {                        ProcessInfo process = Array.Find(processes, (pro) => { return pro.Name == processName && pro.ProcessId == processId; });                        KillProcess(process);                        ReLoad();                    }                }                catch (Exception ex)                {                    MessageBox.Show(ex.Message, "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);                }            }        }        public bool Connect()        {            try            {                scope.Connect();            }            catch (Exception ex)            {                MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);            }            return scope.IsConnected;        }        public void Disconnect()        {        }        public void BindData(DataTable table)        {            this.dataGrid.DataSource = table;        }        public ProcessInfo[] GetProcess()        {            ManagementObjectCollection queryCollection = this.managementClass.GetInstances();            List
processes = new List
(); foreach (ManagementObject m in queryCollection) { ProcessInfo process = new ProcessInfo(m); processes.Add(process); } return processes.ToArray(); } public void KillProcess(ProcessInfo process) { ObjectQuery query = new ObjectQuery(string.Format("select * from Win32_Process where ProcessId={0}", process.ProcessId)); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); ManagementObjectCollection queryCollection = searcher.Get(); foreach (ManagementObject m in queryCollection) { string[] args = new string[] { "0" }; object obj = m.InvokeMethod("Terminate", args); Console.WriteLine(obj.ToString()); return; } } }

可以通过KillProcess来终止进程;

三、所遇到的问题

(未完待续...)

此处附上

 

转载地址:http://neybm.baihongyu.com/

你可能感兴趣的文章
Linux进程间通信-匿名管道
查看>>
servlet过滤器配置白名单、黑名单
查看>>
linux下cmake编译安装、配置和卸载mysql
查看>>
HDU2639Bone Collector II[01背包第k优值]
查看>>
SPOJ GSS3 Can you answer these queries III[线段树]
查看>>
Linux软件安装
查看>>
怎么使用jquery判断一个元素是否含有一个指定的类(class)
查看>>
samba 最简单配置 共享
查看>>
看完这篇让你对各种前端build工具不再懵逼!
查看>>
精通移动端布局
查看>>
怎么运行 ASP.NET Core控制台程序
查看>>
IOS蓝牙项目总结
查看>>
django一对多 增 删 改 查
查看>>
Sqoop Export原理和详细流程讲解
查看>>
浅谈对java中锁的理解
查看>>
ASP.NET Core MVC之ViewComponents(视图组件)知多少?
查看>>
在天河二号上对比Julia,Python和R语言
查看>>
Docker容器学习梳理--私有仓库Registry使用
查看>>
arcgis地图服务之 identify 服务
查看>>
取汉子拼音首字母的C#方法
查看>>