获取服务映像名称

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

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

   //获取服务路径
private string GetServicePath(string serviceName, string machineName, out string imageName)
{
imageName = string.Empty;
var ret = string.Empty; string registryPath = @"SYSTEM\CurrentControlSet\Services\" + 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) > )
{
var path = serviceFile.Substring(, serviceFile.IndexOf(".exe") + );
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());
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());
return "正在停止";
}
catch (Exception ex)
{
return ex.Message;
}
}

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

C# 调用 taskkill命令结束服务进程的更多相关文章

  1. C++使用taskkill 命令强制结束进程

    一:查看 taskkill 命令和参数的方法 window系统下,快捷键win + R 打开运行 ,输入cmd回车,在 cmd 里面输入: taskkill /?  二:语法: taskkill [/ ...

  2. tasklist、taskkill命令使用

    tasklist.taskkill命令使用 在Windows XP中新增了两个命令行工具“tasklist.taskkill”.通过“Ctrl+Alt+Del”组合键,打开“任务管理器”就可以查看到本 ...

  3. Perl调用外部命令的方式和区别

    主要的方式简述如下:1. system("command");使用该命令将开启一个子进程执行引号中的命令,父进程将等待子进程结束并继续执行下面的代码. 2. exec(" ...

  4. python 调用shell命令三种方法

    #!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器: #!/usr/bin/env python这种用法是为了防止操作系统用户没有将pyth ...

  5. Perl调用外部命令(其他脚本、系统命令)的方法和区别

    1. `command`; 使用反引号调用外部命令能够捕获其标准输出,并按行返回且每行结束处附带一个回车.反引号中的变量在编译时会被内插为其值.   2. open LIST "ls -l| ...

  6. Java调用本地命令

    参考:http://blog.csdn.net/zhu_xun/article/details/19539513 http://www.cnblogs.com/kingcucumber/p/31801 ...

  7. Python 调用外部命令

    python 可以使用 os 模块来调用外部的 Linux Shell 命令,常用的方法如下: os.system():结果输出在终端上,捕获不到os.popen() : 结果返回一个对象,即标准输出 ...

  8. Android 中调用本地命令

    Android 中调用本地命令 通常来说,在 Android 中调用本地的命令的话,一般有以下 3 种情况: 调用下也就得了,不管输出的信息,比如:echo Hello World.通常来说,这种命令 ...

  9. Python调用cmd命令

    常用的两种方式: 1.python的OS模块. OS模块调用CMD命令有两种方式:os.popen(),os.system(). 都是用当前进程来调用. os.system是无法获取返回值的.当运行结 ...

随机推荐

  1. 通俗地讲Node.js是什么

    前后端分离,使得后台只需关注服务即可,但有时候开发的不同步,前台往往需要等待后台的接口,通俗的说,“node.js就是一个前端觉得写个功能还要等后端捣鼓半天,然后干脆就自己用javascript把后端 ...

  2. 简单的Restful工具类

    import java.io.BufferedReader;import java.io.ByteArrayOutputStream;import java.io.Closeable;import j ...

  3. SSH结合EasyUI系统(一)———简单介绍

    鉴于前文<不仅仅是吐槽>,决定将自己学过的和在学的东西整理一下放进园子:做一个好园友! 接下来将会持续更新的是近一段时间在学的java web中比较流行的框架SSH(Struts+Spri ...

  4. WebGL——osg框架学习一

    从今天开始,我们开始正式的学习osg框架,今天我们学习的是osg的渲染模块,我们来看一下代码结构. 所有DrawXXX的js模块都是渲染的模块,我们逐一来简单介绍一下,第一个Drawable.js,这 ...

  5. linux 下awk后统计某一列数据之和简单的命令

    例如有文件test.txt格式如下: aaa:1 bbb:2 cat a|awk -F\: '{print"+"$2}'|xargs echo 0|bc -l

  6. Netty源码分析第4章(pipeline)---->第3节: handler的删除

    Netty源码分析第四章: pipeline 第三节: handler的删除 上一小节我们学习了添加handler的逻辑操作, 这一小节我们学习删除handler的相关逻辑 如果用户在业务逻辑中进行c ...

  7. php从入门到放弃系列-02.php基础语法

    php从入门到放弃系列-02.php基础语法 一.学习语法,从hello world开始 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器&qu ...

  8. 高可用OpenStack(Queen版)集群-6.Nova控制节点集群

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  9. <React Native移动开发实战>-1-React Native的JSX解决方案

    JSX并不是一门新的开发语言,而是Facebook提出的语法方案:一种可以在JavaScript代码中直接书写HTML标签的语法糖,所以,JSX本质上还是JavaScript语言. 小知识:语法糖(S ...

  10. 启动Nodejs服务

    vs code 中间创建 1.  settings.json { , { , { 'Content-Type': 'text/plain;charset=utf-8' })