Вопрос или проблема
Мы обновляем Windows 10 до 11. Я пытаюсь автоматизировать перемещение объектов рабочих станций между двумя OU, однако скрипт ничего не находит.
Import-Module ActiveDirectory
$SourceOU = “OU=Win10,OU=Fake Workstations,DC=Fake,DC=Fake,DC=Fake"
$TargetOU = "OU=Win11,OU=Fake Workstations,DC=Fake,DC=Fake,DC=Fake"
$Computers = Get-ADComputer -SearchBase $SourceOU -Filter * -Property OperatingSystem |
Where-Object { $_.OperatingSystem -eq “Microsoft Windows 11 Enterprise" }
if ($Computers.Count -gt 0) {
foreach ($Computer in $Computers) {
# Переместить каждый компьютер в целевую OU
Write-Host "Перемещаем $($Computer.Name) в $TargetOU"
Move-ADObject -Identity $Computer.DistinguishedName -TargetPath $TargetOU
}
Write-Host "Операция успешно завершена!"
} else {
Write-Host "Не найдено ни одного компьютера с Microsoft Windows 11 Enterprise в $SourceOU."
}
Ответ или решение
Перемещение объектов Active Directory (AD) между организационными единицами (OU) является важной задачей для системных администраторов, особенно в процессе обновления операционных систем на рабочих станциях, как в вашем случае при переходе с Windows 10 на Windows 11. Рассмотрим вашу задачу детально и разберем возможные причины, почему скрипт не выполняет ожидаемые действия, предложив при этом решения.
Теория
Active Directory функционирует как централизованная система управления, предоставляя возможность хранить информацию об объектах в сети, таких как пользователи, компьютеры и другие ресурсы. Организационные единицы (OU) служат для структурирования объектов внутри AD, предоставляя удобные средства управления.
Основная задача вашего скрипта — это автоматизация процесса перемещения объектов рабочего стола из одной OU, содержащей компьютеры под управлением Windows 10, в другую OU, подготовленную для компьютеров с Windows 11. Однако ваш скрипт не выполняет перемещение, поскольку объекты, которые он фильтрует, не соответствуют критериям, таким как операционная система, указанная в скрипте.
Пример
Ваш текущий скрипт сначала импортирует модуль Active Directory, определяет исходную и целевую OU, затем выполняет поиск объектов рабочих станций в исходной OU, фильтруя их по операционной системе:
$Computers = Get-ADComputer -SearchBase $SourceOU -Filter * -Property OperatingSystem |
Where-Object { $_.OperatingSystem -eq “Microsoft Windows 11 Enterprise" }
Если объектов с операционной системой "Microsoft Windows 11 Enterprise" в исходной OU не найдено, скрипт выводит сообщение о том, что такие компьютеры не обнаружены, и, соответственно, не выполняет перемещение.
Возможные проблемы и их решения
-
Несоответствие строковых литералов: В PowerShell часто бывает необходимо убедиться, что используемые строковые литералы соответствуют точным значениям, включая кавычки. В вашем скрипте есть проблема с использованием смарт-квот ("“”) вместо простых кавычек ("") — это может привести к несрабатыванию фильтрации. Убедитесь, что везде используются двойные кавычки ("").
-
Неправильный фильтр операционной системы: Возможно, в AD для объектов рабочих станций зарегистрирована другая строка для свойства
OperatingSystem
. Рекомендуется выполнить отдельную проверку с минимальным набором данных, например:Get-ADComputer -SearchBase $SourceOU -Filter * | Select-Object Name, OperatingSystem
Это позволит вам увидеть, какие значения на самом деле зарегистрированы в AD и скорректировать фильтр в скрипте.
-
Проверка наличия объектов: Убедитесь, что в исходной OU действительно находятся объекты с Windows 11. Если переход с Windows 10 осуществлен неправильно, таких объектов может действительно не быть в данной OU.
-
Права доступа: Убедитесь, что ваша учетная запись имеет достаточные права для перемещения объектов AD. Выполните команду
$USER
в PowerShell, чтобы подтвердить, что вы вошли под правильной учетной записью. -
Логирование и отладка: Для упрощения диагностики добавьте логирование в скрипт. Например:
Write-Host "Processing computer: $($_.Name), OS: $($_.OperatingSystem)"
Применение
Расширив скрипт дополнительными проверками и возможностями наподобие вышеуказанных, вы можете добиться успешного деплоя Windows 11 и соответствующего рефакторинга в AD:
Import-Module ActiveDirectory
$SourceOU = "OU=Win10,OU=Fake Workstations,DC=Fake,DC=Fake,DC=Fake"
$TargetOU = "OU=Win11,OU=Fake Workstations,DC=Fake,DC=Fake,DC=Fake"
# Проверка объектов в SourceOU
$Computers = Get-ADComputer -SearchBase $SourceOU -Filter * -Property OperatingSystem |
Where-Object { $_.OperatingSystem -like "*Windows 11*" }
if ($Computers.Count -gt 0) {
foreach ($Computer in $Computers) {
Write-Host "Moving $($Computer.Name) to $TargetOU"
Move-ADObject -Identity $Computer.DistinguishedName -TargetPath $TargetOU
}
Write-Host "Operation completed successfully!"
} else {
Write-Host "No Windows 11 computers found in $SourceOU."
}
Такой подход обеспечит гибкость и надежность автоматизации в вашей инфраструктуре. Не забывайте тестировать изменения в скрипте в контролируемой среде для предотвращения ошибок в рабочей архитектуре AD.