获取每个文件夹的关联安全组?

时间:2014-03-11 19:49:40

标签: powershell

我使用下面的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

2 个答案:

答案 0 :(得分:0)

我假设“关联安全组”是指用于授予用户访问该文件夹权限的组。操作系统无法固有地识别ACL中的组的用途,因此您需要确定一组一致的标准,这些标准可用于标识哪些组是“关联的安全组”。

一些例子:

  • “关联安全组”是否始终是具有权限的安全主体? (如果是这样,这会使事情变得更简单;但也不太可能,因为您通常至少 BUILTIN \ Administrators Domain Admins NT AUTHORITY \ SYSTEM CREATOR OWNER 。)
  • 这些组是否遵循一些可以从文件夹名称派生的命名约定?例如,我使用了命名约定,如 ACL_ ServerName_ShareName_PermissionsCode (例如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
这对我来说更有意义,因为你希望将组拆分为用户级别。我想你可以为每个共享列出每个人自己的行,但是你的列表会很长。无论如何,你应该能够用我给你的东西得到你想要的东西。