c# - 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;
}
解决方案
推荐阅读
- flutter - Flutter:建议列表更改时自动完成不显示建议
- python - 极地图:去除边缘?
- excel - 将 Access 表导出到 Excel,但每个名称都有不同的工作表
- java - 如何动态识别页面上的哪个html元素
- html - 将按钮与具有较大字体的图标对齐
- bash - &符号在后台运行进程会导致 Bash 5 中的参数无效
- azure-synapse - 如何在 Azure Synapse 中使用 FOR XML 路径
- sql-server - MS SQL 转置类似于 Excel 转置(动态 SQL)
- elasticsearch - 弹性搜索:将值限制为枚举列表
- typescript - 如何从 Typescript 中的类数组中排除属性类型