在C#中使用“ New-Object” cmdlet

时间:2019-08-22 15:07:20

标签: c# powershell

我正在尝试在我一直在使用的C#程序中运行某些Powershell cmdlet。

我一直试图运行的cmdlet如下:

$cred = New-Object System.Management.Automation.PSCredential (user, (ConvertTo-SecureString pass –ASPlainText –Force)); 

我在C#程序中所做的工作如下:

string user = textBox1.Text;
            string pass = textBox2.Text;



            PowerShell ps = PowerShell.Create();
            ps.AddCommand("New-Object");
            ps.AddArgument("System.Management.Automation.PSCredential ("+user+", (ConvertTo-SecureString "+pass+" –ASPlainText –Force))");
            var cred = ps.Invoke();

但是当我这样做时,系统提示我以下错误:

A constructor was not found. Cannot find an appropriate constructor for type System.Management.Automation.PSCredential (user, (ConvertTo-SecureString pass –ASPlainText –Force)).

所以我的问题是,如何从C#程序运行此Powershell cmdlet,并将结果存储在C#程序内的变量中?

谢谢!

2 个答案:

答案 0 :(得分:2)

这可以在不调用powershell的情况下完成。那是否有用取决于您的工作。

var user = "username";
var pass = new System.Security.SecureString();
foreach (char c in "password")
{
    pass.AppendChar(c);
}
var cred = new System.Management.Automation.PSCredential(user, pass);

答案 1 :(得分:1)

Martin Brown's helpful answer绝对是您情况下最好的解决方案。


关于您尝试过的事情

您没有正确地将PowerShell命令转换为PowerShell SDK调用。 具体来说,您添加参数的方式不正确:

  

ps.AddArgument("System.Management.Automation.PSCredential ("+user+", (ConvertTo-SecureString "+pass+" –ASPlainText –Force))");

  • 您必须通过.AddArgument(<val>)逐个添加参数 ,或者最好通过以下方式添加为命名参数 .AddParameter(<name>, <val>)

  • 您不能将嵌入式PowerShell命令用作参数

如果我们将获取SecureString实例的问题放在一边,而仅使用一个虚拟实例,这就是您的语句的样子:

ps.AddCommand("New-Object")
  .AddParameter("TypeName", "System.Management.Automation.PSCredential")
  .AddParameter("ArgumentList", new object[] { user, new System.Security.SecureString() });

请注意参数名称的使用以及如何将参数-ArgumentList作为数组传递。


如果您确实需要通过SDK执行 PowerShell代码 ,请改用.AddScript()方法,但请注意,您只能传递单个字符串,其中包含要执行的代码(请注意使用内插的C#字符串,$"..."用于嵌入C#变量值):

ps.AddScript(
  $"New-Object PSCredential \"{user}\", (ConvertTo-SecureString \"{pass}\" –AsPlainText –Force)"
);

注意事项:与添加.AddCommand()的命令不同,添加.AddScript()的命令在执行.Invoke()时会无声地失败-没有异常发生;您必须检查ps.HadErrorsps.Streams.Error来检查错误。