Надстройка Windows PowerShell ‘System.Management-Automation’ не установлена на этом компьютере.

Вопрос или проблема

У меня есть 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.

Решение проблемы

  1. Исправление опечатки в классе:
    Вам необходимо исправить опечатку в коде и заменить 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}
  2. Устранение проблемы с добавлением "snap-in":
    Ошибка add-pssnapin : The Windows PowerShell snap-in 'System.Management-Automation' is not installed on this computer. связана с тем, что вы пытаетесь добавить несуществующий snap-in. В данном случае, этот шаг не требуется, так как System.Management.Automation — это часть стандартной библиотеки PowerShell, и она уже доступна по умолчанию.

  3. Передача учетных данных:
    Вторая часть вашего вопроса касается передачи пароля в команду Invoke-Command. Безопасность является важным аспектом, поэтому не рекомендуется передавать пароль в явном виде в скриптах. Наиболее правильный способ — это использование объекта PSCredential, как было показано выше.

    Если необходимо автоматически вводить учетные данные, рассмотрите возможность использования метода Get-Credential, который позволяет интерактивно получать учетные данные:

    $LiveCred = Get-Credential -Credential "domain\user"
    Invoke-Command -ComputerName **** -Credential $LiveCred {Get-VM}

    Этот подход безопаснее, так как пароль вводится пользователем во время выполнения скрипта и не хранится в открытом виде.

Завершение

Эти корректировки должны помочь вам устранить возникшие проблемы. Убедитесь, что вы правильно пишете классы и избегаете ненужного добавления snap-ins, так как это может вызвать сбои и снизить безопасность вашего кода.

Надеюсь, эта информация окажется полезной в решении ваших задач с PowerShell.

Оцените материал
Добавить комментарий

Капча загружается...