我们使用一款基于 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
这里有两个问题。
CMDlet
Get-QADPermission
在执行期间直接写入控制台,这就是您看到的原因Permissions for: ...
。由于您的管道正在写入相同的输出,因此所有内容都会混合在一起。将管道的输出存储到变量中。当您将组导入时
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'
}
还请注意,这仅适用于特定属性的权限。它不会返回对组具有“完全控制”权限的用户的结果,即使他们仍被允许修改成员属性。