我正在尝试在我一直在使用的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#程序内的变量中?
谢谢!
答案 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.HadErrors
和ps.Streams.Error
来检查错误。