跨域远程处理 - 确定要使用的凭据的问题
Cross-Domain Remoting - Issues determining which credentials to use
我正在编写一个脚本,该脚本将 运行 大量服务器上的远程 PowerShell,这些服务器可能会随机更改域 。因此,例如,一个列表可能在域 A 上有 50 台服务器,在域 B 上有 150 台服务器。
我已成功通过使用 wildcards/regex 确定服务器加入的域来执行此脚本。
也就是说,使用名称是一个糟糕的解决方案,我想找到一种更好的方法来确定要使用的正确凭据。我想避免使用 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 : One or more computer names are not valid.
这对我来说没有多大意义,因为我使用的语法在 catch
之外的任何地方都能完美运行。例如,在上面的示例中,try
中的代码有效。交换每个块的内容仍然会导致 catch
失败。我也尝试过使用 Remove-PSSession $session
,但这似乎没有帮助。
所以我的问题是:
- 这是完成此任务的最佳方法吗?
- 如果是,为什么我的 catch 块会莫名其妙地失败?
您可以使用 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
...
}
我正在编写一个脚本,该脚本将 运行 大量服务器上的远程 PowerShell,这些服务器可能会随机更改域 。因此,例如,一个列表可能在域 A 上有 50 台服务器,在域 B 上有 150 台服务器。
我已成功通过使用 wildcards/regex 确定服务器加入的域来执行此脚本。
也就是说,使用名称是一个糟糕的解决方案,我想找到一种更好的方法来确定要使用的正确凭据。我想避免使用 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 : One or more computer names are not valid.
这对我来说没有多大意义,因为我使用的语法在 catch
之外的任何地方都能完美运行。例如,在上面的示例中,try
中的代码有效。交换每个块的内容仍然会导致 catch
失败。我也尝试过使用 Remove-PSSession $session
,但这似乎没有帮助。
所以我的问题是:
- 这是完成此任务的最佳方法吗?
- 如果是,为什么我的 catch 块会莫名其妙地失败?
您可以使用 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
...
}