New-Object: Невозможно найти перегрузку для "PSCredential" и количество аргументов: "2"
Я пишу PowerShell script на машине Windows 8.1. При попытке создать объект PSCredential с помощью командлета New-Object мне была представлена эта ошибка:
Новый объект: не удается найти перегрузку для "PSCredential" и количество аргументов: "2".
Запуск точно такой же script на другой машине 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
После еще нескольких тестов я выяснил эту проблему. Для моей функции я намеревался взять имя пользователя и пароль от пользователя, но также предоставить значения по умолчанию, если пользователь решил пропустить эти входные параметры.
Для этого я достиг этого, добавив следующую строку в раздел параметров
[string][ValidateNotNullOrEmpty()] $userPassword = "myPassword",
Кажется, проблема в том, что я определил ее как [String] в параметре, но позже попытался быть SecureString, что привело к этой проблеме.
Удаление атрибута [String] в моем параметре решило проблему.
Ответы
Ответ 1
В такой ситуации вы можете проверить тип вашего параметра. В этом конкретном примере входной параметр был объявлен как String. Однако результат ConvertTo-SecureString возвращает SecureString.
Сообщение об ошибке немного вводит в заблуждение в этой ситуации. Проблема не в том, что нет конструктора с двумя аргументами , а в том, что $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
Ответ 2
Также помните, что если вам не нужны конкретные учетные данные, отличные от текущих учетных данных человека, выполняющего команду (или script), вы можете пропустить все это с помощью однострочного интерфейса:
$Cred = Get-Credential
Затем всплывающее окно предложит вам ввести свое имя пользователя и пароль. Точно так же вы зарегистрировали свои учетные данные в переменной, которую вы можете использовать в командной строке, или можете использовать ее в script, чтобы запросить у пользователя свои учетные данные.