我们正在切换到 WDS 进行部署,因此我正在编写一个 powershell 脚本,它将 ping 计算机,如果它响应,则获取其 MAC 地址并在 Active Directory 中设置 netbootGUID 字段。它运行并工作...一段时间,然后返回:
Get-ADComputer:服务器返回以下错误:无效枚举上下文。位于 \Path\To\Scripts\setNetbootGUIDremoteComputers.ps1:3 char:15
- get-adcomputer <<<< -Filter * -searchbase“OU=Somehwere,DC=My,DC=AD,DC=TLD”-ResultSetSize $null | foreach-object {
- CategoryInfo:未指定:(:) [Get-ADComputer],ADException
- FullyQualifiedErrorId:服务器返回了以下错误:无效的枚举上下文。,Microsoft.ActiveDirectory.Management.Commands.GetADComputer
这是脚本:
import-module ActiveDirectory
get-adcomputer -Filter * -searchbase "OU=Somewhere,DC=MY,DC=AD,DC=TLD" -ResultSetSize $null | foreach-object {
$strComputer = $_.Name
$ping = new-object System.Net.NetworkInformation.Ping
$Reply = $ping.send($strComputer)
if ($Reply.status –eq “Success”){
$colItems = GWMI -cl "Win32_NetworkAdapterConfiguration" -name "root\CimV2" -comp $strComputer -filter "IpEnabled = TRUE"
ForEach ($objItem in $colItems) {
$MAC = $objItem.MacAddress.Replace(":", "")
Write-Host "Machine Name: " $strComputer
Write-Host "MAC Address:" $MAC
[guid]$nbGUID = "00000000-0000-0000-0000-$MAC"
$comp = get-adcomputer $strComputer -Properties netbootGUID
$comp.netbootGUID = $nbGUID.ToByteArray()
set-adcomputer -Instance $comp
write-output "$strComputer" | out-file -filePath c:\somewhere\guidSet.txt -append
}
}
else {
write-output "$strComputer" | out-file -filePath c:\somewhere\offline.txt -append
}
$Reply = ""
}
我不知道为什么会出现这个错误,也不知道这意味着什么。我的 GoogleFu 今天出问题了。
答案1
注意:我不是 PS 专家
我的谷歌搜索找到了以下链接。
-ResultSetSize $null
简而言之,我认为这与你的剧本部分有关。在链接中,-notlike "*"
原贴作者使用了-eq "$Null"
也许可以玩一下脚本的那部分,看看会发生什么。
答案2
我喜欢在需要大量服务器信息的情况下使用 get-adcomputer 和 quest-active directory 命令,但在其他情况下,我坚持使用 active-directory 命令dsquery
和dsget
,因为我发现get-adcomputer
和特别是quest
命令不必要地慢,尽管某些东西可能要求您不要使用这些ds
命令。如果您确实可以使用这些命令,这可能值得一试,即使它只会给您一个不同的错误消息,因为它绕过了 get-adcomputer 的使用和现有的确定 ping 能力的方法(有点像米老鼠,但有时这种方式提供了额外的信息)-
dsquery computer ou=Somewhere,dc=My,dc=AD,dc=TLD | ?{$_ -imatch "cn=([^,]+,),"} | % {
$your_computer = $Matches[1]
$cannot_ping_computer = $false
# similarly for the ping command, but should be it's own little function
ping $your_computer | ?{$_ -imatch "\s*Packets: Sent = (\d+), Received = (\d+)" }|% {
# or whatever conditions you find satisfactory
if ($Matches[1] -ne $Matches[2]) $cannot_ping_computer = $true
}
if ( $cannot_ping_computer ) {
#command to jump to next element in pipe, I cannot recall >.<
}
# rest of your code...
}
过去几个月一直没有工作,也无法使用 Windows 计算机,因此代码只是我脑海中的印象,但我希望它对你有用。看起来不错。
我希望您解决了这个问题,如果没有,我希望这可以有所帮助。
祝你好运! :)
答案3
我会尝试根据此使用 ResultPageSize 参数邮政。也许可以一次将其设置为几百个结果。
答案4
我从未解决这个问题。我最终在更大的容器下创建了 OU,并一次针对 1000 个帐户运行此操作。
不幸的是,这仍然是一个谜,因为这个环境已不复存在。