跨域远程处理 - 确定要使用哪些凭据的问题

时间:2017-07-03 14:51:36

标签: powershell powershell-remoting

我正在开发一个脚本,该脚本将在大量服务器上运行远程PowerShell,这些服务器可能会随机更改域。因此,例如,列表可能在域A上有50个服务器,在域B上有150个服务器。

我通过使用通配符/正则表达式成功执行此脚本,以确定服务器加入的域。

话虽如此,使用名称是一个糟糕的解决方案,我想找到一种更好的方法来确定要使用的正确凭据。我想避免使用Invoke-Command来测试连接。我发现的最佳解决方案是使用类似于以下内容的东西:

try {
    $session = New-PSSession -Credential $a -ComputerName $_ -ErrorAction Stop
} catch {
    $session = New-PSSession -Credential $b -ComputerName $_
}

在这种情况下,$_只是一个字符串,一个计算机名称。凭证对象通过Get-Credential定义。

从理论上讲,我觉得这可能会更有效率。此外,它根本不起作用。虽然我使用完全相同内容的if / else功能完美,但catch中的代码始终失败:

  

New-PSSession:一个或多个计算机名称无效。

这对我来说没有多大意义,因为我使用的语法在catch之外的任何地方都能完美运行。例如,在上面的示例中,try中的代码有效。交换每个块的内容仍会导致catch失败。我也尝试使用Remove-PSSession $session,但这似乎没有用。

所以我的问题是:

  1. 这甚至是完成此任务的最佳方式吗?
  2. 如果是,为什么我的捕获块会莫名其妙地失败?

1 个答案:

答案 0 :(得分:4)

您可以使用DNS查找从主机名获取FQDN,从FQDN中删除主机名以获取域名,然后通过哈希表中的域名查找凭据。

$credentials = @{
    'example.com' = $a
    'example.com' = $b
    ...
}

...

$serverList | ForEach-Object {
    $fqdn = [Net.Dns]::GetHostByName($_) | Select-Object -Expand HostName
    $null, $domain = $fqdn -split '\.', 2
    $cred = $credentials[$domain]

    $session = New-PSSession -Credential $cred -ComputerName $fqdn
    ...
}