PowerShell GenericList问题:如何添加权限来源(用户/组)字段
解决PowerShell权限脚本中
From列显示正确身份的问题 你遇到的核心问题是原脚本里不管是用户自身的权限还是通过组继承的权限,From列都固定显示为用户账号,我们只需要调整From字段的取值逻辑,让它动态匹配当前权限对应的身份(用户或组)即可。
修改后的完整脚本
$User = "Testumgebung\cbruehwiler" $UserOhneDomain = "cbruehwiler" $Path = "T:\" $List = New-Object System.Collections.Generic.List[System.Object] # 获取用户所属的所有AD组,整理为完整的域\组名格式 $UserGroups = Get-ADPrincipalGroupMembership $UserOhneDomain | ForEach-Object { "TESTUMGEBUNG\$($_.Name)" } # 把用户自身也加入到需要检查的身份列表中 $TargetIdentities = $User, $UserGroups # 调整输出字段,From字段改为动态获取当前权限的对应身份 $OutputFields = @( @{name="Item" ; expression={$_.Path.split(':',3)[-1]}} @{name="Rights" ; expression={$Right.FileSystemRights}} @{name="AccessType" ; expression={$Right.AccessControlType}} @{name="From" ; expression={$Right.IdentityReference.Value}} ) $FileSystemObjects = Get-ChildItem $Path -Recurse | ForEach-Object {Get-Acl $_.FullName} # 合并循环逻辑,一次遍历所有权限并匹配目标身份 foreach ($Item in $FileSystemObjects) { foreach ($Right in $Item.Access) { if ($TargetIdentities -contains $Right.IdentityReference.Value) { $List.Add(($Item | Select-Object $OutputFields)) } } } $List | Out-File C:\Users\cbruehwiler\Desktop\PermissionCheck.txt
关键修改说明
统一身份列表:
- 把用户自身和所属的组整理成一个
TargetIdentities列表,包含完整的域\账号/组名格式,这样可以用一次循环完成所有匹配,不用分开处理用户和组的权限。
- 把用户自身和所属的组整理成一个
动态设置
From字段:- 修改
OutputFields中From的表达式,直接取$Right.IdentityReference.Value,这个值就是当前权限对应的具体身份(用户或组的完整名称),不再硬编码为固定的用户账号。
- 修改
简化循环结构:
- 合并了原脚本中两次遍历文件系统对象的循环,现在只需要一次遍历,检查每个权限是否属于目标身份列表中的成员,代码更简洁高效。
修改后的输出示例
Item Rights AccessType From ---- ------ ---------- ---- T:\TestFolder FullControl Allow Testumgebung\cbruehwiler T:\TestFolder Read, Synchronize Allow Testumgebung\Domain Users T:\TestFolder Write, ReadAndExecute, Synchronize Allow Testumgebung\TestGroup
内容的提问来源于stack exchange,提问作者Andr0mega
相关产品推荐
相关产品推荐

