首页 > 系统相关 >C#的奇技淫巧:利用WinRM来远程操控其他服务器上的进程

C#的奇技淫巧:利用WinRM来远程操控其他服务器上的进程

时间:2024-05-25 23:00:32浏览次数:19  
标签:ps connectionInfo string C# WinRM runspace 进程 远程 奇技淫巧

  前言:有时候远程服务器的进程你想偷偷去围观一下有哪些,或者对一些比较调皮的进程进行封杀,或者对一些自己研发的服务进行远程手动启动或者重启等,又不想打开远程桌面,只想悄咪咪地执行,那也许下面的文章会对你有启发。 前提条件

  1. 确保远程服务器(服务端)已启用WinRM。在远程服务器上运行以下命令可以启用和配置WinRM:
winrm quickconfig 0
  1. 确保执行远程命令的客户端和服务器之间的防火墙规则允许WinRM通信(默认使用端口5985和5986)。
  2. 本地客户端网络,需要设置为专用网络
打开设置:   点击开始按钮,然后选择“设置”(齿轮图标)。 访问网络和互联网设置:   在设置菜单中,选择“网络和互联网”。 更改网络属性:   在“状态”下,点击“属性”(可能需要先选择你的网络连接,如Wi-Fi或以太网)。 找到“网络配置文件”部分,将其从“公用”更改为“专用”。 0   管理员权限打开本地power shell,并按照上面服务端的同样配置启用WinRM 0   配置TrustedHosts 本地客户端,在管理员权限下,执行以下命令,使得客户端信任远程主机的连接。远程服务器IP替换为你自己的服务端IP。 winrm set winrm/config/client '@{TrustedHosts="远程服务器IP"}' 0   确认远程服务器的身份验证设置 在远程服务器上,确保WinRM配置允许你选择的身份验证类型。如果你是通过HTTP连接,那么常用的身份验证方法包括Basic和Negotiate。可以在远程服务器上运行以下命令来检查WinRM的身份验证配置: winrm get winrm/config/service/Auth 确保你使用的身份验证方法(如Basic)被设置为true。如果不是,你需要在远程服务器上开启该身份验证方法: winrm set winrm/config/service/Auth @{Basic="true"} 注意:使用Basic身份验证时,Basic身份验证会明文传送密码。 服务器端执行: 0   创建控制台程序,引用包 System.Management.Automation 0 新建一个获取所有远程服务器进程的方法
 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,并提供获取进程列表命令。 0 打开远程桌面,并启动程序,设置断点,可以看到获取到的进程列表。 0   远程通过进程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 0 传入参数,执行程序 0 获取到notepad进程ID为2724,并且成功被关闭 0 远程启动进程,通过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

 

标签:ps,connectionInfo,string,C#,WinRM,runspace,进程,远程,奇技淫巧
From: https://www.cnblogs.com/weskynet/p/18213135

相关文章

  • 如何使用 Channel 类来创建一个生产者-消费者模型
    如何使用Channel类来创建一个生产者-消费者模型.NET中Channel类简单使用 Channel是干什么的TheSystem.Threading.Channelsnamespaceprovidesasetofsynchronizationdatastructuresforpassingdatabetweenproducersandconsumersasynchronously.Theli......
  • BUUCTF-Misc(41-50)
    秘密文件对ftp的数据进行追踪流找到里面被偷走了一个压缩包,然后我们暴力破解解压得到flag[BJDCTF2020]鸡你太美参考:[BUUCTF:BJDCTF2020]鸡你太美_buuctf鸡你太美-CSDN博客篮球的gif篮球副本.gif发现少了47494638我们给文件头补全flag{zhi_yin_you_are_beautif......
  • 深入理解C++智能指针系列(一)
    引言都知道C/C++的最难的就是需要程序员自己管理内存,往往会因为一个简单的逻辑错误导致内存管理异常。通常内存管理过程中会遇到以下问题:内存泄漏:当开发者忘记释放已分配的内存时,就会发生内存泄漏。这种情况在大型项目中非常常见,项目中存在大量动态内存操作时,很容易遗漏......
  • React后台管理(九)-- 页面开发前准备---Outlet布局组件封装
    文章目录前言一、组件源码+解析如下二、页面使用方式三、效果展示总结前言本文主要讲Outlet子路由渲染区域—>结构布局的封装。其中涉及的全局搜索hook函数,后面会单独拎出来讲,这期可先忽略,关注布局即可。一、组件源码+解析如下//@/layout/list/index.jsximport......
  • 赛克oj The diameter of a rectangle(笛卡尔树)
    赛氪OJ-专注于算法竞赛的在线评测系统(saikr.com)这题是hduoj1506的加强版,区别在于宽度不是固定为1了,思路差不多,也是使用笛卡尔树。参考hduoj1506(笛卡尔树)-Venux-博客园(cnblogs.com)1#defineIOstd::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)2#definebu......
  • linux文件权限常用知识点,基于Linux(openEuler、CentOS8)
    目录知识点常用实例知识点真实环境文件显示解读常用实例文件所有者chown-Rnginx:nginx/home/source目录权限(R选填必须大写<遍历子文件夹及文件>)chmod-R755/home/sourcechmod-R777/home/source......
  • C#开发的通讯调试工具
    一款基于C#开发的通讯调试工具(支持ModbusRTU、MQTT调试) 前言今天大姚给大家分享一款基于C#、WPF、Prism、MaterialDesign、HandyControl开发的通讯调试工具(支持ModbusRTU、MQTT调试,界面色彩丰富):Wu.CommTool。工具特点工具界面色彩丰富。支持ModbusRTU、MQTT服务器、M......
  • Linux服务器安装docker,基于Linux(openEuler、CentOS8)
    本实验环境为openEuler系统(以server方式安装)(CentOS8基本一致,可参考本文)目录知识点实验知识点Docker是一个开源的应用容器引擎。它允许开发者将应用及其所有依赖项打包到一个可移植的容器中,并发布到任何支持Docker的流行Linux或Windows操作系......
  • 泛型中K T V E ? Object等分别代表的含义
    E–Element(在集合中使用,因为集合中存放的是元素)T–Type(Java类)K–Key(键)V–Value(值)N–Number(数值类型)?–表示不确定的java类型(无限制通配符类型)S、U、V–这几个有时候也有,这些字母本身没有特定的含义,它们只是代表某种未指定的类型。一般认为和T差不多。......
  • Ubuntu16.04 opencv环境搭建(C++)
    Ubuntu下vscode跑opencv程序环境搭建。目录1ubuntu查看opencv版本2下载opencv包3依赖配置4进入安装包内执行5配置环境变量6VScode配置-下载c++扩展7编译运行helloworld8在vscode中配置opencv环境9运行结果1ubuntu查看opencv版本pkg-config--modversion......