3

我有一个程序,我在其中检查该程序是否已经启动。

我用:

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!");
            }

但这不起作用。(它确实只显示了用户的进程)。

4

0 回答 0