检查C#中当前用户的进程是否正在运行

时间:2017-12-22 16:14:09

标签: c# authentication terminal-server

我有一个程序可以检查程序是否已经启动。

我用:

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

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

0 个答案:

没有答案