我使用下面的powershell代码获取网络共享上的文件夹和子文件夹列表。是否也可以显示相关的安全组?例如Select-Object fullname,securitygroup?如果可能的话,还要抓住属于该组成员的用户列表?谢谢!
输出就像:
\ Server \ Share \ Folder1 Folder1-W John Doe ....
Get-ChildItem \\Server\Share | Where { $_.PSIsContainer } | Foreach {Get-Childitem $_.FullName}| Where { $_.PSIsContainer } | Select-Object fullname
答案 0 :(得分:0)
我假设“关联安全组”是指用于授予用户访问该文件夹权限的组。操作系统无法固有地识别ACL中的组的用途,因此您需要确定一组一致的标准,这些标准可用于标识哪些组是“关联的安全组”。
一些例子:
ACL_HQFP01_Shared-Folder1-M
)。在这种情况下,始终可以识别给定共享和子文件夹名称的权限组名称。 我将猜测您是否遵循Microsoft推荐的最佳做法:您正在使用NTFS权限,并且您没有为除此之外指定的域组以外的任何内容分配显式权限,使这些“关联安全组”成为具有显式权限的唯一安全主体。在这种情况下,您可以包含这些组的逗号分隔列表,如下所示:
| Select-Object FullName, @{Name = 'AssociatedSecuirtyGroups'; Expression = {((Get-Acl $_).Access | ?{! $_.IsInherited} | Select-Object -ExpandProperty IdentityReference) -join ', '}}
您可以通过导入Active Directory模块并使用 Get-ADGroupMember 来获取组的成员(或者有更复杂的方法来查询没有模块的AD),但究竟如何取决于哪个你希望“抓住”它们的方式,因为如果一个文件夹可以有多个关联的安全组,那么你不能在每个文件夹显示的一行中完成它,至少不会让事情变得非常混乱。
答案 1 :(得分:0)
在拉出目录列表后,为什么不首先过滤,而不是过滤文件夹?它应该大大加快速度。然后,您可以通过循环运行结果以使用Get-ACL提取安全组,并在此时获取具有Get-ADGroupMember的成员。试试这个尺寸...
$Output = @()
$DirList = GCI \\server\share -directory | %{$_.FullName; GCI $_ -Directory|select -expandproperty FullName}
ForEach($Dir in $DirList){
$ACLs=@()
(get-acl $Dir).accesstostring.split("`n")|?{$_ -match "^(.+?admin(istrators|141))\s+?(\w+?)\s+?(.+)$"}|%{
$ACLs+=[PSCUSTOMOBJECT]@{Group=$Matches[1];Type=$Matches[2];Access=$Matches[3]}
}
ForEach($ACL in $ACLs){
if($Members){Remove-Variable Members}
$Members = Get-ADGroupMember $ACL.Group -ErrorAction SilentlyContinue|%{[string]$_.SamAccountName}
$Output += "$Dir $($ACL.Group) $($ACL.Access) $($Members -join ",")"
}
}
现在,考虑到你想要的东西,你的输出似乎不太现实,所以我以这种格式为每个文件夹制作了一行:例如:
\\ Server01 \ ShareA ShareA-R ReadOnly John Doe,JaneSmith
\\ Server01 \ ShareA ShareA-W Read,Write JackDaniels,CaptMorgan
\\ Server01 \ ShareB ShareB-R ReadOnly JohnDoe
这对我来说更有意义,因为你希望将组拆分为用户级别。我想你可以为每个共享列出每个人自己的行,但是你的列表会很长。无论如何,你应该能够用我给你的东西得到你想要的东西。