• C# 调用 taskkill命令结束服务进程


    获取服务映像名称

    windows服务安装后会在注册表中存储服务信息,路径是HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices[服务名称]

    通过ImagePath可以获取到映像名称和服务所在路径,这里的映像名称就是在资源管理器中看到的进程名称,不同于服务名称和显示名称。

       //获取服务路径
            private string GetServicePath(string serviceName, string machineName, out string imageName)
            {
                imageName = string.Empty;
                var ret = string.Empty;
    
                string registryPath = @"SYSTEMCurrentControlSetServices" + serviceName;
                RegistryKey keyHKLM = Registry.LocalMachine;
    
                RegistryKey key;
                if (string.IsNullOrEmpty(machineName) || machineName == "localhost")
                {
                    key = keyHKLM.OpenSubKey(registryPath);
    
                }
                else
                {
                    key = RegistryKey.OpenRemoteBaseKey
                          (RegistryHive.LocalMachine, machineName).OpenSubKey(registryPath);
                }
    
                string imagePath = key.GetValue("ImagePath").ToString();
                key.Close();
                var serviceFile = Environment.ExpandEnvironmentVariables(imagePath.Replace(""", ""));
    
                if (serviceFile.IndexOf(".exe", System.StringComparison.CurrentCulture) > 0)
                {
                    var path = serviceFile.Substring(0, serviceFile.IndexOf(".exe") + 4);
                    var fileInfo = new FileInfo(path);
                    imageName = fileInfo.Name;
                    return new FileInfo(path).DirectoryName;
                }
                return ret;
            }

    远程结束进程

    Taskkill命令是   taskkill /s 172.19.2.107 /f /t /im "[映像名称]" /U [远程机器的用户名] /P [远程机器的密码]

    通过C#调用并获取返回值的方法是:

          /// <summary>
            /// 结束服务进程
            /// </summary>
            /// <param name="imagename"></param>
            /// <param name="user"></param>
            /// <param name="password"></param>
            /// <param name="ip"></param>
            /// <returns></returns>
            private string TaskKillService(string imagename, string user, string password, string ip)
            {
    
                var ret = string.Empty;
                var process = new Process();
                process.StartInfo.FileName = "taskkill.exe";
                process.StartInfo.Arguments = string.Format(" /s {0} /f /t /im "{1}" /U {2} /P {3}", ip, imagename, user, password);
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.RedirectStandardError = true;
                //process.StartInfo.StandardOutputEncoding = Encoding.UTF8;
    
                //process.OutputDataReceived += (s, e) =>
                //{
                //    ret += e.Data;
                //};
                //process.ErrorDataReceived += (s, e) =>
                //{
                //    ret += e.Data;
                //};
                //process.BeginOutputReadLine();
                //process.BeginErrorReadLine();
                process.Start();
            
                ret = process.StandardOutput.ReadToEnd();
                process.WaitForExit();
                process.Close();
                return ret;
            }

    服务管理

    通过 System.ServiceProcess.ServiceController 也可以管理服务。

      //获取服务状态
            private string GetServiceStatus(string serviceName, string ip)
            {
                try
                {
                    var service = new System.ServiceProcess.ServiceController(serviceName, ip);
                    return service.Status.ToString();
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }
    
    
            //启动服务
            private string StartService(string serviceName, string ip)
            {
                try
                {
                    var service = new System.ServiceProcess.ServiceController(serviceName, ip);
                    if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running)
                        return "正在运行";
    
                    service.Start();
                    service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(5));
                    return "正在启动";
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }
    
    
            //停止服务
            private string StopService(string serviceName, string ip)
            {
                try
                {
                    var service = new System.ServiceProcess.ServiceController(serviceName, ip);
                    if (service.Status == System.ServiceProcess.ServiceControllerStatus.Stopped)
                        return "已经停止";
                    service.Stop();
                    service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(5));
                    return "正在停止";
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }

    远程管理服务需要在本机和远程机之间建立信任凭据

  • 相关阅读:
    vue---lodash的使用
    git---分支的合并
    vue---组件引入及使用的几种方式
    vue---import的几种表现形式
    mock---前端搭建模拟服务
    vue---computed计算属性的使用
    HTML禁止右键复制【两行代码实现】
    SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)
    SQL Server调优系列玩转篇二(如何利用汇聚联合提示(Hint)引导语句运行)
    SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)
  • 原文地址:https://www.cnblogs.com/zeroes/p/csharp-taskkill-service.html
Copyright © 2020-2023  润新知