2

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

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

编辑#2:这个编辑真的晚了,但我想如果有人发现它会有所帮助。我们最终在用户>首选项>控制面板>打印机对象上使用了项目级目标。我们在 AD 中为需要访问打印机的每组用户创建了一个帐户。尽管它确实为计算机的第一次登录创建了一个漫长的登录过程,但它仍然有效。我们还启用了 Point-to-Print 限制,以便从服务器安静地加载驱动程序。

4

7 回答 7

10

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

([adsisearcher]"(&(objectCategory=computer)(cn=$env:COMPUTERNAME))").FindOne().Properties.memberof -replace '^CN=([^,]+).+$','$1'
于 2012-06-20T20:42:05.143 回答
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"}}

不确定,但我想根据成员的数量,测试计算机可能比测试组更快、更容易。

于 2012-12-10T06:49:28.333 回答
2

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
}
于 2018-08-28T23:58:02.263 回答
1

尝试运行 gpresult /V 并在“安全组”下检查

您还可以gpresult /scope computer /v在命令提示符下尝试(提升为管理员)以获得更具体的结果

于 2017-08-03T15:17:35.657 回答
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 /

于 2016-01-29T09:36:31.910 回答
0

要检查计算机自己的组成员视图,您可以运行:

(New-Object System.Security.Principal.WindowsPrincipal("$env:computername$")).IsInRole('Example Group')
True

在重新启动计算机之前,将计算机退出Example Group不会影响上述输出。

于 2022-01-09T15:25:19.173 回答
-1

试试这个 DOS 命令,这将返回这台计算机所属的所有本地组:

net localgroup
于 2020-08-27T14:02:28.710 回答