Мы переключаемся на WDS для развертывания, поэтому я пишу сценарий PowerShell, который проверяет связь с компьютером и, если он отвечает, получает его MAC-адрес и устанавливает поле netbootGUID в Active Directory. Он запускается и работает ... некоторое время, а затем возвращается:
Get-ADComputer: сервер вернул следующую ошибку: недопустимый контекст перечисления. В \ Path \ To \ Scripts \ setNetbootGUIDremoteComputers.ps1: 3 символа: 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 сегодня подводит меня.
Мне нравятся команды get-adcomputer и quest-active directory для случаев, когда мне нужно много информации на сервере, но в остальном я придерживаюсь команд active-directory. dsquery
и dsget
, потому что я нахожу get-adcomputer
и особенно quest
команды излишне медленные, хотя что-то может потребовать от вас не использовать эти ds
команды. Если у вас есть доступ к этим командам, это, возможно, стоит попробовать, даже если оно просто выдает другое сообщение об ошибке, поскольку оно обходит использование get-adcomputer и существующий метод определения способности пинговать (что-то вроде Mickey -Мышь, но иногда так дает дополнительную информацию) -
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, так что код не в моей голове, но я надеюсь, что он сработает для вас. Кажется правильным.
Я надеюсь, что вы решили проблему, но если нет, я надеюсь, что это может как-то помочь.
Удачи! :)
NB: Я не гуру PS
Мой гугл фу поднял следующая ссылка.
Короче, я думаю, это как-то связано с вашим -ResultSetSize $null
часть сценария. В ссылке OP использовал -notlike "*"
вместо -eq "$Null"
Может быть, поиграйте с этой частью сценария и посмотрите, что произойдет.
Я бы попробовал поиграть с параметром ResultPageSize на основе этого Почта. Возможно, выставив несколько сотен результатов за раз.
Я так и не решил это. Я закончил тем, что создал подразделения под большим контейнером и запустил их для 1k учетных записей за раз.
К сожалению, это останется загадкой, поскольку такой среды больше не существует.