通过远程模块运行命令和在 powershell 中调用命令的区别

通过远程模块运行命令和在 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 cmdlet?我是否必须使用 Invoke-Command -Session $session New-ADUser... 才能使该函数正常工作?或者是否存在一些最佳实践或明显的原因导致我最初尝试的方法不起作用(值传递不正确、远程命令在函数中不“存在”等)?

答案1

调用 PowerShell 函数时,参数不像 C# 那样以逗号分隔。当您像这样调用函数时:

newuser($a,$b,$c)

解析器将其($a,$b,$c)视为一个参数,并且由于newuser期望第一个参数是一个字符串,因此解析器尝试将其转换为单个字符串 - 这相当于调用:

newuser -GivenName "$a $b $c"

尝试使用空格分隔参数来调用它,或者,如果您想绝对确定,请明确给出参数名称:

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

相关内容