首页 > 解决方案 > c# 取消powershell/MFA登录窗口优雅地运行管道

问题描述

我有 WPF 应用程序并试图通过 powershell 获取 Azure 租户命令:“az login”。

当我关闭默认 MFA 浏览器窗口而不做任何事情时 - 我通过超时取消任务。

var task = Task.Run(() => RunScript(script, new[] { "tenants" }));

if (task.Wait(TimeSpan.FromSeconds(30)))
  global = task.Result;
else
  throw new Exception("Timed out to get Azure credentials");

退出应用程序时的问题我在任务管理器中有应用程序的副本。在下一个代码中意外退出时避免内存泄漏的最佳方法是什么?

       public Dictionary<string, string> RunScript(string script, string[] expectedValues)
        {
            Trace.TraceInformation(script);
            try
            {
                InitialSessionState initialState  = InitialSessionState.CreateDefault();
                initialState.ExecutionPolicy      = Microsoft.PowerShell.ExecutionPolicy.Bypass;
                initialState.AuthorizationManager = new AuthorizationManager("O365");
                initialState.LanguageMode         = PSLanguageMode.FullLanguage;

                using (var runSpace = RunspaceFactory.CreateRunspace(initialState))
                {
                    runSpace.Open();
                    var pipeline = runSpace.CreatePipeline();

                    pipeline.Commands.AddScript(script);

                    var objects = pipeline.Invoke();
                    bool succeed = true;

                    if (pipeline.HadErrors)
                    {
                        var errorList = pipeline.Error.ReadToEnd();

                        foreach (var err in errorList)
                        {
                            string line = err.ToString();

                            if (line.Contains("WARNING"))
                            {
                                Trace.TraceWarning(line);
                            }
                            else
                            {
                                Trace.TraceError(line);
                                succeed = false;
                            }
                        }
                    }
                    if (succeed)
                    {
                        var result = ReadPSValues(runSpace, expectedValues);
                        var generalOutput = PsObjectsToString(objects);

                        if( !string.IsNullOrEmpty(generalOutput) )
                            result[OutputToken] = PsObjectsToString(objects);

                        return result;
                    }

                    return null;
                }
            }
            catch (Exception e)
            {
                Trace.TraceError(e.Message);
            }
            return null;
        }

标签: c#azurepowershellpipeline

解决方案


推荐阅读