Поэтому я попробовал вызвать следующий код с учетными данными и без них.
$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
Я понятия не имею, что это значит. Может кто-нибудь мне помочь, пожалуйста?
new-object имеет обязательный параметр TypeName — см. Learn.microsoft.com/en-us/powershell/module/…. Поскольку вы не указали значение этого параметра в своем new-object -argumentlist $username, $password, PowerSehll предложит вам ввести значение. Последующая ошибка сообщает вам, что введенное вами значение не является допустимым типом. Следующая ошибка Access Denied сообщает вам, что учетные данные, предоставленные для Invoke-Command, недействительны, что мы уже знаем, поскольку это $null связано с предыдущей ошибкой.
большое спасибо за эти советы. До сих пор я пробовал это и $username = "user" $password = "pass" $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password и со следующими двумя ошибками: new -object: не удалось найти перегрузку для «PSCredential» и количество аргументов: «2». &&& Invoke-Command: невозможно привязать аргумент к параметру «Учетные данные», поскольку он имеет значение NULL.
Достаточно ли указать в качестве учетных данных только имя компьютера и пароль или мне также нужен домен?
Тупой вопрос выше, извините. Я запустил Powershell только неделю назад.
@AnneMarie Это для интерактивного использования или для безголового/автономного использования?
это для интерактивного использования. Мне приходится запускать скрипт на работе с 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)
Большое спасибо за то, что рассказали мне, как создать экземпляр защищенной строки. Я не знал, как это сделать. Перечитаю еще пару раз, чтобы применить все на практике
Всплывающее окно с учетными данными больше не появляется, и я так рад этому.
@AnneMarie Приятно это слышать, всегда пожалуйста! Если мой ответ решит вашу проблему, пометьте его принятым, нажав галочку слева :)
просто щелкнул ;)
это фактически решило мою текущую проблему
Вы случайно не знаете, почему ошибка отказа в доступе все еще может существовать?
Когда ты бежишь Invoke-Command? Наиболее вероятным объяснением является то, что учетная запись пользователя, которой принадлежат учетные данные, не является членом группы локальных администраторов или группы пользователей удаленного управления на целевом компьютере. Если вы получаете это последовательно, убедитесь, что вы правильно указали область/домен при передаче имени пользователя, например. $username = "AnneMariesDomain\User"
В настоящее время я читаю об удаленной документации и надеюсь найти там что-нибудь Learn.microsoft.com/en-us/powershell/module/…
Да, это правда, что компьютеры устроены так, что у них нет доступа друг к другу. Везде только один компьютер с доступом. Но на данный момент я пытаюсь получить доступ хотя бы к локальному компьютеру, используя фактическое имя компьютера, а не LocalHost.
@AnneMarie Обязательно ознакомьтесь с Часто задаваемые вопросы по удаленному взаимодействию и справочными разделами about_Remote_Requirements и about_Remove_Troubleshooting. Удачи! (и не забывайте, что вы всегда можете задать новый вопрос) :)
@AnneMarie Для удаленного взаимодействия с локальным хостом на Win 10+ требуется членство в группе локального администратора, если я правильно помню, поэтому убедитесь, что учетные данные относятся к учетной записи с локальным администратором.
да, думаю, скоро опубликую новый вопрос по этому поводу 😂
Я убедился, что учетные данные принадлежат локальному администратору, и даже когда я даю некоторые случайные учетные данные (почему бы не попробовать), это все равно не удается.
@AnneMarie Это просто означает, что ни то, ни другое не работает и не говорит вам ничего, чего вы не знали. Проверьте журнал Security на своем компьютере (вы можете использовать средство просмотра событий или Get-WinEvent), вы, скорее всего, обнаружите событие неудачного входа в систему, соответствующее попыткам - может сказать вам, почему это не удалось :)
Посмотрите здесь. Я использую этот подход