运行 powershell 脚本时出现 get-adcomputer 错误:“无效枚举上下文”

运行 powershell 脚本时出现 get-adcomputer 错误:“无效枚举上下文”

我们正在切换到 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 命令dsquerydsget,因为我发现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 个帐户运行此操作。

不幸的是,这仍然是一个谜,因为这个环境已不复存在。

相关内容