#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
)-в попытке сузить список без необходимости разрешения фактического идентификатора домена 🙂