#powershell #active-directory #gpo
#powershell #active-directory #объект групповой политики
Вопрос:
Я ищу фрагмент кода powershell для отключения раздела «Компьютер или пользователь» объектов групповой политики Active Directory.
Я извлек Guid соответствующих объектов групповой политики, просто нужно найти способ отключить либо компьютер, либо раздел «пользователь», но не весь объект групповой политики.
Цель состоит в том, чтобы отключить раздел «Компьютер» объекта групповой политики, если он пуст, и наоборот.
Спасибо.
Ответ №1:
Вот так (вам нужно только изменить DC=mydom,DC=adds
mydom.adds
строки и, чтобы они соответствовали вашему домену) :
Get-ChildItem "AD:CN=Policies,CN=System,DC=mydom,DC=adds" | Select -ExpandProperty Name | ForEach-Object {
if (-not (Get-ChildItem \mydom.addsSYSVOLmydom.addsPolicies$_MACHINE))
{
# No machine configuration, disable machine parameters
Set-ADObject "CN=$_,CN=Policies,CN=System,DC=mydom,DC=adds" -Replace @{flags=2}
}
elseif (-not (Get-ChildItem \mydom.addsSYSVOLmydom.addsPolicies$_USER))
{
# No user configuration, disable user parameters
Set-ADObject "CN=$_,CN=Policies,CN=System,DC=mydom,DC=adds" -Replace @{flags=1}
}
}
Вы должны закрыть gpmc.msc перед запуском, чтобы избежать ошибок (gpmc загружает состояние для объекта групповой политики, и когда они изменяются таким образом, он обнаруживает несоответствие, которого нет), вы можете запустить его после проверки 🙂
Для получения дополнительной информации
- флаги = 0: все включено
- флаги = 3: все отключить
или лучше всего управлять ими всеми :
Get-ChildItem "AD:CN=Policies,CN=System,DC=mydom,DC=adds" | Select -ExpandProperty Name | ForEach-Object {
$flags = 0
if (-not (Get-ChildItem \mydom.addsSYSVOLmydom.addsPolicies$_MACHINE))
{
$flags = 2
}
if (-not (Get-ChildItem \mydom.addsSYSVOLmydom.addsPolicies$_USER))
{
# Disable all if both are empty, and user only otherwise
$flags = 1
}
Set-ADObject "CN=$_,CN=Policies,CN=System,DC=mydom,DC=adds" -Replace @{flags=$flags}
}
Для этого необходимо иметь «чистый» объект групповой политики. Я имею в виду, что если у вас есть объект групповой политики, например, без конфигурации компьютера, то в редакторе групповой политики вы переходите в раздел настроек Windows для политики компьютера и ничего не делаете, редактор добавит структуру папок Scripts в объект групповой политики, поэтому Get-ChildItem \mydom.addsSYSVOLmydom.addsPolicies$_MACHINE)
он не вернется $null
и $flags
не будет установлен на 2соответственно. С небольшим количеством кода довольно легко очистить эти пустые структуры 😉
:
Get-ChildItem "AD:CN=Policies,CN=System,DC=mydom,DC=adds" | Select -ExpandProperty Name | ForEach-Object {
$flags = 0
$machineItems = Get-ChildItem \mydom.addsSYSVOLmydom.addsPolicies$_MACHINE
$machineScripts = Get-ChildItem \mydom.addsSYSVOLmydom.addsPolicies$_MACHINEScripts -Recurse
$userItems = Get-ChildItem \mydom.addsSYSVOLmydom.addsPolicies$_USER
$userDocs = Get-ChildItem "\mydom.addsSYSVOLmydom.addsPolicies$_USERDocuments amp; Settings" -Recurse
$userScripts = Get-ChildItem \mydom.addsSYSVOLmydom.addsPolicies$_USERScripts -Recurse
if (-not ($machineItems) -or ($machineItems.Count -eq 1 -and $machineItems[0].Name -eq "Scripts" -and $machineScripts.Count -eq 2 -and $machineScripts[0].Name -eq "Shutdown" -and $machineScripts[1].Name -eq "Startup"))
{
# No machine configuration (or empty Scripts folders)
# Optionally, you can delete extra Scripts folder here
$flags = 2
}
if (-not ($userItems) -or ($userItems.Count -eq 2 -and $userItems[0].Name -eq "Documents amp; Settings" -and $userItems[1].Name -eq "Scripts" -and $userScripts.Count -eq 2 -and $userScripts[0].Name -eq "Logoff" -and $userScripts[1].Name -eq "Logon"))
{
# No user configuration (or empty 'Documents amp; settings' and Scripts folders)
# Disable all if both are empty, and user only otherwise
# Optionally, you can delete extra 'Documents amp; settings' and Scripts folders here
$flags = 1
}
Set-ADObject "CN=$_,CN=Policies,CN=System,DC=mydom,DC=adds" -Replace @{flags=$flags}
}
И если вам нужен только специальный список, сохраните его в текстовом файле в этом формате :
{GUID1}
{GUID2}
...
И замените {Get-ChildItem "AD:CN=Policies,CN=System,DC=mydom,DC=adds" | Select -ExpandProperty Name
на Get-Content C:GPOsDatasList.txt
(замените его правильным путем к файлу)