有没有办法检查计算机的AD组成员身份?

时间:2012-06-20 18:40:37

标签: windows powershell active-directory active-directory-group

我正在尝试通过Powershell检查计算机组成员身份。我希望能够指定某个计算机名称,并从Powershell脚本中查找该计算机所在的组。我打算在计算机上运行脚本,获取主机名,然后打印出计算机所在的AD组。有没有一种简单的方法可以做到这一点?

编辑: 所以这里的计划是让计算机检查以查看它所在的组,然后根据它所在的组分配打印机。我们有许多只有3到4人使用的打印机,但由于其分散性质用户无法缩小打印机的数量。我在考虑组策略,但不想创建20个不同的GPO。我想用登录/启动脚本来做这件事。我不确定这是可行的还是可行的。

编辑#2: 这个编辑对派对来说真的很晚,但我想如果有人发现这可能会有所帮助。我们最终在User> Preferences> Control Panel> Printers对象上使用了项目级别定位。我们在AD中为需要访问打印机的每组用户创建了一个帐户。虽然它确实为计算机的第一次登录创建了一个长登录过程,但仍然有效。我们还启用了“点对点打印”限制,因此可以安静地从服务器加载驱动程序。

6 个答案:

答案 0 :(得分:8)

这将为您提供本地计算机的组成员身份(组名称)(需要powershell 2.0):

([adsisearcher]"(&(objectCategory=computer)(cn=$env:COMPUTERNAME))").FindOne().Properties.memberof -replace '^CN=([^,]+).+$','$1'

答案 1 :(得分:2)

道歉,如果我在这方面有点迟到,但我也需要找到一个计算机的小组成员资格。经过大量的反复试验,这对我有用。

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"}}

不确定但我认为测试计算机可能比测试组更快更容易,具体取决于成员数量。

答案 2 :(得分:1)

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
}

答案 3 :(得分:0)

下面是一个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/

答案 4 :(得分:0)

尝试运行gpresult / V并在“security GROUPS”下查看

答案 5 :(得分:0)

尝试使用此DOS命令,它将返回此计算机所属的所有本地组:

net localgroup