Сценарий Powershell для отключения раздела «Компьютер или пользователи» объекта групповой политики

#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 загружает состояние для объекта групповой политики, и когда они изменяются таким образом, он обнаруживает несоответствие, которого нет), вы можете запустить его после проверки 🙂

Для получения дополнительной информации

  1. флаги = 0: все включено
  2. флаги = 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 (замените его правильным путем к файлу)