#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 может дать вам дополнительную информацию:
Комментарии:
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)
}
}