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
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...