Подтвердить что ты не робот

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] в моем параметре решило проблему.

4b9b3361

Ответ 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, чтобы запросить у пользователя свои учетные данные.