前言:有時候遠程伺服器的進程你想偷偷去圍觀一下有哪些,或者對一些比較調皮的進程進行封殺,或者對一些自己研發的服務進行遠程手動啟動或者重啟等,又不想打開遠程桌面,只想悄咪咪地執行,那也許下麵的文章會對你有啟發。 前提條件 確保遠程伺服器(服務端)已啟用WinRM。在遠程伺服器上運行以下命令可以啟用和配 ...
前言:有時候遠程伺服器的進程你想偷偷去圍觀一下有哪些,或者對一些比較調皮的進程進行封殺,或者對一些自己研發的服務進行遠程手動啟動或者重啟等,又不想打開遠程桌面,只想悄咪咪地執行,那也許下麵的文章會對你有啟發。 前提條件
- 確保遠程伺服器(服務端)已啟用WinRM。在遠程伺服器上運行以下命令可以啟用和配置WinRM:
- 確保執行遠程命令的客戶端和伺服器之間的防火牆規則允許WinRM通信(預設使用埠5985和5986)。
- 本地客戶端網路,需要設置為專用網路
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
歡迎加入QQ群: 群號:1079830632