首页 > 解决方案 > PowerShell 列出链接到文件共享文件夹的组中的用户

问题描述

我有一个特定的 OU,其中包含我们用来控制对文件共享上的一些特定文件夹的访问的组,比如 fileshare1、fileshare2 和 fileshar3。

OU=example2,OU=example1,OU=Groups,DC=domain1,DC=domain2,DC=example,DC=uk

我需要获取一个用户列表,这些用户是在 fileshare1 上使用的组的成员......有没有人有办法做到这一点?是否让powershell循环遍历每个文件夹的安全部分以获取正在使用的组...

对于我需要列出的每个组,文件夹名称和有权访问的人。

我在看谷歌,但有点画空白......

标签: powershellloops

解决方案


您可以尝试以下方法:

$ou = "OU=example2,OU=example1,OU=Groups,DC=domain1,DC=domain2,DC=example,DC=uk"
$groups = Get-ADGroup -Filter * -SearchBase $ou
$fileshare = "\\server\share\"
$folders = Get-ChildItem $fileshare -Directory
foreach($folder in $folders){
    $accessRights =  Get-Acl -Path $folder
    $groupsWithAccess = @()
    foreach($group in $accessRights.Access){
        $groupName = $group.identityReference.value.split("\")[-1]
        $getGroup = $groups | Where-Object {($_.samAccountName -eq $groupName -or $_.name -eq $groupName)}
        if($getGroup){
            $groupsWithAccess += $getGroup
        }
    }
    $memberObject = @()
    foreach($groupWithAccess in $groupsWithAccess){
        $members = Get-ADGroupMember -Identity $groupWithAccess.samAccountName | Where-Object {($_.objectClass -eq "user")}
    
        <# Uncomment if you wish to add one layer of nested groups
        $nestedGroups = Get-ADGroupMember -Identity $groupWithAccess.samAccountName | Where-Object {($_.objectClass -eq "group")}
        foreach($nestedGroup in $nestedGroups){
            $members = Get-ADGroupMember -Identity $groupWithAccess.samAccountName | Where-Object {($_.objectClass -eq "user")}
                $memberObject += New-Object psobject -Property @{
                fileshare = $accessRights.Path.Split("\")[-1]
                group = $groupWithAccess.name
                members = $members.name -join ";"
            }
        }
        #>

        $memberObject += New-Object psobject -Property @{
            fileshare = $accessRights.Path.Split("\")[-1]
            group = $groupWithAccess.name
            members = $members.name -join ";"
        }
    }
}
$memberObject | Export-CSV -Path "C:\Temp\test.csv" -Delimiter "," -NoTypeInformation

以上将遍历文件夹,获取文件夹的访问权限,将 ou 中的组与访问权限匹配,查询成员,查询嵌套组的成员(注释掉),然后创建一个对象并将其输出到 csv在 C:\Temp\test.csv 中。

您还可以通过删除 Get-Childitem 并在文件夹中丢失 foreach 循环来将其用于单个文件夹。

$ou = "OU=example2,OU=example1,OU=Groups,DC=domain1,DC=domain2,DC=example,DC=uk"
$groups = Get-ADGroup -Filter * -SearchBase $ou
$fileshare = "\\server\fileshare1"
$accessRights =  Get-Acl -Path $fileshare
$groupsWithAccess = @()
foreach($group in $accessRights.Access){
    $groupName = $group.identityReference.value.split("\")[-1]
    $getGroup = $groups | Where-Object {($_.samAccountName -eq $groupName -or $_.name -eq $groupName)}
    if($getGroup){
        $groupsWithAccess += $getGroup
    }
}
$memberObject = @()
foreach($groupWithAccess in $groupsWithAccess){
    $members = Get-ADGroupMember -Identity $groupWithAccess.samAccountName | Where-Object {($_.objectClass -eq "user")}
    
    <# Uncomment if you wish to add one layer of nested groups
    $nestedGroups = Get-ADGroupMember -Identity $groupWithAccess.samAccountName | Where-Object {($_.objectClass -eq "group")}
    foreach($nestedGroup in $nestedGroups){
        $members = Get-ADGroupMember -Identity $groupWithAccess.samAccountName | Where-Object {($_.objectClass -eq "user")}
            $memberObject += New-Object psobject -Property @{
            fileshare = $accessRights.Path.Split("\")[-1]
            group = $groupWithAccess.name
            members = $members.name -join ";"
        }
    }
    #>

    $memberObject += New-Object psobject -Property @{
        fileshare = $accessRights.Path.Split("\")[-1]
        group = $groupWithAccess.name
        members = $members.name -join ";"
    }
}
$memberObject | Export-CSV -Path "C:\Temp\test.csv" -Delimiter "," -NoTypeInformation

请,由于您没有显示任何您自己尝试过的代码,请务必阅读此代码并尝试完全理解正在发生的事情。然后根据您的需要进行调整,最后尝试进行测试。祝你好运!


推荐阅读