При использовании команды вызова с учетными данными параметр учетных данных инициализируется неправильно

Поэтому я попробовал вызвать следующий код с учетными данными и без них.

$username = "user"
$password = "password"
$cred = new-object -argumentlist $username, $password

#Invoke-Command -ComputerName computer -FilePath "C:\Some\Path.ps1" -Credential $cred
Invoke-Command -ComputerName localhost -FilePath "C:\Some\Path.ps1"

после вызова в cmd появились такие строки:

cmdlet New-Object at command pipeline position 1
Supply values for the following parameters:
TypeName:

Since I do not know what this parameters are referring to I type a letter and then the following error occurs:

new-object : Cannot find type [;]: verify that the assembly containing this type is loaded.
At C:\Some\Path.ps1:8 char:9
+ $cred = new-object -argumentlist $username, $password
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

[localhost] Connecting to remote server localhost failed with the following error message : Access is denied. For more
information, see the about_Remote_Troubleshooting Help topic.
    + CategoryInfo          : OpenError: (localhost:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : AccessDenied,PSSessionStateBroken

Я понятия не имею, что это значит. Может кто-нибудь мне помочь, пожалуйста?

Посмотрите здесь. Я использую этот подход

pierpy 21.06.2024 11:53
new-object имеет обязательный параметр TypeName — см. Learn.microsoft.com/en-us/powershell/module/…. Поскольку вы не указали значение этого параметра в своем new-object -argumentlist $username, $password, PowerSehll предложит вам ввести значение. Последующая ошибка сообщает вам, что введенное вами значение не является допустимым типом. Следующая ошибка Access Denied сообщает вам, что учетные данные, предоставленные для Invoke-Command, недействительны, что мы уже знаем, поскольку это $null связано с предыдущей ошибкой.
mclayton 21.06.2024 12:03

большое спасибо за эти советы. До сих пор я пробовал это и $username = "user" $password = "pass" $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password и со следующими двумя ошибками: new -object: не удалось найти перегрузку для «PSCredential» и количество аргументов: «2». &&& Invoke-Command: невозможно привязать аргумент к параметру «Учетные данные», поскольку он имеет значение NULL.

Anne Marie 21.06.2024 12:07

Достаточно ли указать в качестве учетных данных только имя компьютера и пароль или мне также нужен домен?

Anne Marie 21.06.2024 12:08

Тупой вопрос выше, извините. Я запустил Powershell только неделю назад.

Anne Marie 21.06.2024 12:33

@AnneMarie Это для интерактивного использования или для безголового/автономного использования?

Mathias R. Jessen 21.06.2024 13:01

это для интерактивного использования. Мне приходится запускать скрипт на работе с 1 компьютера на другой и я могу зайти на все компьютеры. До сих пор я пытаюсь запустить его на локальном хосте, но это не удается.

Anne Marie 21.06.2024 13:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не волнуйтесь: PowerShell — это удивительно сложная среда выполнения языка, и начальная кривая обучения может быть довольно крутой :)

В .NET — среде выполнения, на основе которой построен PowerShell — все объекты имеют тип, поэтому вам необходимо указать тип объекта, который вы хотите, при его создании.

Чтобы найти подходящее имя типа, давайте сначала посмотрим на параметр -Credential, которому вы будете передавать объект в качестве аргумента. Мы можем использовать Get-Help <commandName> -Parameter <parameterName> для проверки определения параметра:

PS ~> Get-Help Invoke-Command -Parameter Credential

-Credential <pscredential>

    Required?                    false
    Position?                    Named
    Accept pipeline input?       true (ByPropertyName)
    Parameter set name           ComputerName, Uri, FilePathComputerName, FilePathUri, VMId, VMName, FilePathVMId, FilePathVMName
    Aliases                      None
    Dynamic?                     false

В первой строке мы видим, что он ожидает значение типа pscredential.

Для интерактивных сценариев самый простой способ создать объект pscredential — использовать команду Get-Credential — она запросит у вас пароль и вернет объект pscredential, который вы затем сможете передать Invoke-Command (и повторно использовать позже, если желательно):

PS ~> $credential = Get-Credential -Username $username # this will prompt you for a password
Enter your credentials.
Password for user asd: ********

PS ~> Invoke-Command {...} -Credential $credential # now we can pass the credential object to the command parameter

Предполагая, что все целевые компьютеры являются частью одного и того же домена и у ваших учетных данных есть доступ для подключения к конечной точке WinRM на них, вы можете повторно использовать один и тот же объект учетных данных для всех них:

foreach ($computerName in $listOfComputerNames) {
  Invoke-Command -ComputerName $computerName -ScriptBlock { ... } -Credential $credential
}

... или вы можете передать все имена компьютеров Invoke-Command за один раз:

Invoke-Command -ComputerName $listOfComputerNames -ScriptBlock { ... } -Credential $credential

Однако для автоматического использования вам все равно может потребоваться найти способ создания экземпляра объекта учетных данных без Get-Credential.

Давайте попробуем передать правильное имя типа New-Object:

PS ~> $cred = New-Object -TypeName pscredential -ArgumentList $username, $password

New-Object : Cannot find an overload for "PSCredential" and the argument count: "2".
At line:1 char:9
+ $cred = New-Object -TypeName pscredential -ArgumentList $username, $p ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

О, нет! Аргументы, переданные в New-Object, не соответствуют параметрам конструктора, определенным типом pscredential.

Самый простой способ проверить все сигнатуры перегрузки для конструктора данного типа — вызвать статический метод new для типа без передачи списка аргументов:

PS ~> [pscredential]::new

OverloadDefinitions
-------------------
pscredential new(string userName, securestring password)
pscredential new(psobject pso)

Конструктор с сигнатурой pscredential new(string userName, securestring password), вероятно, именно то, что нам нужно, но он говорит, что ожидает объект типа securestring, а не обычную строку.

Чтобы создать экземпляр [securestring] из обычного текста, мы можем использовать командлет ConvertTo-SecureString:

PS ~> $securePassword = $password |ConvertTo-SecureString -AsPlainText -Force
PS ~> $credential = New-Object pscredential -ArgumentList $username, $securePassword
PS ~> # yay, no more errors!
Ps ~> Invoke-Command {...} -Credential $credential

В качестве альтернативы команде New-Object вы также можете использовать статический метод ::new, который мы использовали ранее для обнаружения сигнатур конструктора:

PS ~> $credential = [pscredential]::new($username, $securePassword)

Большое спасибо за то, что рассказали мне, как создать экземпляр защищенной строки. Я не знал, как это сделать. Перечитаю еще пару раз, чтобы применить все на практике

Anne Marie 21.06.2024 14:23

Всплывающее окно с учетными данными больше не появляется, и я так рад этому.

Anne Marie 21.06.2024 14:25

@AnneMarie Приятно это слышать, всегда пожалуйста! Если мой ответ решит вашу проблему, пометьте его принятым, нажав галочку слева :)

Mathias R. Jessen 21.06.2024 14:29

просто щелкнул ;)

Anne Marie 21.06.2024 14:30

это фактически решило мою текущую проблему

Anne Marie 21.06.2024 14:35

Вы случайно не знаете, почему ошибка отказа в доступе все еще может существовать?

Anne Marie 21.06.2024 14:36

Когда ты бежишь Invoke-Command? Наиболее вероятным объяснением является то, что учетная запись пользователя, которой принадлежат учетные данные, не является членом группы локальных администраторов или группы пользователей удаленного управления на целевом компьютере. Если вы получаете это последовательно, убедитесь, что вы правильно указали область/домен при передаче имени пользователя, например. $username = "AnneMariesDomain\User"

Mathias R. Jessen 21.06.2024 14:39

В настоящее время я читаю об удаленной документации и надеюсь найти там что-нибудь Learn.microsoft.com/en-us/powershell/module/…

Anne Marie 21.06.2024 14:41

Да, это правда, что компьютеры устроены так, что у них нет доступа друг к другу. Везде только один компьютер с доступом. Но на данный момент я пытаюсь получить доступ хотя бы к локальному компьютеру, используя фактическое имя компьютера, а не LocalHost.

Anne Marie 21.06.2024 14:43

@AnneMarie Обязательно ознакомьтесь с Часто задаваемые вопросы по удаленному взаимодействию и справочными разделами about_Remote_Requirements и about_Remove_Troubleshooting. Удачи! (и не забывайте, что вы всегда можете задать новый вопрос) :)

Mathias R. Jessen 21.06.2024 14:46

@AnneMarie Для удаленного взаимодействия с локальным хостом на Win 10+ требуется членство в группе локального администратора, если я правильно помню, поэтому убедитесь, что учетные данные относятся к учетной записи с локальным администратором.

Mathias R. Jessen 21.06.2024 14:47

да, думаю, скоро опубликую новый вопрос по этому поводу 😂

Anne Marie 21.06.2024 14:47

Я убедился, что учетные данные принадлежат локальному администратору, и даже когда я даю некоторые случайные учетные данные (почему бы не попробовать), это все равно не удается.

Anne Marie 21.06.2024 14:59

@AnneMarie Это просто означает, что ни то, ни другое не работает и не говорит вам ничего, чего вы не знали. Проверьте журнал Security на своем компьютере (вы можете использовать средство просмотра событий или Get-WinEvent), вы, скорее всего, обнаружите событие неудачного входа в систему, соответствующее попыткам - может сказать вам, почему это не удалось :)

Mathias R. Jessen 21.06.2024 15:01

Другие вопросы по теме