我花了很多时间研究这个问题,并请教了许多我认识的 PowerShell 专家,但都无功而返。这应该很简单,但这次绝对不是这样。
客观的:
- 我想要获取 OU 中的所有计算机(OU 中的计算机将会发生变化 - 我愿意使用服务器列表,但仍需要运行以每天获取 OU 中的计算机并更新 txt 文件,然后才能继续执行第二项任务 - 即将解释)。
- 然后,我将使用 OU 中找到的计算机运行 gpupdate(不是强制,每天只有一个策略在 X 时间链接 - 这由另一组 PS 脚本成功处理)。我知道这可以为 OU 手动完成,但这不是我们想要的方式。我们正在使用第三方工具按计划运行 PS 脚本。由于过去存在管理问题,这台计算机未使用任务计划程序,但无论如何第三方工具都很好。问题是我无法返回 OU 中的计算机。
我可以使用以下方法返回我的域中的所有计算机及其基本属性:
Get-ADComputer -Filter *
但是我使用“SearchBase”和任何过滤器运行都没有成功:
Get-ADComputer -SearchBase "OU=WVDTestEnvironment,DC=contoso,DC=com" -Filter "*"
我尝试将 Filter 移至 SearchBase 之前,删除 * 周围的引号,使用单引号,省略过滤器并在提示时将其输入为 *,更改几乎每个单词的大小写,验证 OU 名称、域等,在 OU 和 DC 之间添加空格,将 OU 更改为 CN,确保模块已加载(已加载)。
即使我让这部分工作,我的代码片段也会在管道后继续执行 gpupdate,但我已经完全把它拿掉了,因为我无法越过这个基本部分来收集要更新的计算机。
附加说明 - 这已分别在 Windows Server 2016 和 Windows Server 2019、16 gb 4 cpu、32 gb 8 cpu 上尝试过,只是为了显示马力 - 操作系统可能很重要,因为我过去在 2012 服务器上没有遇到过问题,而且我相信我在页面上发现大部分脚本是在 2012 R2 上运行的。
我曾尝试运行:
Get-ADComputer -Filter 'DistinguishedName -like "CN=contoso,CN=com"'
上述代码不会返回错误,但也不会返回任何结果。尽管它还应该返回域中的所有计算机帐户。
尝试运行原始代码片段时收到的错误:Get-ADComputer -SearchBase“OU = WVDTestEnvironment,DC = contoso,DC = com”-Filter“*”如下: Powershell 代码和返回的错误
这个 OU 也是一个子 OU,因此我也尝试将顶级 OU 纳入我的搜索库中,但错误是一样的(未显示)
Get-ADComputer -SearchBase "OU=TopLevelOUName,OU=WVDTestEnvironment,DC=contoso,DC=com" -Filter "*"
任何帮助或指点都将不胜感激。我相信,一旦我可以取回计算机或内存中保存的计算机的文本文件,并在同一个 powershell 行上的管道后使用该命令,我将不会遇到 GPUpdate 命令的任何问题。我可以删除管道,添加新行,无论需要什么。我只需要返回这些计算机帐户,因为这个 OU 会随着时间的推移而发生很大波动。
最初发现此 PowerShell 代码片段https://blog.thesysadmins.co.uk/group-policy-gpupdate-an-ou-of-computers.html(见方法2)
答案1
奇怪的是,这个问题通过添加一个变量来保存计算机并在每个循环中运行来解决:(另外我的 OU 顺序是错误的,但这并不能解释我使用顶级 OU 运行的其他测试失败了。)
$computers = Get-ADComputer - Filter * - SearchBase "OU=WVDTestEnvironment,OU=TopLevelOU,DC=contoso,DC=com"
foreach ($computer in $computers) {
Invoke-GPUpdate -Computer $computer.Name -RandomDelayInMinutes 0
}
谢谢大家的帮助。也许将来这也会帮助到别人。