Powershell脚本禁用GPO的“计算机或用户”部分

问题描述

我正在寻找一个Powershell代码段以禁用Active Directory GPO的计算机或用户部分。

我已经提取了相关GPO的指南,只需要找到一种方法来禁用计算机或用户部分,而不是禁用整个GPO。

目标是禁用GPO的计算机部分(如果为空,反之亦然)。

谢谢。

解决方法

就像这样(您只需要更改DC=mydom,DC=addsmydom.adds字符串以匹配您的域)即可:

Get-ChildItem "AD:\CN=Policies,CN=System,DC=mydom,DC=adds" | Select -ExpandProperty Name | ForEach-Object {
    if (-not (Get-ChildItem \\mydom.adds\SYSVOL\mydom.adds\Policies\$_\MACHINE))
    {
        # No machine configuration,disable machine parameters
        Set-ADObject "CN=$_,CN=Policies,DC=adds" -Replace @{flags=2}
    }
    elseif (-not (Get-ChildItem \\mydom.adds\SYSVOL\mydom.adds\Policies\$_\USER))
    {
        # No user configuration,disable user parameters
        Set-ADObject "CN=$_,DC=adds" -Replace @{flags=1}
    }
}

运行该命令之前,您应该关闭gpmc.msc以避免发生错误(gpmc加载了GPO的状态,当以这种方式更改它们时,它会检测到不一致(不是),可以在运行后进行验证:)

更多信息

  1. 标志= 0:全部启用
  2. 标志= 3:全部禁用

或最好将它们全部统治:

Get-ChildItem "AD:\CN=Policies,DC=adds" | Select -ExpandProperty Name | ForEach-Object {
    $flags = 0
    if (-not (Get-ChildItem \\mydom.adds\SYSVOL\mydom.adds\Policies\$_\MACHINE))
    {
        $flags = 2
    }
    if (-not (Get-ChildItem \\mydom.adds\SYSVOL\mydom.adds\Policies\$_\USER))
    {
        # Disable all if both are empty,and user only otherwise
        $flags += 1
    }
    Set-ADObject "CN=$_,DC=adds" -Replace @{flags=$flags}
}

这需要具有“干净的” GPO。我的意思是,例如,如果您有一个没有计算机配置的GPO,则在组策略编辑器中,进入计算机策略的Windows设置部分,什么也不做,编辑器会将Scripts文件夹结构添加到GPO,因此Get-ChildItem \\mydom.adds\SYSVOL\mydom.adds\Policies\$_\MACHINE)将不会返回$null,并且$flags也不会相应地设置为2。只需多一点代码,清理那些空结构就很容易了;) :

Get-ChildItem "AD:\CN=Policies,DC=adds" | Select -ExpandProperty Name | ForEach-Object {
   $flags = 0
   $machineItems = Get-ChildItem \\mydom.adds\SYSVOL\mydom.adds\Policies\$_\MACHINE
   $machineScripts = Get-ChildItem \\mydom.adds\SYSVOL\mydom.adds\Policies\$_\MACHINE\Scripts -Recurse
   $userItems = Get-ChildItem \\mydom.adds\SYSVOL\mydom.adds\Policies\$_\USER
   $userDocs = Get-ChildItem "\\mydom.adds\SYSVOL\mydom.adds\Policies\$_\USER\Documents & Settings" -Recurse
   $userScripts = Get-ChildItem \\mydom.adds\SYSVOL\mydom.adds\Policies\$_\USER\Scripts -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 & 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 & settings' and Scripts folders)
       # Disable all if both are empty,and user only otherwise
       # Optionally,you can delete extra 'Documents & settings' and Scripts folders here
       $flags += 1
   }
   Set-ADObject "CN=$_,DC=adds" -Replace @{flags=$flags}
}

如果只需要特殊列表,请将其保存为以下格式的文本文件:

{GUID1}
{GUID2}
...

然后将{Get-ChildItem "AD:\CN=Policies,DC=adds" | Select -ExpandProperty Name替换为Get-Content C:\GPOsDatas\List.txt(将其替换为正确的文件路径)