Public/Get-ADEntryGroups.ps1
function Get-ADEntryGroups { <# .SYNOPSIS Возвращает список групп для указанного Distinguished Name .DESCRIPTION Возвращает список всех групп, членом которых является объект с указанным Distinguished Name .EXAMPLE PS C:\> Get-ADEntryGroups -DistinguishedName 'CN=Владимир Ильичев,OU=Отдел эксплуатации информационных систем,OU=Staffing Establishment,OU=.Users,DC=corp,DC=atmd,DC=ru' Функция возвращает объект SearchResultCollection, сожержащий группы. .INPUTS Distinguished Name объекта Active Directory .OUTPUTS SearchResultCollection с перечнем групп. .NOTES Функция использует фильтр (member:1.2.840.113556.1.4.1941:=$DistinguishedName) и добавляет к этому списку Primary Group. Почему надо добавлять основную группу отдельно - можно почитать тут: https://sergeyvasin.net/2017/09/18/primary-group/ #> [CmdletBinding()] param ( [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)] [System.String] $DistinguishedName ) begin { Write-Warning -Message 'The function <Get-ADEntryGroups> is deprecated. Use the module <ArielAD> instead.' try { if ($IsLinux) { throw [System.Configuration.ConfigurationException]::New('This operation system does not supported.') } $DistinguishedName = $DistinguishedName.ToLower() $Domain = $DistinguishedName.Substring($DistinguishedName.IndexOf("dc=")) # Как можно догодаться, Dn - это DN. Если нет - ошибка. if ($DistinguishedName -Match '^(?:(?<cn>CN=(?<name>(?:[^,]|\,)*)),)?(?:(?<path>(?:(?:CN|OU)=(?:[^,]|\,)+,?)+),)?(?<domain>(?:DC=(?:[^,]|\,)+,?)+)$') { $vDomainDirectoryEntry = New-Object System.DirectoryServices.DirectoryEntry($("LDAP://$Domain")) $vDirectorySearcher = New-Object System.DirectoryServices.DirectorySearcher($vDomainDirectoryEntry) } # Иначе - ошибка else { throw "Не удается привести значение <$Domain> к виду DN." } } catch { #$PSCmdlet.ThrowTerminatingError($PSItem) Write-Error -Exception $PSItem.Exeception } } process { try { if ($IsLinux) { throw [System.Configuration.ConfigurationException]::New('This operation system does not supported.') } # Старый "трюк" по поиску всех групп. Вернее, всех, кроме Primary Group. $vDirectorySearcher.Filter = "(member:1.2.840.113556.1.4.1941:=$DistinguishedName)" $Result = $vDirectorySearcher.FindAll() # Теперь необходимо получить Primary Group. Для этого нам нужен SID "домена" Primary Group ID. # Вот это SID домена. $vDomainSID = ConvertTo-SID -ByteArray $vDomainDirectoryEntry.Properties.objectsid # Для Primary Group ID нужен сам объект, у которого мы посмтрим Properties.primarygroupid $vDirectorySearcher.Filter = "(distinguishedName=$DistinguishedName)" $vCurrentADObject = $vDirectorySearcher.FindOne() # Имея SID и Primary Group ID можем получить и группу. $vDirectorySearcher.Filter = "(objectSID=$($vDomainSID + '-' + $vCurrentADObject.Properties.primarygroupid))" $vPrimaryGroup = $vDirectorySearcher.FindAll() # Добавляем найденную группу к списку. $Result += $vPrimaryGroup } catch { #$PSCmdlet.ThrowTerminatingError($PSItem) Write-Error -Exception $PSItem.Exeception } } end { return $Result } } |