Обработка Get-ADGroupMember для не членов домена

#powershell #active-directory

#powershell #active-directory

Вопрос:

У нас есть доверенный домен, который мы администрируем, и пользователям предоставляется доступ к файловому серверу в нашем домене через группы в доверенном домене, добавленные в группу локального домена, которая управляет разрешениями, например

Для пути » server folder папка» разрешения могут выглядеть следующим образом

 MyDomainFolderXReadWrite
  

Затем в эту группу будет включена группа из доверенного домена

 TrustedDomainFolderXReadWrite
  

Я хотел бы написать сценарий для «обратного проектирования» этого, чтобы я мог получить как локальные, так и доверенные доменные группы, которые имеют доступ из заданного пути к папке, и перечислить их — у меня есть следующее:

 $path = '\serverpathpath'

$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» занимает много времени. У кого-нибудь есть предложения по более быстрому методу?

Ответ №1:

вы можете попытаться получить всех членов группы с помощью этой команды:

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

Я не знаю, быстрее ли это в вашей среде, чем Get-ADGroupMember.
Измерение с помощью Measure-Command может дать вам дополнительную информацию:

Команда измерения, Документы Microsoft

Комментарии:

1. Я не думаю, что это будет — CN, возвращаемые для членов доверенного домена, являются внешними участниками безопасности: … поэтому мне тоже пришлось бы их искать

Ответ №2:

Хорошо, итак, лучшим методом повышения скорости поиска, по-видимому, является использование LDAP, поэтому я собрал небольшую функцию для получения имен внешних участников безопасности из локальной группы AD:

 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 ="(amp;(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)
    }
}