【问题标题】:Get-ADGroupMember processing for non domain members非域成员的 Get-ADGroupMember 处理
【发布时间】:2020-09-18 18:44:25
【问题描述】:

我们有一个我们管理的受信任域,并且用户可以通过添加到控制权限的本地域组的受信任域上的组访问我们域上的文件服务器,例如

对于路径“\server\folder\folder”,权限可能如下所示

MyDomain\FolderXReadWrite

然后该组内,来自受信任域的组将被包括

TrustedDomain\FolderXReadWrite

我想编写一个脚本来“逆向工程”这个,这样我就可以从给定的文件夹路径中获取可以访问的本地和受信任的域组并列出它们 - 我有以下内容:

$path = '\\server\path\path'

$Permissions = (Get-Item -Path $path -ErrorAction Stop | Get-Acl -ErrorAction Stop).Access | Where-Object { $_.IdentityReference -like "MyDomain\*" } | ForEach-Object {
    $TrustedDomGroup = Get-ADGroupMember ($_.IdentityReference.Value -split '\\')[1] -Verbose | Where-Object { ($_.DistinguishedName -split 'DC=', 2)[-1] -like "*TrustedDomain*" -and ($_.objectClass -eq 'group') }
        If ($TrustedDomGroup) {
            [pscustomobject]@{Name=("TrustedDomain\" + $TrustedDomGroup.SamAccountName);Rights=("Member of " + $_.IdentityReference);Domain='PHS'}
        }
        [pscustomobject]@{Name=$_.IdentityReference;Rights=$_.FileSystemRights;Domain='NSS'}
    }

$Permissions | Sort-Object Name -Unique

这会产生我需要的输出,但是,上面示例中的域组有很多用户,因此处理“Get-ADGroupMember”需要很长时间。有人对更快的方法有建议吗?

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:

    您可以尝试使用以下命令检索所有组成员:

    (Get-ADGroup $ADGroup -Properties members).members
    

    我不知道在您的环境中它是否比 Get-AdGroupMember 更快。 通过 Measure-Command 进行的测量可能会为您提供更多信息:

    Measure-Command, Microsoft Docs

    【讨论】:

    • 我不认为它会 - 为受信任域成员返回的 CN 是外国安全负责人:...所以我也必须查找它们
    【解决方案2】:

    好的,所以提高查找速度的最佳方法似乎是使用 LDAP,所以我整理了一个小函数来从本地 AD 组中获取 Foreign Security Principal 组名称:

    Function List-FSPGroupMembers {
    # Use LDAP search to find and resolve Foreign Security Principals from an AD group - faster than native cmdlet
        [CmdletBinding()]
        Param(
            [Parameter(Mandatory=$true,Position=1)][string]$GroupName="",
            [Parameter(Mandatory=$true,Position=2)][string]$Domain
        )
        [regex]$SIDmatch = "S-\d-(?:\d+-){1,14}\d+"
        Function fGetADGroupObjectFromName([System.String]$sGroupName,[System.String]$sLDAPSearchRoot) {
            $oADRoot = New-Object System.DirectoryServices.DirectoryEntry($sLDAPSearchRoot)
            $sSearchStr ="(&(objectCategory=group)(name="+$sGroupName+"))"
            $oSearch=New-Object directoryservices.DirectorySearcher($oADRoot,$sSearchStr)
            $oFindResult=$oSearch.FindAll()
            If($oFindResult.Count -eq 1) {
                Return($oFindResult)
            }
            Else{
                Return($false)
            }
        }
        $sSearchRoot="LDAP://" + $Domain + ":3268"
        If($oSearchResult=fGetADGroupObjectFromName $groupname $sSearchRoot) {
            $oGroup=New-Object System.DirectoryServices.DirectoryEntry($oSearchResult.Path)
            $oGroup.Member | Where-Object {($_.ToString()) -match $SIDmatch } | ForEach-Object {   
                $SID = (Select-String -Pattern $SIDmatch -InputObject $_.ToString()).Matches.Value
                Try { 
                    (New-Object System.Security.Principal.SecurityIdentifier($SID)).Translate([System.Security.Principal.NTAccount]).Value
                }
                Catch {
                    $_
                }
            }
        }
        Else {
            Write-Warning ("Group "+$groupname+" not found at "+$domain)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 2015-02-15
      • 1970-01-01
      • 2022-01-23
      • 2018-09-26
      相关资源
      最近更新 更多