Назад | Перейти на главную страницу

Разница между запуском команды через удаленный модуль и Invoke-Command в powershell

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

$cred= Get-Credential
$session= New-PSSession -ComputerName dc1 -Credential $cred
Invoke-Command -ScriptBlock {Import-Module ActiveDirectory} -Session $session
Import-PSSession -Session $session -module ActiveDirectory -Prefix Rem

Создание новой учетной записи пользователя с помощью New-RemADUser -samaccountname $samname -etc все работает как положено.

Однако, если я попытаюсь включить его в функцию, пока нет ошибок, новая учетная запись не создается.

Пример:

function newuser{
param([string]$givenname,[string]$surname,$etc)
New-RemADUser -GivenName $givenname -SurName...
}
$gname= Read-Host "Given name"
...
newuser($gname,$sname,$samname)

Итак, мой вопрос: может ли функция не просматривать командлет New-RemADUser, несмотря на то, что он работает в той же области сценария? Придется ли мне использовать Invoke-Command -Session $ session New-ADUser ..., чтобы функция работала? Или есть какая-то передовая практика или очевидная причина, по которой мой первоначальный способ попробовать это не сработает (значения не передаются правильно, удаленная команда не «существует» внутри функции и т. Д.)?

Когда вы вызываете функцию PowerShell, параметры не разделяются запятыми, как в C #. Когда вы вызываете свою функцию так:

newuser($a,$b,$c)

парсер лечит ($a,$b,$c) как один параметр, и поскольку newuser ожидает, что первый аргумент будет строкой, синтаксический анализатор пытается преобразовать ее в единственную строку - это эквивалент вызова:

newuser -GivenName "$a $b $c"

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

newuser -GivenName $gname -Surname $surname -SamAccountName $etc