New-Object:找不到"PSCredential"的重载和参数计数:"2"

xen*_*rse 30 .net powershell

我正在Windows 8.1机器上编写PowerShell脚本.尝试使用New-Object cmdlet创建PSCredential对象时,出现此错误:

New-Object:找不到"PSCredential"的重载和参数count:"2".

在另一台Windows 8.1机器上运行完全相同的脚本对我来说很好.我还验证了两台机器都运行相同版本的PowerShell 4.0

两台计算机都安装了相同的.NET Framework 4.0.

知道为什么会这样,以及如何解决这个问题?

$userPassword = ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force
$userCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "myUserName", $userPassword
Run Code Online (Sandbox Code Playgroud)

经过一些测试后,我发现了问题所在.对于我的功能,我打算从用户那里获取用户名和密码,但如果用户决定跳过这些输入参数,也会提供默认值.

为此我通过在参数部分添加以下行来实现它

[string][ValidateNotNullOrEmpty()] $userPassword = "myPassword",
Run Code Online (Sandbox Code Playgroud)

似乎问题是我在参数中将它定义为[String]但后来试图成为SecureString,这导致了问题.

删除参数中的[String]属性解决了问题.

xen*_*rse 46

在这种情况下,您可能需要检查参数类型.在此特定示例中,输入参数被声明为String.但是,ConvertTo-SecureString的结果返回SecureString.

在这种情况下,错误消息有点误导.问题不在于因为没有带有2个参数的构造函数,而是因为$ userPassword被声明为String但后来被更改为SecureString.

[string][ValidateNotNullOrEmpty()] $userPassword = "myPassword",

$userPassword = ConvertTo-SecureString -String $userPassword -AsPlainText -Force
$userCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "myUserName", $userPassword
Run Code Online (Sandbox Code Playgroud)


ada*_*ncy 5

如果您引用安全字符串对象,也会发生这种情况:

执行这个

$secPassword = ConvertTo-SecureString "mypassword" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("myusername", "$secPassword")
Run Code Online (Sandbox Code Playgroud)

将返回提到的错误。

然而

$secPassword = ConvertTo-SecureString "mypassword" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("myusername", $secPassword)
Run Code Online (Sandbox Code Playgroud)

将会成功。