C#的奇技淫巧:利用WinRM來遠程操控其他伺服器上的進程

来源:https://www.cnblogs.com/weskynet/p/18213135
-Advertisement-
Play Games

前言:有時候遠程伺服器的進程你想偷偷去圍觀一下有哪些,或者對一些比較調皮的進程進行封殺,或者對一些自己研發的服務進行遠程手動啟動或者重啟等,又不想打開遠程桌面,只想悄咪咪地執行,那也許下麵的文章會對你有啟發。 前提條件 確保遠程伺服器(服務端)已啟用WinRM。在遠程伺服器上運行以下命令可以啟用和配 ...


  前言:有時候遠程伺服器的進程你想偷偷去圍觀一下有哪些,或者對一些比較調皮的進程進行封殺,或者對一些自己研發的服務進行遠程手動啟動或者重啟等,又不想打開遠程桌面,只想悄咪咪地執行,那也許下麵的文章會對你有啟發。 前提條件
  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

  歡迎加入QQ群: 群號:1079830632 WeskyNet交流群
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近YOLO家族又添新成員:YOLOv10,YOLOv10 提出了一種一致的雙任務方法,用於無nms訓練的YOLOs,它同時帶來了具有競爭力的性能和較低的推理延遲。此外,還介紹了整體效率-精度驅動的模型設計策略,從效率和精度兩個角度對YOLOs的各個組成部分進行了全面優化,大大降低了計算開銷,增強了... ...
  • 不管是在控制台程式還是asp.net core程式中,我們經常會有用到一個需要長時間運行的後臺任務的需求。通常最直覺的方式是使用Thread實例來新建一個線程,但是這樣需要自行管理線程的啟動和停止。 在.net core中提供了一個繼承自IHostedService的基類BackgroudServi ...
  • 可以使用XmlSerializer直接序列化和反序列化xml 反序列化如以下代碼 private T? XmlDeseriallize<T>(string filePath) { XmlSerializer serializer = new XmlSerializer(typeof(T)); usi ...
  • Web Service 理解:Web Service 是一種基於網路的服務,它使用標準化的消息傳遞協議,最典型的是基於 SOAP(Simple Object Access Protocol)協議。SOAP 使用 XML 格式封裝數據,定義了消息的結構和傳輸方式,因此它是一個重量級的解決方案。Web ...
  • 工廠模式(Factory Pattern)是一種創建型設計模式,它提供了一種創建對象的介面,而不是通過具體類來實例化對象。工廠模式可以將對象的創建過程封裝起來,使代碼更具有靈活性和可擴展性。 工廠模式有幾種常見的實現方式: 簡單工廠模式(Simple Factory Pattern): 簡單工廠模式 ...
  • 一:背景 1. 講故事 前些天群里有一個朋友說他們軟體會偶發崩潰,想分析看看是怎麼回事,所幸的是自己會抓dump文件,有了dump就比較好分析了,接下來我們開始吧。 二:WinDbg 分析 1. 程式為什麼會崩潰 windbg 還是非常強大的,當你雙擊打開的時候會自動幫你定位過去展示崩潰時刻的寄存器 ...
  • StackExchange.Redis 是一個高性能的 Redis 客戶端庫,主要用於 .NET 環境下與 Redis 伺服器進行通信,大名鼎鼎的stackoverflow 網站就使用它。它使用非同步編程模型,能夠高效處理大量請求。支持 Redis 的絕大部分功能,包括發佈/訂閱、事務、Lua 腳本等... ...
  • 爆了,爆了,DeveloperSharp系列近期又被製造業ERP、民航飛行App、建築BIM、電力掌上營業廳、等多家大型採用,站在巨人的肩膀上你能走的更遠。 支持.Net Core2.0及以上,支持.Net Framework4.0及以上 http請求調用是開發中經常會用到的功能。在內,調用自有項目 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...