Ошибка get-adcomputer: "Неверный контекст перечисления" при запуске сценария powershell
Мы переключаемся на WDS для развертывания, поэтому я пишу сценарий powershell, который пингует компьютер и, если он отвечает, получает его MAC-адрес и устанавливает поле netbootGUID в Active Directory. Он работает и работает... некоторое время, а затем возвращает:
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: NotSpecified: (:) [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 подводит меня сегодня.
4 ответа
Мне нравятся команды каталогов get-adcomputer и quest-active для случаев, когда мне нужно много информации на сервере, но в остальном придерживаются команд активного каталога 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, поэтому код мне не по плечу, но я надеюсь, что он сработает для вас. Кажется правильным.
Я надеюсь, что вы решили проблему, но если нет, я надеюсь, что это может как-то помочь.
Удачи!:)
Я бы попробовал поиграть с параметром ResultPageSize на основе этого поста. Возможно, установив несколько сотен результатов одновременно.
NB: я не гуру PS
Мой гугл фу обнаружил следующую ссылку.
Короче говоря, я думаю, что это как-то связано с вашим -ResultSetSize $null
часть сценария. В ссылке используется ОП -notlike "*"
вместо -eq "$Null"
Возможно, поиграйте с этой частью сценария и посмотрите, что произойдет.
Я никогда не решал это. Я закончил тем, что сделал OU под большим контейнером и запустил это для учетных записей 1k за раз.
К сожалению, это останется загадкой, так как эта среда больше не существует.