【发布时间】:2017-07-04 15:13:40
【问题描述】:
我正在编写一个脚本,该脚本将在大量服务器上运行远程 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,但这似乎没有帮助。
所以我的问题是:
- 这是完成这项任务的最佳方式吗?
- 如果是,为什么我的 catch 块莫名其妙地失败了?
【问题讨论】:
-
使用hashtable 将域名映射到凭据?计算机名称是 FQDN 吗? DNS 查找是否返回正确的域?
-
如果我有这些信息,这首先就不是问题了。关键是要允许一定程度的短暂性。
-
使用DNS查找是个好主意,我会试试的。
-
@AnsgarWiechers 如果您想提交答案,这对我有用。
-
"这对我来说没有多大意义,因为我在 catch 之外的任何地方都完美地使用了函数的语法" -
$_在 catch 脚本块中也可以完美地工作,指被捕获的错误 -try { 1/0 } catch { write-host $_ }
标签: powershell powershell-remoting