获取服务映像名称

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. 1483: [HNOI2009]梦幻布丁

    1483: [HNOI2009]梦幻布丁 链接 分析: 启发式合并+链表. 代码: #include<cstdio> #include<algorithm> #include& ...

  2. ASP.NET5之客户端开发:Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用

    Grunt和Gulp是Javascript世界里的用来做自动压缩.Typescript编译.代码质量lint工具.css预处理器的构建工具,它帮助开发者处理客户端开发中的一些烦操重复性的工作.Grun ...

  3. 图片缩放插件GestureImageView——Android 常用插件推荐(一)

    Android 开发过程中,交互效果是一个非常繁琐的过程,甚至比Web开发过程中JS特效更加复杂.通过多年的发展,常用的交互方式已经发展相当成熟,而且有很多非常好的插件.为了避免重复造轮子,一些常用的 ...

  4. centos 7 lsof 安装使用

    lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以,lsof的功 ...

  5. ubuntu下安装pip install mysqlclient 报错 command "python setup.py egg_info" failed with error.....解决方案

    我的环境: ubuntu 1604 版本, 在黑屏终端已经安装了django和virtualenv虚拟环境, 在创建了django的models后开始迁移的操作, 出现错误, 错误代码最后如题目 可以 ...

  6. Vue2.0原理-模板解析

    下面这段代码,vue内部做了什么操作?我去源码里面找找看 new Vue({ el: '#app' }) 入口 vue 的入口文件在 src/core/instance/index.js, 里面一进来 ...

  7. [转载]使用mpvue搭建一个初始小程序

    1. 初始化一个 mpvue 项目 现代前端开发框架和环境都是需要 Node.js 的,如果没有的话,请先下载 nodejs 并安装. 然后打开命令行工具: # 1. 先检查下 Node.js 是否安 ...

  8. ats编译中增加透明度 选项

    在大多数情况下,如果环境支持透明度,则configure将自动启用它.对于其他环境,可能需要 配置configure 选项. --enable-posix-cap 这实现了POSIX功能,这是透明度所 ...

  9. hadoop之计数器和管道的mrunit测试

    引言 hadoop的调试真心让人灰常恼火,而且从企业实际出发,集群的资源是有限的,不可能在集群上跑一遍又一遍根据log去调试代码,那么使用MRUnit编写测试单元,显得尤为重要.MRUnit中的Map ...

  10. 机器学习(一):记一次k一近邻算法的学习与Kaggle实战

    本篇博客是基于以Kaggle中手写数字识别实战为目标,以KNN算法学习为驱动导向来进行讲解. 写这篇博客的原因 什么是KNN kaggle实战 优缺点及其优化方法 总结 参考文献 写这篇博客的原因 写 ...