为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
桃花长相依 2023-09-16 16:10:19
我正在尝试在我一直在开发的 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 回答

?
MM们

TA贡献1886条经验 获得超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);


查看完整回答
反对 回复 2023-09-16
?
慕少森

TA贡献2019条经验 获得超9个赞

至于你尝试过的

您没有将 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检查错误。相比之下,.AddCommand()如果目标命令报告(语句)终止错误,则会抛出异常(尽管这种情况很少见;一个示例是传递无效的参数名称)。


查看完整回答
反对 回复 2023-09-16
  • 2 回答
  • 0 关注
  • 49 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信