Проверьте текущее членство в группе пользователей

#powershell #active-directory

Вопрос:

Я хочу проверить текущее членство в группе пользователей и запустить сценарий на основе этого. Этот сценарий запускается. Однако для его запуска требуются средства RSAT Active Directory.

Я хотел бы запустить этот скрипт в качестве объекта групповой политики. У кого-нибудь есть какие-нибудь идеи?

Заранее спасибо.

 ###########################################################################################
# Check AD group Membership
###########################################################################################

$user = "$env:UserName"
$groups = 'FM-TMASQLUserAccess'

foreach ($group in $groups) {
    $members = Get-ADGroupMember -server **servernamehere** -Identity $group - 
    Recursive | Select -ExpandProperty SamAccountName

    If ($members -contains $user) {
        Write-Output "$user is a member of $group"
    }
    Else {
        Write-Output  "$user is not a member of $group"
    }
}
 

Ответ №1:

В частности, для текущего пользователя, вошедшего в систему, вам не нужно явно запрашивать AD — маркер безопасности пользователей уже содержит все членства в группах, разрешенные при входе в систему, поэтому вы можете сделать:

 $groupName = 'FM-TMASQLUserAccess'

# Fetch identity information about current user
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent()

# Grab group SIDs from the users token
$groupTokenSIDs = $currentUser.Groups

# Translate the SID references to account/group names
$Groups = $groupTokenSIDs |Where-Object { $_.AccountDomainSid } |ForEach-Object { $_.Translate([System.Security.Principal.NTAccount]) }

# Test if list contains target group
if($Groups |Where-Object { $_.Value -like "*$groupName" }){
  "$env:USERNAME is a member of $groupName"
}
 

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

1. Возвращает ли это только доменные группы? Как я могу найти местные группы?

2. @lit Он возвращает как локальные группы, так и группы доменов, а также глобальные идентификаторы/метки — все, что уже содержится в маркере доступа пользователей. Имена переменных немного вводили в заблуждение, я обновил код.

3. Когда я запускаю это, $Groups переменная содержит только имена с префиксом домена AD; EAST . Нет никакой Administrators Users группы или.

4. IMO в этом коде должно быть указано $_.Value в Where-Object фильтре, который переводит идентификаторы безопасности (а не $_.AccountDomainSid ).

5. @Bill_Stewart Это намеренно. OP интересуется не встроенной группой объявлений , я отфильтровываю WKSID (например BUILTINUsers )-в попытке сузить список без необходимости разрешения фактического идентификатора домена 🙂