我正在尝试使用$ PSDefaultParameterValues来简化我的生活。我遇到的问题是,当调用通过隐式远程处理加载的cmdlet时,我在$ PSDefaultParameterValues中设置的任何内容都会被忽略。
我目前遇到的一个简化示例:
$domainController = 'dc1.ptloma.edu'
Import-Module ActiveDirectory
foreach($command in (Get-Command -Module ActiveDirectory -ParameterName Server))
{
$PSDefaultParameterValues["$($command.Name):Server"] = $domainController
}
$exchangeSessionParameters = @{
Name = "ExchangeInterop"
ConfigurationName = "Microsoft.Exchange"
Authentication = "Kerberos"
Credential = $ExchangeCredential
ConnectionUri = "http://server.domain.com/PowerShell/"
}
$exchangePsSession = New-PSSession @exchangeSessionParameters
$remoteModule = Import-Session -Session $exchangePsSession
foreach($command in (Get-Command -Module $remoteModule -ParameterName DomainController))
{
$PSDefaultParameterValues["$($command.Name):DomainController"] = $domainController
}
try
{
New-AdGroup -Path "OU=Automated,OU=Groups,DC=domain,DC=com" -Name "GroupA"
Enable-DistributionGroup -Identity "CN=GroupA,OU=Automated,OU=Groups,DC=domain,DC=com" -Alias "GroupA" -PrimarySmtpAddress "GroupA@domain.com"
}
catch
{
# Breakpoint here
Write-Host $_.Exception.SerializedRemoteInvocationInfo
throw
}
我得到的例外情况如下:
The operation couldn't be performed because object 'domain.com/Groups/Automated/GroupA' couldn't be found on 'dc2.domain.com'.
请注意,它是在谈论dc2,而不是我在DomainController属性上设置为默认值的dc1。
深入查看错误记录,我发现SerializedRemoteInvocationInfo属性仅显示Alias
,PrimarySmtpAddress
和Identity
作为绑定参数。它似乎没有为DomainController
传递任何内容。
我知道我可以重构并显式定义DomainController参数或使用脚本范围的哈希表和splatting,但这需要改变很多,我真的很好奇为什么这种行为是这样的。< / p>
答案 0 :(得分:0)
对这些Exchange会话使用隐式远程处理时,Exchange cmdlet(实际上它们是代理函数)将传递到远程会话以供执行,然后将结果传递回本地会话。远程会话中不存在该哈希表。