.net - Objeto nuevo: no se puede encontrar una sobrecarga para "PSCredential" y el argumento cuenta: "2"
powershell (2)
Estoy escribiendo un script de PowerShell en una máquina con Windows 8.1. Al intentar crear un objeto PSCredential con el cmdlet New-Object, se me presentó este error:
Objeto nuevo: no se puede encontrar una sobrecarga para "PSCredential" y el argumento cuenta: "2".
Ejecutar exactamente el mismo script en otra máquina con Windows 8.1 funciona bien para mí. También he verificado que ambas máquinas ejecutan la misma versión de PowerShell 4.0
Ambas máquinas tienen el mismo .NET Framework instalado 4.0.
¿Alguna idea de por qué sucede esto y cómo podría resolver este problema?
$userPassword = ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force
$userCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "myUserName", $userPassword
Después de algunas pruebas más, descubrí el problema. Para mi función, pretendía tomar el nombre de usuario y la contraseña del usuario, pero también proporcionar valores predeterminados si el usuario decide omitir esos parámetros de entrada.
Para eso lo logré agregando la siguiente línea en la sección de parámetros
[string][ValidateNotNullOrEmpty()] $userPassword = "myPassword",
Parece que el problema es que lo definí como un [String] en el parámetro, pero más tarde intenté ser un SecureString, lo que resultó en el problema.
Eliminar el atributo [String] en mi parámetro solucionó el problema.
Además, recuerde que si no necesita una credencial específica distinta de la credencial actual de la persona que ejecuta el comando (o secuencia de comandos), puede omitir todo esto con una sola línea:
$Cred = Get-Credential
Una ventana emergente le pedirá que ingrese su nombre de usuario y contraseña. De esta manera, ha capturado sus credenciales en una variable que puede usar en la línea de comandos o puede usar esto en un script para pedirle al usuario sus credenciales.
En una situación como esta, es posible que desee comprobar su tipo de parámetro. En este ejemplo en particular, el parámetro de entrada fue declarado como una cadena. Sin embargo, el resultado de ConvertTo-SecureString devuelve un SecureString.
El mensaje de error es un poco engañoso en esta situación. El problema no es porque no hay un constructor con 2 argumentos, sino porque $ userPassword se declaró como una cadena, pero luego se cambió a SecureString.
[string][ValidateNotNullOrEmpty()] $userPassword = "myPassword",
$userPassword = ConvertTo-SecureString -String $userPassword -AsPlainText -Force
$userCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "myUserName", $userPassword