1

以下代码将返回通用 OU 权限

Import-Module ActiveDirectory
set-location AD:
$OUAcl = (Get-Acl 'OU=ParentOU,OU=ChildOU,DC=test,DC=test,DC=com').Access 
$OUAcl

但是我要审核的是高级安全权限。我可以在 GUI 中查看它,我只是不知道如何编写脚本来为我组织中的每个 OU(或特定 OU,取决于我们的需要)生成报告。

要在 GUI 中查看,请执行以下操作:

  1. 打开 MMC 并加载 ADUC 管理单元
  2. 启用视图 → 高级功能
  3. 右键单击任何 OU,选择属性
  4. 在属性窗口中选择安全选项卡
  5. 单击高级按钮。
  6. 查看对该 OU 具有权限的所有用户/组。

我想要的是一份报告,它可以转储有权访问 OU 的每个用户和组,以及他们的所有高级权限(例如:步骤 6 中任何有该框检查它是允许还是拒绝的内容)。

我找到了这个网站,但它没有达到我需要的细节。

这可以通过 PowerShell 实现吗?

4

2 回答 2

2

不久前我制作了一个模块,我认为它可以满足您的需求,可以在这里找到(首先尝试下载第 4 版)。然后你可以做这样的事情:

Get-ADOrganizationalUnit -Filter * | 
    Get-PacAccessControlEntry | 
    Export-Csv c:\ou_permissions.csv -NoTypeInformation

如果您使用版本 3,则命令将是“Get-AccessControlEntry”。版本 3 是一个脚本模块,因此您可以打开文件以查看到底发生了什么以及如何将 ACE(比您的普通文件系统/注册表/服务/等 ACE 更复杂)转换为更易读的格式。版本 4 已编译,但您可以在此处找到源代码。

dsacls.exe 也可以获取此信息,但您可能需要进行一些文本解析才能以更友好的格式获取它...

于 2016-01-09T16:10:45.780 回答
0

这当然是可能的,但我不知道有现成的解决方案可以满足您的需求。您需要自己解决每个 ACE 的单独访问权限。像这样的东西应该工作:

$dn = 'OU=ParentOU,OU=ChildOU,DC=test,DC=test,DC=com'

$ADS_RIGHTS_ENUM = @{
  'ADS_RIGHT_DELETE'                 = 0x10000
  'ADS_RIGHT_READ_CONTROL'           = 0x20000
  'ADS_RIGHT_WRITE_DAC'              = 0x40000
  'ADS_RIGHT_WRITE_OWNER'            = 0x80000
  'ADS_RIGHT_SYNCHRONIZE'            = 0x100000
  'ADS_RIGHT_ACCESS_SYSTEM_SECURITY' = 0x1000000
  'ADS_RIGHT_GENERIC_READ'           = 0x80000000
  'ADS_RIGHT_GENERIC_WRITE'          = 0x40000000
  'ADS_RIGHT_GENERIC_EXECUTE'        = 0x20000000
  'ADS_RIGHT_GENERIC_ALL'            = 0x10000000
  'ADS_RIGHT_DS_CREATE_CHILD'        = 0x1
  'ADS_RIGHT_DS_DELETE_CHILD'        = 0x2
  'ADS_RIGHT_ACTRL_DS_LIST'          = 0x4
  'ADS_RIGHT_DS_SELF'                = 0x8
  'ADS_RIGHT_DS_READ_PROP'           = 0x10
  'ADS_RIGHT_DS_WRITE_PROP'          = 0x20
  'ADS_RIGHT_DS_DELETE_TREE'         = 0x40
  'ADS_RIGHT_DS_LIST_OBJECT'         = 0x80
  'ADS_RIGHT_DS_CONTROL_ACCESS'      = 0x100
}

Import-Module ActiveDirectory

$acl = Get-Acl "AD:$dn"
foreach ($ace in $acl.Access) {
  $ADS_RIGHTS_ENUM.Keys | Where-Object {
    $ace.ActiveDirectoryRights.value__ -band $ADS_RIGHTS_ENUM[$_]
  } | ForEach-Object {
    "{0}`t{1}`t{2}" -f $ace.IdentityReference, $_, $ace.AccessControlType
  }
}
于 2016-01-08T20:33:16.903 回答