Вопрос или проблема
У меня есть PowerShell версии 4.0 на Windows Server 2012. Сейчас я выполняю следующую команду PowerShell:
$admin = "domain\user"
$pwd = "*****" | ConvertTo-SecureString -asPlainText -Force
$LiveCred = New-Object System.Management-Automation.PSCredential($admin, $pwd)
Invoke-Command -ComputerName **** -Credential $LiveCred {Get-VM}
но я получил эту ошибку:
New-Object : Cannot find type [System.Management-Automation.PSCredential]: verify that the assembly containing this
type is loaded.
поэтому я обновил свой скрипт PowerShell следующим образом:
add-pssnapin System.Management-Automation;
$admin = "domain\user"
$pwd = "*****" | ConvertTo-SecureString -asPlainText -Force
$LiveCred = New-Object System.Management-Automation.PSCredential($admin, $pwd)
Invoke-Command -ComputerName **** -Credential $LiveCred {Get-VM}
Но я получил новую ошибку:
add-pssnapin : The Windows PowerShell snap-in 'System.Management-Automation' is not installed on this computer.
At line:1 char:1
+ add-pssnapin System.Management-Automation;
Может ли кто-то посоветовать, что вызывает вышеуказанные две ошибки?
Второй вопрос: есть ли более прямой способ передать пароль внутри Invoke-Command
? Сейчас я могу передать имя пользователя следующим образом:
Invoke-Command -ComputerName **** -Credential domain\username {Get-VM}
но не уверен, могу ли я передать пароль таким же образом?
Спасибо
У вас тире там, где должна быть точка. Не существует класса System.Management-Automation
, это System.Management.Automation
:
$LiveCred = New-Object System.Management.Automation.PSCredential($admin, $pwd)
Ответ или решение
Ошибка, с которой вы столкнулись, связана с опечаткой в вашем коде PowerShell. Вы пытаетесь использовать класс System.Management-Automation.PSCredential
, который не существует. На самом деле, правильное название класса — System.Management.Automation.PSCredential
.
Решение проблемы
-
Исправление опечатки в классе:
Вам необходимо исправить опечатку в коде и заменитьSystem.Management-Automation
наSystem.Management.Automation
. Правильный код для создания объектаPSCredential
будет выглядеть так:$admin = "domain\user" $pwd = "*****" | ConvertTo-SecureString -asPlainText -Force $LiveCred = New-Object System.Management.Automation.PSCredential($admin, $pwd) Invoke-Command -ComputerName **** -Credential $LiveCred {Get-VM}
-
Устранение проблемы с добавлением "snap-in":
Ошибкаadd-pssnapin : The Windows PowerShell snap-in 'System.Management-Automation' is not installed on this computer.
связана с тем, что вы пытаетесь добавить несуществующий snap-in. В данном случае, этот шаг не требуется, так какSystem.Management.Automation
— это часть стандартной библиотеки PowerShell, и она уже доступна по умолчанию. -
Передача учетных данных:
Вторая часть вашего вопроса касается передачи пароля в командуInvoke-Command
. Безопасность является важным аспектом, поэтому не рекомендуется передавать пароль в явном виде в скриптах. Наиболее правильный способ — это использование объектаPSCredential
, как было показано выше.Если необходимо автоматически вводить учетные данные, рассмотрите возможность использования метода
Get-Credential
, который позволяет интерактивно получать учетные данные:$LiveCred = Get-Credential -Credential "domain\user" Invoke-Command -ComputerName **** -Credential $LiveCred {Get-VM}
Этот подход безопаснее, так как пароль вводится пользователем во время выполнения скрипта и не хранится в открытом виде.
Завершение
Эти корректировки должны помочь вам устранить возникшие проблемы. Убедитесь, что вы правильно пишете классы и избегаете ненужного добавления snap-ins, так как это может вызвать сбои и снизить безопасность вашего кода.
Надеюсь, эта информация окажется полезной в решении ваших задач с PowerShell.