我正在尝试设置一个脚本来查找我们网络上文件共享的所有权限信息。
目前我有一个可以执行此操作的 Powershell 脚本,但它包括组、用户、SID 帐户等所有内容。
我已经手动筛选了 SID 帐户,但我想知道是否有 Select-Object 可以使其仅显示 Active Directory 组信息?以下是我目前拥有的代码片段:
$ACLs = get-acl $Folder.FullName |
ForEach-Object {$_.Access} |
Where {$_.IdentityReference -notlike "*S-1-5*"}
也许是objectClass 类团体“??
答案1
您无法直接从 IdentityReference 获取所需的信息,但如果您对其施加一些逻辑(与您已经采取的过滤 SID 帐户的方向不同),您可以将其缩小到仅 AD 对象。
(Get-Acl -Path $Folder.FullName | ForEach-Object {
[string]$Identity = $_.IdentityReference
if ($Identity -like '*\*' -and $Identity -notlike 'BUILTIN*' -and $Identity -notlike 'NT AUTHORITY*') {
$SamAccountName = $Indentity.Split('\')[1]
$ADObject = Get-ADObject -Filter ('SamAccountName -eq "{0}"' -f $SamAccountName)
if ($ADObject.ObjectClass -eq 'group') {
$Identity
}
}
}
这里的大部分工作都是由那个“if”语句完成的。测试反斜杠可确保对象是某种域(本地或 AD 或其他)的一部分。然后它会抛出我在测试中看到的本地域。
就我而言,这足以确保我始终能够获取 AD 对象,无论它们是用户还是组,之后获取 ADObject 并测试其对象类就非常简单了。
如果您要在只有一个域的环境中执行此操作,则可以更改 if 语句以单独查找该域,这将减少测试用例的数量,例如:
if ($Identity -like 'test.domain.com\*)
您还可以进一步采取此措施并获取实际的 ADGroup 对象等。
答案2
我也在 TechNet 上问过这个问题,因此对于任何对我正在使用的解决方案感兴趣的人 - 它就在这里:
$ACLs = get-acl $Folder.FullName |
ForEach-Object {$_.Access} |
Where {$_.IdentityReference -notlike "*S-1-5*" -and (dsquery group -samid $_.IdentityReference.Value.Split("\")[1])}
该方法仅返回“组”广告项目。