我有一个程序,我在其中检查该程序是否已经启动。
我用:
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!");
}
但这不起作用。(它确实只显示了用户的进程)。