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

我正在尝试在我一直在开发的 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# 程序内的变量中?


桃花长相依
浏览 88回答 2
2回答

MM们

这可以在不调用 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);

慕少森

至于你尝试过的:您没有将 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检查错误。相比之下,.AddCommand()如果目标命令报告(语句)终止错误,则会抛出异常(尽管这种情况很少见;一个示例是传递无效的参数名称)。
打开App,查看更多内容
随时随地看视频慕课网APP