(Powershell)方法返回特定用户具有“写成员”安全性的组列表

(Powershell)方法返回特定用户具有“写成员”安全性的组列表

我们使用一款基于 Web 的软件,用户可以登录该软件来管理对 AD 组控制的共享的访问。用户可以管理的组列表是他们拥有“写入成员”安全性的组。这允许用户在无需了解 AD 的情况下维护文件共享。

我正在尝试使用 quest.activeroles.admanagement 编写一个 Powershell 脚本,该脚本将返回指定用户具有“写入成员”安全性的组的简洁列表,以便清除已离职用户的权限。我需要搜索的组存储在 OU 中,尽管其中有 1,000 多个。

我目前想到的办法有:

add-pssnapin quest.activeroles.admanagement
Get-QADObject -ShowProgress -SearchRoot 'domain.server.com/path/to/OU' -SearchScope 'OneLevel' -Type Group -SizeLimit 2500 | Get-QADPermission -Rights 'WriteProperty' -Property 'member' -Account "user" -WarningAction SilentlyContinue

这可以正常工作(但效率低下),但主机输出相当混乱:

Permissions for: full.domain.path/OU/path/group1

Ctrl   Account                                  Rights                              Source           AppliesTo                                    
----   -------                                  ------                              ------           ---------                                    
       Domain\user                              Write member                        Not inherited    This object and all child objects            
Permissions for: full.domain.path/OU/path/group2
       Domain\user                              Write member                        Not inherited    This object and all child objects                        Not inherited    This object and all child objects            
Permissions for: full.domain.path/OU/path/group3
       Domain\user                              Write member                        Not inherited    This object and all child objects                        Not inherited    This object only                             
Permissions for: full.domain.path/OU/path/group4
       Domain\user                              Write member                        Not inherited    This object and all child objects                        Not inherited    This object and all child objects            

我得到了所需的信息,但周围却有很多无用的东西。如果我通过管道/附加到文本文件,我只会得到用户名,而不是组名。理想情况下,我想要的只是一个没有 OU 路径的组名列表,或者在理想情况下,一个 CSV,其中第一列是用户名,第二列是组,这样我就可以运行多个用户(foreach ($username in $usernames)):

User                Group
domain\username     group_name_one
domain\username     group_name_two
domain\username     group_name_three

解决这个问题的最佳方法是什么,以便 Export-CSV 能够输出一些更好的东西?

答案1

这里有两个问题。

  1. CMDletGet-QADPermission在执行期间直接写入控制台,这就是您看到的原因Permissions for: ...。由于您的管道正在写入相同的输出,因此所有内容都会混合在一起。将管道的输出存储到变量中。

  2. 当您将组导入时Get-QADPermission,您会丢弃组对象并获取权限对象。如果您想保留原始对象,则需要使用 Where-Object 进行过滤。

另外,请谨慎使用Get-QADPermission。如果您仅查询WriteProperty,则不会返回具有读取和写入访问权限的结果。通常您希望同时查询两者。并且在大多数情况下,您还希望使用-Inherited从父 OU 授予的权限。如果您确实需要一次性权限,那么您可以忽略此开关。

function Test-UserCanModifyGroupsInOU ($Username, $OU)
{
  $results = Get-QADGroup -SearchScope 'OneLevel' -SearchRoot $OU |
    Where-Object {
      $_ | Get-QADPermission -Rights ReadProperty,WriteProperty -Property member -Account $username
    } |
    Select @{Name="User";Expression={$username}}, @{Name="Group";Expression={$_.Name}}
  $results | Write-Output
  $results | Export-Csv "$username.csv"
}

@("bob","sally") |
  ForEach-Object {
    Test-UserCanModifyGroupsInOU -Username $_ -OU 'domain.org.com/path/to/OU'
  }

还请注意,这仅适用于特定属性的权限。它不会返回对组具有“完全控制”权限的用户的结果,即使他们仍被允许修改成员属性。

相关内容