如何终止远程服务器特定目录下跨会话运行的进程?
解决远程服务器指定目录进程跨会话终止问题
原脚本失效原因
- 未针对远程服务器执行,默认仅查询本地进程
- 普通权限下,
Get-Process的Path属性无法获取其他用户会话中进程的启动路径,导致过滤逻辑失效 - 遍历目录所有文件再匹配进程路径的方式效率低下,且容易遗漏实际未运行的文件
解决方案(远程服务器)
需以管理员身份运行PowerShell,且目标服务器已开启WinRM(可通过Enable-PSRemoting命令配置)。以下脚本可跨用户会话终止指定目录启动的所有进程:
# 替换为你的远程服务器名称/IP $remoteServer = "RemoteServer01" # 替换为目标目录路径 $targetDir = "C:\CSV\X" Invoke-Command -ComputerName $remoteServer -ScriptBlock { param($targetDir) # 标准化目录路径,避免斜杠、大小写匹配问题 $standardizedDir = [System.IO.Path]::GetFullPath($targetDir).TrimEnd('\') + '\' # 通过CIM获取所有进程,过滤启动路径属于目标目录的进程 Get-CimInstance Win32_Process | Where-Object { $_.ExecutablePath -like "$standardizedDir*" } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force -Verbose } } -ArgumentList $targetDir
本地跨会话终止脚本
如果仅需在本地服务器操作,去掉远程执行部分即可:
$targetDir = "C:\CSV\X" $standardizedDir = [System.IO.Path]::GetFullPath($targetDir).TrimEnd('\') + '\' Get-CimInstance Win32_Process | Where-Object { $_.ExecutablePath -like "$standardizedDir*" } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force -Verbose }
关键说明
- 使用
Get-CimInstance Win32_Process而非Get-Process:前者能在管理员权限下获取所有用户会话进程的ExecutablePath,解决跨会话进程路径不可见的问题 - 标准化目录路径:避免因斜杠格式、大小写差异导致的匹配失败
- 必须以管理员身份运行:否则无法终止其他用户会话的进程
内容的提问来源于stack exchange,提问作者vfdsabvdasvd
相关产品推荐
相关产品推荐

