Сценарий входа в Powershell GPO, проверяющий членство в группе ресурсов AD - PullRequest
0 голосов
/ 26 марта 2019

Система, с которой мне приходится работать, использует членство в группе ресурсов AD для управления большинством разрешений для пользователей и компьютеров. Меня попросили улучшить текущий сценарий входа в систему, поскольку в настоящее время он содержит некоторые вызовы VB ADSISEARCHER. Я начал пытаться делать это исключительно в PowerShell, но преодолел ряд препятствий.

  • На целевых машинах не установлен модуль Active Directory
  • Пользователи, входящие в систему, имеют ограниченные учетные записи
  • Группы ресурсов являются вложенными, поэтому сценарий должен обрабатывать это

Я попробовал пару подходов, во-первых, чистый метод Powershell Cmdlet Get-ADGroup или Get-ADPricipalGroupMembership, но для этих командлетов требуется модуль Active Directory. Затем я попробовал .net подход с System.DirectoryServices.DirectoryEntry, хотя это шаг от чистого решения PowerShell, по крайней мере, он не такой старый, как маршрут VB. Однако, когда я пытаюсь построить объект, ему также не хватает пространства имен.

Первая попытка:

function Get-UserResourceMembership
{
    [CmdletBinding()]
    Param
    (
        # Username or Groupname to Discover Group Membership
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        $User
    )

    Begin
    {
        $Groups = @(Get-ADPrincipalGroupMembership $User)
    }
    Process
    {
        foreach($ADGroup in $Groups)
            {
                if($ADGroup.ObjectClass -eq "Group")
                {
                    Get-UserResourceMembership $ADGroup
                }

                $GrpMembership = @($ADGroup)
            }
    }
    End
    {
     return ,$GrpMembership
    }
}

Вторая попытка:

# $rootGroup is passed in from earlier in the script

$groupname = $rootGroup.'Group Name'
$filter = ("(&(objectCategory=Group)(name=$($groupname)))")
$searcher.Filter = $filter
$searcher.SearchScope = "Subtree"

$searchResults = $searcher.FindAll().GetDirectoryEntry().memberOf |
% { (New-Object System.DirectoryServices.DirectoryEntry("LDAP://"+$_)) } |
Sort-Object Children | select @{name="Group Name";expression={$_.Name}}

foreach($resource in $searchResults)
    {
        if($resource.'Group Name' -match "<Groupname>")
        {
            $printResource += $resource
        }
    }

Есть ли у кого-нибудь в сообществе какие-либо предложения, как извлечь членство в группе [вложенный] из Active Directory из сценария входа стандартного пользователя ??? Любая идея высоко ценится ...

PS Я не могу изменить способ проектирования системы (выше моего уровня оплаты).

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Что касается ...

• На целевых машинах не установлен модуль Active Directory

• Пользователи, входящие в систему, имеют ограниченные учетные записи

• Группы ресурсов являются вложенными, поэтому сценарий должен обрабатывать это

  • Не имеет значения, их не нужно устанавливать на клиент для использования их. Вы можете использовать PSRemoting для прокси тех, кто использует 'Implicit Remoting. Командлеты доступны только в удаленном сеансе.
  • Не имеет значения, так как каждый пользователь имеет доступ для чтения, по умолчанию к ADDS в Windows.
  • Вы можете добраться до тех, кто использует командлеты, которые вы используете, и Есть даже готовые сценарии в Microsoft PowershellGallery.com и для этого.

Что касается…

Я попробовал несколько подходов, во-первых, чистый командлет Powershell. метод Get-ADGroup или Get-ADPricipalGroupMembership, но они Для командлета требуется модуль Active Directory.

Как отмечено выше, это можно решить, как описано ниже:

PowerShell неявное удаленное взаимодействие: никогда не устанавливайте модуль снова

Удаленный сеанс

# create a session then import a module via the session, for example:
$adsess = New-PSSession -ComputerName savdaldc01
Import-Module -Name ActiveDirectory -PSSession $adsess
Get-Module
Get-ADUser -Filter *
Remove-Module ActiveDirectory

# It's also possible to prefix modules loaded from remote servers to differentiate from local modules, e.g.

Import-Module -Name ActiveDirectory -PSSession $adsess -Prefix OnDC
Get-OnDCADUser -Filter * #I don't have regular Get-ADUser anymore
Remove-Module ActiveDirectory
Remove-PSSession $adsess 

Что касается ...

Есть ли у кого-нибудь в сообществе какие-либо предложения, как вытащить группу? членство [вложено]

Получить членство во вложенной группе - функция

Эта функция будет рекурсивно перечислять членов данной группы наряду с уровнем вложенности и информацией о родительской группе. Если есть круговое членство, оно будет отображаться в колонке комментариев. вход от конвейера и хорошо работает с get-adgroup. Скачать: Get-ADNestedGroupMembers.ps1

Так же, как просто делаю это ...

Мы можем получить членов группы, используя PowerShell PowerShell командлет Get-ADGroupMember. Командлет Get-ADGroupMember предоставляет возможность получить все вложенные члены группы, передав параметр -Recursive. Этот сценарий powershell также обрабатывает проблему циклического членства (бесконечный цикл).

Function Get-ADNestedGroupMembers 
{
  [cmdletbinding()]

  param 
  ( 
      [String] $Group 
  )            
  Import-Module ActiveDirectory
  ($Members = Get-ADGroupMember -Identity $Group -Recursive)
}

Get-ADNestedGroupMembers "Domain Admins" | Select Name,DistinguishedName

или так.

function Get-NestedGroupMember
{
    param
    (
        [Parameter(Mandatory, ValueFromPipeline)]
        [string]$Identity
    )

    process
    {
        Import-Module ActiveDirectory
        $user = Get-ADUser -Identity $Identity
        $userdn = $user.DistinguishedName
        $strFilter = "(member:1.2.840.113556.1.4.1941:=$userdn)"
        Get-ADGroup -LDAPFilter $strFilter -ResultPageSize 1000
    }
}
0 голосов
/ 26 марта 2019

Все перечисленные ниже методы перечисляют все группы, включая вложенные группы.

В приведенном ниже примере команда gpresult будет выполняться в контексте пользователя.gpresult выводит в файл XML в локальном профиле пользователя, к которому он уже должен иметь полный доступ.Затем XML-файл читается и проходит через каждый узел, пока не дойдет до узла, содержащего группы.Список групп содержит локальные и доменные группы и выводится непосредственно на консоль.Это может быть легко сохранено в переменной или выведено в файл.Если вам нужны только доменные группы, это можно легко отфильтровать отсюда с помощью регулярного выражения.Требуется, чтобы на клиентских компьютерах работала хотя бы Windows Vista SP1 или более поздняя версия.

gpresult /USER "$env:userdomain\$env:username" /X "$env:userprofile\rsop.xml"
$xml = [xml](Get-Content "$env:userprofile\rsop.xml")
$xml.Rsop.UserResults.SecurityGroup.Name."#text" # Displays the groups
Remove-Item "$env:userprofile\rsop.xml" # Removes the XML file

Вы также можете использовать Regex, чтобы найти список групп:

$out = gpresult /R /USER $env:username
$GroupsUnfiltered = (($out | out-string) -split "-{10,}")[-1]
$Groups = ($GroupsUnfiltered.trim() -replace "(?m)^\s+","") -split "(?m)\r?\n"
$Groups

Следующее также может работать, если список вашей группы всегда начинается с предсказуемой группы, такой как Domain Users в этом примере:

$out = gpresult /R /USER $env:username
$GroupList = $out.where({$_ -match "domain users"},'SkipUntil').trim()
$GroupList

Этот код предполагает, что пользователи и машины присоединены к одному домену или, по крайней мере, присоединены кдоверенные домены.Во втором фрагменте кода предполагается, что каждый пользователь входит в группу «Пользователи домена», а машины изначально являются PowerShell v4 или более поздней версии.

...