前言:有时候远程服务器的进程你想偷偷去围观一下有哪些,或者对一些比较调皮的进程进行封杀,或者对一些自己研发的服务进行远程手动启动或者重启等,又不想打开远程桌面,只想悄咪咪地执行,那也许下面的文章会对你有启发。
前提条件
  1. 确保远程服务器(服务端)已启用WinRM。在远程服务器上运行以下命令可以启用和配置WinRM:
winrm quickconfig
  1. 确保执行远程命令的客户端和服务器之间的防火墙规则允许WinRM通信(默认使用端口5985和5986)。
  2. 本地客户端网络,需要设置为专用网络
打开设置:
 
点击开始按钮,然后选择“设置”(齿轮图标)。
访问网络和互联网设置:
 
在设置菜单中,选择“网络和互联网”。
更改网络属性:
 
在“状态”下,点击“属性”(可能需要先选择你的网络连接,如Wi-Fi或以太网)。
找到“网络配置文件”部分,将其从“公用”更改为“专用”。
 
管理员权限打开本地power shell,并按照上面服务端的同样配置启用WinRM
 
配置TrustedHosts
本地客户端,在管理员权限下,执行以下命令,使得客户端信任远程主机的连接。远程服务器IP替换为你自己的服务端IP。
winrm set winrm/config/client '@{TrustedHosts="远程服务器IP"}'
 
确认远程服务器的身份验证设置
在远程服务器上,确保WinRM配置允许你选择的身份验证类型。如果你是通过HTTP连接,那么常用的身份验证方法包括Basic和Negotiate。可以在远程服务器上运行以下命令来检查WinRM的身份验证配置:
winrm get winrm/config/service/Auth
确保你使用的身份验证方法(如Basic)被设置为true。如果不是,你需要在远程服务器上开启该身份验证方法:
winrm set winrm/config/service/Auth @{Basic="true"}
注意:使用Basic身份验证时,Basic身份验证会明文传送密码。
服务器端执行:
 
创建控制台程序,引用包 System.Management.Automation
新建一个获取所有远程服务器进程的方法
 1  public static void ExecuteRemoteCommand(string remoteComputer, string userName, string password, string command)
2 {
3 WSManConnectionInfo connectionInfo = new WSManConnectionInfo();
4 connectionInfo.ComputerName = remoteComputer;
5 connectionInfo.Credential = new PSCredential(userName, ConvertToSecureString(password));
6
7 using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
8 {
9 runspace.Open();
10
11 using (PowerShell ps = PowerShell.Create())
12 {
13 ps.Runspace = runspace;
14 ps.AddScript(command);
15
16 Collection<PSObject> results = ps.Invoke();
17
18 foreach (var result in results)
19 {
20 Console.WriteLine(result);
21 }
22 }
23 runspace.Close();
24 }
25 }
command参数可选:
Get-Process:获取进程列表
Stop-Process:关闭进程
Start-Process:启动进程
传入用户名密码和IP,并提供获取进程列表命令。
打开远程桌面,并启动程序,设置断点,可以看到获取到的进程列表。
 
远程通过进程ID关闭指定名称的进程
 public static void StopRemoteProcessByName(string remoteComputer, string userName, string password, string processName)
{
WSManConnectionInfo connectionInfo = new WSManConnectionInfo();
connectionInfo.ComputerName = remoteComputer;
connectionInfo.Credential = new PSCredential(userName, ConvertToSecureString(password)); using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
{
runspace.Open(); using (PowerShell ps = PowerShell.Create())
{
// 获取进程ID
ps.Runspace = runspace;
ps.AddScript($"$proc = Get-Process -Name {processName}; if ($proc) {{$proc.Id}}"); // 执行并获取进程ID
var results = ps.Invoke();
if (ps.HadErrors)
{
Console.WriteLine("Error retrieving process ID");
return;
} // 如果找到了进程,关闭它
if (results.Count > 0)
{
int processId = (int)results[0].BaseObject;
ps.Commands.Clear();
ps.AddScript($"Stop-Process -Id {processId} -Force");
ps.Invoke(); if (ps.HadErrors)
{
Console.WriteLine("Error stopping process");
}
else
{
Console.WriteLine($"Process {processName} with ID {processId} stopped successfully.");
}
}
else
{
Console.WriteLine("No such process found.");
}
}
runspace.Close();
}
}
远程服务器打开一个记事本,查看记事本进程名称和id分别是notepad 和 2724
传入参数,执行程序
获取到notepad进程ID为2724,并且成功被关闭
远程启动进程,通过WinRM启动的进程通常运行在一个服务会话中,而不是在启动它的用户的会话中。因此,这限制了图形用户界面(GUI)程序的显示。但是针对于远程启动一些后台服务,确是可以的。但是具有GUI交互的程序,却没办法打开GUI界面,会在一小段时间以后自动销毁。
  public static void StartRemoteProcess(string remoteComputer, string userName, string password, string processName)
{
WSManConnectionInfo connectionInfo = new WSManConnectionInfo();
connectionInfo.ComputerName = remoteComputer;
connectionInfo.Credential = new PSCredential(userName, ConvertToSecureString(password)); using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
{
runspace.Open(); using (PowerShell ps = PowerShell.Create())
{
ps.Runspace = runspace;
ps.AddScript($"$process = Start-Process {processName} -PassThru; $process.Id"); var results = ps.Invoke();
if (ps.HadErrors)
{
Console.WriteLine("Error starting process");
}
else if (results.Count > 0)
{
Console.WriteLine($"Process started successfully. Process ID: {results[0]}");
}
} runspace.Close();
}
}

如果以上代码还不能满足你的好奇心,想要我本地测试的源码demo,可以在我的公众号【Dotnet Dancer】后台回复:【进程操控】  即可获取我的本地demo源码自行调试和把玩。

【备注】最近园子里面图片容易挂,如果挂掉了,可以查阅我发表其他地方的文章:https://mp.weixin.qq.com/s/-r9QQkvtBrTrReL5AQDNGQ

 

C#的奇技淫巧:利用WinRM来远程操控其他服务器上的进程的更多相关文章

  1. visualvm工具远程对linux服务器上的JVM虚拟机进行监控与调优

    文/朱季谦 最近在做了一些JVM监控与调优的事情,算是第一次实践,还比较陌生,故而先把这一次经验简单记下笔记,这样,对后面学习调优方面时,不至于又想不起来了.本文档主要总结在window本地环境远程对 ...

  2. 远程编写+调试服务器上的Python程序

    原帖参见(需自备梯子):https://webcache.googleusercontent.com/search?q=cache:1htdR2EXj5wJ:https://www.digitaloc ...

  3. 本地主机访问远程linux系统服务器上的jupyter notebook

    1,机器情况:服务器 centos python环境已经配置好了,在虚拟环境下安装了anaconda 并且在里面安装了jupyter notebook 2,主机是 windows     ipytho ...

  4. 使用Eclipse远程调试云服务器上的微信公众项目

    云服务器系统:centos 7.3 如何在Eclipse上调试我们在云服务器上的项目呢,下面介绍一下步骤:   1.因为root账号不支持远程调试,首先需要在linux上创建一个新的用户,然后用该用户 ...

  5. PHP vscode+XDebug 远程断点调试服务器上的代码

    对于简单的项目或仅仅想知道某一位置的某个变量是什么值,直接使用var_dump配置exit来打印和中断就可以了,方便又快捷, 而对于大型项目的调试,或想了解某个系统的整个运行过程,xdebug可能会是 ...

  6. java远程执行linux服务器上的shell脚本

    业务场景:需要从服务器A中新增的文件同步至本地服务器,服务器A中内存有限,需同步成功之后清除文件. Java调用远程shell脚本,需要和远程服务器建立ssh链接,再调用指定的shell脚本. 1.创 ...

  7. (转发)Navicat 远程连接 Linux服务器上的MySQL数据库

    授权法: 在安装mysql的机器上运行: 1.# ./bin/mysql -uroot -p //这样应该可以进入MySQL服务器 2.mysql> GRANT ALL PRIVILEGES O ...

  8. jconsole远程连接centos7 服务器上的tomcat来查看服务器状况(无密码版)

    1.修改tomcat  catalina.sh 代码解释:-Dcom.sun.management.jmxremote.port=6969 //连接端口,自定义不要与已有的端口冲突-Dcom.sun. ...

  9. WinRM服务远程命令执行

    WinRM服务简介 WinRM是WindowsRemoteManagementd(win远程管理)的简称.基于Web服务管理(WS-Management)标准,使用80端口或者443端口.这样一来,我 ...

  10. SecureCRT远程ssh linux服务器,利用X11本地图形化wireshark抓包,

    平时学习抓包,使用wireshark很方便,直接图形化界面抓包,近期项目中遇到了需要通过SecureCRT ssh到linux服务器上面,还要在抓包, 1.简单使用网络数据包截获分析工具tcpdump ...

随机推荐

  1. 如何使用 Grafana 监控文件系统状态

    当 JuiceFS 文件系统部署完成并投入生产环境,接下来就需要着手解决一个非常重要的问题 -- 如何实时监控它的运行状态?毕竟,它可能正在为关键的业务应用或容器工作负载提供持久化存储支持,任何小小的 ...

  2. webpack 配置热更新

    正文 代码 const path=require('path'); module.exports={ devtool:'', entry:{ entry:'./src/entry.js', entry ...

  3. native react 代码智能提示

    背景 在vscode 中,虽然有插件可以达到代码提示的效果但是不是很嗨. 所以加上这些: 全局安装typings: npm install typings -g 1 安装react和react-nat ...

  4. SpringBoot使用Redis做缓存结合自带注解

    配置Spring Cache <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  5. opensips使用drouting进行路由

    操作系统 :CentOS 7.6_x64 opensips版本:2.4.9 drouting是Dynamic Routing(动态路由)的缩写,该模块可为特定呼叫选择(基于多个条件)最佳网关.今天整理 ...

  6. C#的基于.net framework的Dll模块编程(二) - 编程手把手系列文章

    今天继续这个系列博文的编写.接上次的篇幅,这次介绍关于C#的Dll类库的创建的内容.因为是手把手系列,所以对于需要入门的朋友来说还是挺好的,下面开始咯: 一.新建Dll类库: 这里直接创建例子的Dll ...

  7. 《最新出炉》系列入门篇-Python+Playwright自动化测试-40-录制生成脚本

    1.简介 各种自动化框架都会有脚本录制功能, playwright这么牛叉当然也不例外.很早之前的selenium.Jmeter工具,发展到每种浏览器都有对应的录制插件.今天我们就来看下微软自动化框架 ...

  8. 动态尺寸模型优化实践之Shape Constraint IR Part II

    简介: 在本系列分享中我们将介绍BladeDISC在动态shape语义下做性能优化的一些实践和思考.本次分享的是我们最近开展的有关shape constraint IR的工作,Part II 中我们将 ...

  9. 可观测|时序数据降采样在Prometheus实践复盘

    简介: 基于 Prometheus 的监控实践中,尤其是在规模较大时,时序数据的存储与查询是其中非常关键,而且问题点较多的一环.如何应对大数据量下的长周期查询,原生的 Prometheus 体系并未能 ...

  10. [FAQ] FinalCutPro 竖版视频 加模糊背景变 横版视频

    把一段影片拖到时间轴上面,注意自定义尺寸选择 1920 x 1080,因为竖版的是 1080 x 1920. 切换到仅视频,并选择变形,视频区左右拖动视频到最大. 设置模糊效果为高斯曲线. 切回到全部 ...