我有一个程序可以检查程序是否已经启动。
我用:
if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) return;
检查有效,但问题是这不适用于终端服务器。
原因是,我检查现有流程中是否存在流程。
示例:
如果用户A连接到终端服务器并运行程序X,则用户B无法启动该程序(因为用户A的程序X使用将显示在列表中)
我的问题是,如何在C#中检查程序是否已在用户的上下文中运行?
我发现了以下可在PowerShell中运行的WMI代码,但问题是这在C#中不起作用
$owners = @{ }
gwmi win32_process |% {$owners[$_.handle] = $_.getowner().user}
$ps = get - process | select processname,Id,@{ l = "Owner"; e ={$owners[$_.id.tostring()]} }
foreach ($p in $ps) {
if ($p.Owner - eq $env: USERNAME) {
$p
}
}
是否有方法可以通过编辑现有方法来实现此方法?
我试着这样做:
Process[] runningProcesses = Process.GetProcesses();
var currentSessionID = Process.GetCurrentProcess().SessionId;
Process[] sameAsThisSession =
runningProcesses.Where(p => p.SessionId == currentSessionID).ToArray();
if (sameAsThisSession.Contains(System.Diagnostics.Process.GetCurrentProcess()))
{
MessageBox.Show("Program already running!");
}
但这不起作用。 (它确实只显示了用户的过程)。