Files
Ayay/SHH.MjpegPlayer/Core/Extensions/ProcessExtension.cs

197 lines
5.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Ayay.SerilogLogs;
using Serilog;
using System.Diagnostics;
namespace SHH.MjpegPlayer
{
/// <summary>
/// 进程扩展
/// </summary>
public static class ProcessExtension
{
private static ILogger _sysLog = Log.ForContext("SourceContext", LogModules.Core);
#region GetProcessName
/// <summary>
/// 获取进程名称
/// </summary>
/// <param name="pid"></param>
/// <returns></returns>
public static string GetProcessName(this int pid)
{
try
{
var process = Process.GetProcessById(pid);
return process.ProcessName;
}
catch (Exception ex)
{
_sysLog.Error(ex, "查询进程名出错, Pid: {Pid}", pid);
return string.Empty;
}
}
#endregion
#region KillProcessByPid
/// <summary>
/// 杀掉进程
/// </summary>
/// <param name="pid"></param>
/// <param name="procName"></param>
/// <returns></returns>
public static bool KillProcessByPid(this int pid, string procName = "")
{
try
{
var process = Process.GetProcessById(pid);
if (process != null)
{
procName = process.ProcessName;
process.Kill();
_sysLog.Warning("拒绝停止高权限系统进程: {Pid} - {Name}", pid, process.ProcessName);
return true;
}
else
{
// 找不到 ID 对应的进程,应该是进异常不会进这里
_sysLog.Information("成功杀掉进程 - Pid: {Pid}", pid);
return false;
}
}
catch (ArgumentException)
{
_sysLog.Warning("杀掉进程失败Pid: {Pid} 不存在", pid);
return false;
}
catch (Exception ex)
{
_sysLog.Error(ex, "杀掉进程异常, Pid: {Pid}", pid);
return false;
}
}
#endregion
#region KillProcessByName
/// <summary>
/// 杀掉进程
/// </summary>
/// <param name="pid"></param>
/// <param name="procName"></param>
/// <returns></returns>
public static int KillProcessByName(this string procName)
{
if (string.IsNullOrWhiteSpace(procName)) return 0;
int killCount = 0;
try
{
var processes = Process.GetProcessesByName(procName);
foreach (var proc in processes)
{
using (proc) // Optimized: 确保 Process 资源被释放
{
try
{
if (proc.IsHighPrivilegeProcess()) continue;
int currentId = proc.Id;
proc.Kill();
killCount++;
_sysLog.Information("成功通过名称杀掉进程 - Pid: {Pid}, Name: {Name}", currentId, procName);
}
catch (Exception ex)
{
_sysLog.Error(ex, "通过名称杀掉单个进程失败: {Name}", procName);
}
}
}
return killCount;
}
catch (Exception ex)
{
_sysLog.Error(ex, "通过名称杀掉进程列表异常: {Name}", procName);
return 0;
}
}
#endregion
#region StartProcess
/// <summary>
/// 开启进程
/// </summary>
/// <param name="procPath"></param>
public static bool StartProcess(this string procPath)
{
try
{
if (!File.Exists(procPath))
{
_sysLog.Error("启动进程失败,路径不存在: {Path}", procPath);
return false;
}
// Optimized: 显式记录启动行为
var process = Process.Start(procPath);
if (process != null)
{
_sysLog.Information("进程启动成功: {Path}, Pid: {Pid}", procPath, process.Id);
return true;
}
return false;
}
catch (Exception ex)
{
_sysLog.Error(ex, "启动进程异常: {Path}", procPath);
return false;
}
}
#endregion
#region IsHighPrivilegeProcess
/// <summary>
/// 检测是否高权限等级
/// </summary>
/// <param name="proc"></param>
/// <returns></returns>
public static bool IsHighPrivilegeProcess(this Process proc)
{
// 典型的高权限进程列表(可根据实际需求扩展)
string[] highPrivilegeProcesses = new[] {
"System", "smss.exe", "csrss.exe", "wininit.exe", "services.exe",
"lsass.exe", "winlogon.exe", "spoolsv.exe", "svchost.exe",
"csrss", "msedge"
};
// 检查进程名称是否在高权限列表中
foreach (string name in highPrivilegeProcesses)
{
if (proc.ProcessName.Equals(name, StringComparison.OrdinalIgnoreCase))
return true;
}
// 检查进程是否属于系统会话Session 0
try
{
return proc.SessionId == 0;
}
catch
{
// 如果无法获取 SessionId保守返回 true
return true;
}
}
#endregion
}
}