C# c中的PowerShell Scriptblck#

C# c中的PowerShell Scriptblck#,c#,system.management,C#,System.management,我正在尝试用c#运行一个powershell脚本,其中包含以下命令: 获取凭证 我可以使用Process命令运行该文件: public static void RunFile(string ps1File) { var startInfo = new ProcessStartInfo() { FileName = "powershell.exe",

我正在尝试用c#运行一个powershell脚本,其中包含以下命令: 获取凭证

我可以使用Process命令运行该文件:

 public static void RunFile(string ps1File)
        {
            
            var startInfo = new ProcessStartInfo()
            {
                FileName = "powershell.exe",
                Arguments = $"-NoProfile -ExecutionPolicy unrestricted -file \"{ps1File}\"",
                UseShellExecute = false,
                CreateNoWindow = true
            };
            try
            {
                Process P = Process.Start(startInfo);
                P.WaitForExit();
                var result = P.ExitCode;
                System.Diagnostics.Debug.WriteLine("Error: " + result);
            }
            catch (Exception e)
            {
                throw;
            }
        }
但是我没有得到PS的返回值。因此,我正在尝试System.Management.Automation,但现在我遇到了一个问题,即PS窗口无法打开,我直接得到了错误代码:

public async static void RunFileTest(string ps1File) {

    PowerShell ps = PowerShell.Create();

    //PowerShell ps = PowerShell.Create();
    if (File.Exists(ps1File)) {

        ScriptBlock sb = ScriptBlock.Create(System.IO.File.ReadAllText(ps1File));
        System.Diagnostics.Debug.WriteLine("SB: " + sb.ToString());


        // execute the script and await the result.
        //var results = await ps.InvokeAsync().ConfigureAwait(false);

        //var results = ps.Invoke();

        PSCommand new1 = new PSCommand();
        
        
        ps.Commands = new1;

        var results = ps.Invoke();

        foreach (var result in results)
        {
            Console.WriteLine(result); //<-- result NOT results
            System.Diagnostics.Debug.WriteLine("Error: " + result.ToString());
        }

        System.Diagnostics.Debug.WriteLine("Errors: " + results);
    } else
    {
        System.Diagnostics.Debug.WriteLine("Error: " + "No File");
    }
}
public异步静态void RunFileTest(字符串ps1File){
PowerShell ps=PowerShell.Create();
//PowerShell ps=PowerShell.Create();
if(File.Exists(ps1File)){
ScriptBlock sb=ScriptBlock.Create(System.IO.File.ReadAllText(ps1File));
System.Diagnostics.Debug.WriteLine(“SB:+SB.ToString());
//执行脚本并等待结果。
//var results=await ps.InvokeAsync().ConfigureAwait(false);
//var results=ps.Invoke();
PSCommand new1=新PSCommand();
ps.Commands=new1;
var results=ps.Invoke();
foreach(结果中的var结果)
{

Console.WriteLine(result);//据我所知,如果从C#调用PowerShell时,PowerShell窗口不可见,则无法显示该窗口中的任何提示

我们解决这一问题的方法是事先要求用户提供凭据,并将它们作为参数传递给PS脚本。您甚至可以将敏感数据(如密码)作为
SecureString
传递

使用系统;
使用系统安全;
公共静态类控制台帮助器
{
/// 
///将用户输入替换为“*”字符
/// 
///用户输入作为SecureString
公共静态SecureString GetPassword(字符串消息)=>
GetString(消息,GetPasswordReader);
公共静态字符串GetNotEmptyString(字符串消息)=>
GetString(message,(str)=>!string.IsNullOrWhiteSpace(str));
公共静态字符串GetString(字符串消息,Func validator=null)=>
GetString(消息、Console.ReadLine、验证器);
私有静态T GetString(字符串消息,Func读取器,Func验证器=null)
{
T值;
while(true)
{
控制台。写入(消息+“:”);
值=读取器();
if(验证器?.Invoke(值)!=false)
{
打破
}
}
返回值;
}
私有静态SecureString GetPasswordReader()
{
var pass=new SecureString();
控制台键;
做
{
var keyInfo=Console.ReadKey(intercept:true);
key=keyInfo.key;
if(key==ConsoleKey.Backspace&&pass.Length>0)
{
Console.Write(“\b\b”);
通过。移除(通过。长度-1);
}
如果(!char.IsControl(keyInfo.KeyChar))
{
控制台。写(“*”);
pass.AppendChar(keyInfo.KeyChar);
}
} 
while(key!=ConsoleKey.Enter);
Console.WriteLine();
回程通行证;
}
}
用法示例:

var scriptCommand=new命令(formexportersscriptpath)
{
参数=
{
{“User”,ConsoleHelper.GetNotEmptyString(“输入用户名”)},
{“Password”,ConsoleHelper.GetPassword(“输入密码”)},
}
};
使用(var powershell=powershell.Create())
{
powershell.Commands.AddCommand(scriptCommand);
powershell.Invoke();
Console.ForegroundColor=ConsoleColor.DarkGray;
foreach(powershell.Streams.Information中的var结果)
{
Console.WriteLine(result.MessageData.ToString());
}
if(powershell.Streams.Error.Any())
{
Console.ForegroundColor=ConsoleColor.DarkRed;
foreach(powershell.Streams.Error中的var结果)
{
Console.WriteLine(result.Exception.Message);
}
}
Console.ResetColor();
}