c#运行空间进程在父进程被杀死时被杀死

时间:2020-09-14 08:58:36

标签: c# powershell

我正在使用Microsoft.PowerShell.5.1.ReferenceAssemblies运行一些Powershell脚本。

    private String GetToken(IdentityUser user)
    {      // Createthetoken
        var claims = new[] {
            new Claim(JwtRegisteredClaimNames.Sub, user.Email),
            new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName)
        };
        String s = _config["Tokens:Key"];
        if (s == null)
        {
            throw new ArgumentNullException();
        }
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(s));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
        var token = new JwtSecurityToken(null, null, claims, expires: DateTime.Now.AddMinutes(30), signingCredentials: creds);
        return new JwtSecurityTokenHandler().WriteToken(token);
    }

我在psScriptsRunning中跟踪运行空间。因此,当我关闭应用程序时,我会仔细检查并关闭运行空间。

    private void RunScript(string command)
    {

        var runspace = RunspaceFactory.CreateRunspace();
        runspace.Open();
        var builder = new StringBuilder();

        var task = new Task(() => {

            var pipeline = runspace.CreatePipeline();
            pipeline.Commands.AddScript(command);
            try
            {
                var result = pipeline.Invoke();
                foreach (var r in result)
                {
                    builder.Append(r.ToString());
                }
            }
            catch (Exception e)
            {
                builder.Append(e);
            }

            runspace.Close();

            var consoleOutput = builder.ToString();

            runspace.Dispose();
        });

        psScriptsRunning.Add(runspace);

        task.Start();
    }

这具有关闭powershell脚本及其产生的所有进程的作用。但是,似乎实际上需要花费一些时间才能关闭流程,如果您有更好的方法来改进此流程,请告诉我。

但是,如果有人从任务管理器中杀死了我的应用程序,则此代码将无法运行。如何杀死Powershell脚本启动的任何进程?

以前,在直接通过运行空间直接支持Powershell脚本之前,我曾经创建过一个进程并通过powershell.exe启动。

我能够确保通过使用作业对象杀死所有产生的进程,请参见Kill child process when parent process is killed

现在我正在使用运行空间,如何实现相同的功能?

之所以选择运行空间而不是使用powershell.exe是因为Powershell脚本的启动时间更长。

1 个答案:

答案 0 :(得分:0)

经过一些调查后确定。事实证明,我眼前有了解决方案。 Kill child process when parent process is killed

中的作业对象c#代码

是我所需要的。我在我创建的所有子进程中都调用了它,看来我不需要这样做。我要做的就是在应用程序的过程中调用它。然后我的应用程序通过运行空间等创建的所有进程都自动从同一作业中被标记为。因此,当任何人杀死我的应用程序进程时,所有其他进程也会被杀死。

我只是犯了一个错误,即我不得不自己处理孩子的工作并亲自分配给工作。