Есть ли способ проверить членство компьютера в группе AD?

Я пытаюсь проверить членство в группе компьютеров через Powershell. Я хочу иметь возможность указать определенное имя компьютера и найти, в каких группах находится этот компьютер, но из сценария Powershell. Я планирую запустить сценарий на компьютере, получить имя хоста, а затем распечатать, в каких группах AD находится этот компьютер. Есть ли простой способ сделать это?

РЕДАКТИРОВАТЬ: Таким образом, план состоит в том, чтобы компьютер проверил, в какие группы он входит, а затем назначил принтер в зависимости от того, в какой группе он находится. У нас есть много принтеров, которые используют только 3-4 человека, но из-за рассредоточенности. пользователей не могут уменьшить количество принтеров. Я просматривал групповую политику, но не хотел создавать 20 разных объектов групповой политики. Я хотел сделать это с помощью сценария входа/запуска. Я не уверен, что это выполнимо или осуществимо.

Редактировать № 2: Это редактирование действительно опоздало на вечеринку, но я подумал, что если кто-нибудь найдет это, это может помочь. Мы закончили тем, что использовали таргетинг на уровне элемента для объектов «Пользователь»> «Настройки»> «Панель управления»> «Принтеры». Мы сделали учетную запись в AD для каждой группы пользователей, которым нужен доступ к принтерам. Это сработало, хотя и создало длительный процесс входа в систему для первого входа в систему. Мы также включили ограничения Point-to-Print, чтобы драйверы загружались с серверов незаметно.


person Ian    schedule 20.06.2012    source источник
comment
Каково ваше окружение? У вас есть сервер 2008R2, на котором вы можете его запустить? У вас установлены командлеты Quest AD? Есть ли конкретная причина, по которой вы хотите запустить его на локальном компьютере, а не просто запрашивать AD с одного компьютера?   -  person EBGreen    schedule 20.06.2012
comment
Это Server 2008 R2, и идея заключалась в том, чтобы увидеть, в какой группе находится компьютер, а затем назначить принтер на основе этой группы.   -  person Ian    schedule 20.06.2012
comment
@user1470158 user1470158 Я предлагаю использовать собственный gpo для выполнения этой работы: technet.microsoft.com /en-us/windowsserver/bb310732.aspx   -  person CB.    schedule 20.06.2012
comment
Если вы назначаете принтеры на основе членства в группе, я ожидаю, что GPO также будет лучшим решением.   -  person EBGreen    schedule 20.06.2012
comment
Я также думал о групповой политике, но у нас есть около двадцати различных групп для принтеров, и я не думал, что наличие двадцати объектов групповой политики только для принтеров будет стоить того. Другая загвоздка заключается в том, что в каждой группе около трех пользователей, поэтому эти объекты не будут влиять на многих людей. Я новичок во всем производственном пространстве для AD и GPO и не знаком с лучшими практиками.   -  person Ian    schedule 20.06.2012


Ответы (6)


Это даст вам членство в группе (имена групп) локального компьютера (требуется powershell 2.0):

([adsisearcher]"(&(objectCategory=computer)(cn=$env:COMPUTERNAME))").FindOne().Properties.memberof -replace '^CN=([^,]+).+$','$1'
person Shay Levy    schedule 20.06.2012
comment
Я попробовал это на клиенте, и он ничего не вернул. Я попытался добавить это к переменной и повторить переменную, но она все равно ничего не вернула. Я не уверен, что мне не хватает. - person Ian; 21.06.2012
comment
Что произойдет, если вы удалите все после метода findone(), любой вывод? - person Shay Levy; 21.06.2012
comment
По-прежнему ничего, хотя я обнаружил, что с помощью «Get-ADComputer TestClient -Properties * | Select-Object MemberOf приблизил меня к группам. Я чувствую, что должен переформулировать свой вопрос, чтобы описать, что я пытаюсь. - person Ian; 21.06.2012
comment
Вы можете использовать модуль AD, но для этого вам потребуется загрузить его на любом клиенте, это может замедлить время входа в систему. AdsSearcher изначально работает в версии 2, поэтому я предлагаю вам выяснить, почему он не работает, если вы собираетесь сделать это в сценарии входа в систему. - person Shay Levy; 21.06.2012
comment
Возможно, я нашел, почему это не работает. Для samaccountname требуется знак доллара в конце имени компьютера. Это сказало, что это работало для меня без этого. Попробуйте добавить экранированный знак доллара в конце имени компьютера: (samaccountname=$env:COMPUTERNAME`$) - person Shay Levy; 21.06.2012
comment
Обновил мой ответ, заменил samaccountname на cn, попробуйте. - person Shay Levy; 21.06.2012
comment
Это действительно сработало, большое спасибо. Знаете ли вы, есть ли способ включить это в сценарий, который назначает принтеры на основе групп? - person Ian; 21.06.2012
comment
Конечно, назначьте однострочник переменной $groups и проверьте, существует ли рассматриваемое имя группы: if($groups -contains 'groupname') { ...assign код принтера...} - person Shay Levy; 21.06.2012

Извините, если я немного опоздал на вечеринку по этому поводу, но мне также нужно было найти членство в группе компьютера. После долгих проб и ошибок это сработало для меня.

Get-ADComputer "mycomp" -Properties MemberOf | %{if ($_.MemberOf -like "*group name*") {Write-Host "found"} }

Я заметил, что если сравнение строк находится на отдельной строке, мне нужно сделать следующее

$g=Get-ADGroupMember -Identity "CN=myADgroup,OU=myOU,DC=corp,DC=com" -server corp.com
foreach($mbr in $g) {if($name.MemberOf -like "*mycomp*" -eq $true) {Write-Host "found"}}

Не уверен, но мне кажется, что тестирование компьютера может быть быстрее и проще, чем тестирование группы, в зависимости от количества участников.

person SaxDaddy    schedule 10.12.2012

метод gpresult кажется единственным точным способом, который я могу найти. Запрос AD не точен, поскольку компьютер мог быть добавлен в группы, но не перезагружен. Я уверен, что кто-то мог бы сократить это, но это сработало достаточно хорошо для того, что мне нужно было увидеть.

# Get all active domain servers
$staledate = (Get-Date).AddDays(-90)
$computers = Get-ADComputer -Filter {(OperatingSystem -Like "*Server*") -and (Enabled -eq $True) -and (LastLogonDate -ge $staledate) -and (Modified -ge $staledate) -and (PasswordLastSet -ge $staledate) -and (whenChanged -ge $staledate) -and (Name -notlike "PHXVSSA101A")} | Select name -expandproperty name
$computers = $computers | Where {(Resolve-DNSName $_.name -ea 0) -and (Test-Connection -ComputerName $_.Name -Count 1 -ea 0)} | Sort
# Loop through all active domain servers
Foreach ($computer in $computers)
{
# Pull the gpresult for the current server
$Lines = gpresult /s $computer /v /SCOPE COMPUTER
# Initialize arrays
$cgroups = @()
$dgroups = @()
# Out equals false by default
$Out = $False
# Define start and end lines for the section we want
$start = "The computer is a part of the following security groups"
$end = "Resultant Set Of Policies for Computer"
# Loop through the gpresult output looking for the computer security group section
ForEach ($Line In $Lines)
{
If ($Line -match $start) {$Out = $True}
If ($Out -eq $True) {$cgroups += $Line}
If ($Line -match $end) {Break}
}
# Loop through all the gathered groups and check for Active Directory groups
ForEach ($group in $cgroups)
{
Try {
$check = Get-ADgroup $group -ErrorAction Stop
If ($check) {
$dgroups += $group
}
}
Catch {}
}
# Output server name and any Active Directory groups it is in
$computer
$dgroups
# End of computers loop
}
person Mike Finney    schedule 28.08.2018

Вот запрос LDAP, чтобы определить, входит ли компьютер в группу рекурсивно:

(((objectClass=computer)(sAMAccountName=COMPUTERNAME$))(memberof:1.2.840.113556.1.4.1941:=DistinguishedNameOfGroup))

Дополнительная информация: http://justanotheritblog.co.uk/2016/01/27/recursively-check-if-a-usercomputer-is-a-member-of-an-ad-group-with-powershell-2-0/

person Michael    schedule 29.01.2016

попробуйте запустить gpresult /V и проверьте в разделе "ГРУППЫ безопасности"

Вы также можете попробовать gpresult /scope computer /v в командной строке (с правами администратора) для получения более конкретных результатов.

person Lansberry    schedule 03.08.2017

Попробуйте эту команду DOS, она вернет все локальные группы, к которым принадлежит этот компьютер:

net localgroup
person Prateek Jaiswal    schedule 27.08.2020