PowerShell和ActiveDirectory模块 - 查找不属于特定组的用户

7
在过去的一周中,我第一次接触了PowerShell和ActiveDirectory。我想找到一个非管理员或域管理员用户的列表。
到目前为止,我知道如何使用以下命令/语句获取所有ActiveDirectory用户的所有属性:
Get-ADUser -Filter * -Properties *

我希望能够打印出当前ActiveDirectory用户的用户名,但排除管理员或域管理员。

以下是我尝试实现的伪代码/Powershell代码:

$users = Get-ADUser -Filter * -Properties *
foreach($u in $users){
    if ($u isn't an administrator OR $u isn't a domain administrator){ 
        Write-Host "User Name:" $u.Name
    }
}

当我运行Get-ADUser -Filter * -Properties *命令时,我会看到每个用户的MemberOf属性——这可能是一个线索。我也从Google找到了各种来源提到的AdminCount(是否有叫做DomainAdminCount的东西?)。
尽管各种来源都说使用PowerShell扩展程序可以使操作更轻松,但我被要求不要使用ActiveDirectory的PowerShell扩展程序。
我已经花了大约2个小时测试各种语句的组合,但我的初学者PowerShell状态并没有太大帮助。我将非常感谢任何帮助,并需要一些明确的解释来帮助理解反馈。

我理解需要检查域管理员组的成员资格,但是我不知道你所说的“Admins”是什么意思 - 在AD中默认情况下不存在这样的组。 - BartekB
4个回答

5

这是一个相当简单的任务,您不需要先检索所有用户并循环:

$DomainsAdminsDn = (Get-ADGroup 'Domain Admins').DistinguishedName
Get-ADUser -Filter { -not (memberof -eq $DomainsAdminsDn) }
# OR
Get-ADUser -LDAPFilter "(!(memberof=$DomainsAdminsDn))"

你可以对任何其他组执行相同的操作。
编辑: 反转查询,以返回不在组中的帐户。顺便说一句,这行代码不起作用:
Get-ADUser -Filter { memberof -ne $DomainsAdminsDn }

它将跳过所有不属于默认组之外的任何其他组的帐户。

感谢BartekB的帮助 :) 我还对下面的代码进行了微调,它完全得到了我所希望的:

此变量获取所有域管理员的用户

$DomainsAdminsDn = (Get-ADGroup 'Domain Admins').DistinguishedName

此变量获取所有管理员的用户

$AdministratorsDn = (Get-ADGroup 'Administrators').DistinguishedName

这一行将获取所有不是“域管理员”或“管理员”的用户

Get-ADUser -Filter {(memberOf -ne $AdministratorsDn) -and (memberOf -ne $DomainsAdminsDn)}
- Rob
我该如何获取组CN=ROLE_AGENT,OU=PROFILES,OU=NSI PRODUCTION,DC=xxxxx,DC=net - Kiquenet
@Kiquenet,由于你已经有了DN,所以你可以移动到“Get-ADUser -LDAPFilter”部分,并将“$DomainsAdminsDn”替换为你的字符串。 - BartekB

1

我使用了大家提供的一些内容,并进行了调整。我需要找出不属于任何一个组的人,只需要他们的名字。如果这对你有帮助,请告诉我。

$Internet_Users = Get-ADGroup -Filter {Name -like "Internet_Users" }
Get-ADUser -Filter { -not (memberof -eq $Internet_Users) -and (enabled -eq "True" -and objectclass -eq "user")} |Select Name | Export-CSV "C:\Users\YOURNAME\Documents\Enabled_Users_Without_Internet_Users_Group.csv"  

0
原来,“域用户”是特殊处理的,因此如果您尝试查找不在该组中的人,则无法正常工作。
基于以下代码: http://powershell.org/wp/forums/topic/find-users-not-in-a-group/
Import-Module ActiveDirectory
$users = Get-ADUser -Filter {Enabled -eq $true} -Properties MemberOf, PrimaryGroup
$dugDn = (Get-ADGroup "Domain Users").DistinguishedName
foreach ($user in $users)
{
    Write-Verbose "Working on $($user.Name)"
    $groups = $user.MemberOf, $user.PrimaryGroup
    if ($groups -NotContains $dugDn)
    {
        Write-Host "$($user.SamAccountName) not in the domain users group"
    }
}

0

在BartekB的一些非常有用的反馈的帮助下,我能够实现以下解决方案:

## This variable gets all the users that are Domain Administrators
$DomainsAdminsDn = (Get-ADGroup 'Domain Admins').DistinguishedName

## This variable gets all the users that are Administrators
$AdministratorsDn = (Get-ADGroup 'Administrators').DistinguishedName

## This line will get all the users that are not "Domain Administrators" or "Administrators"
Get-ADUser -Filter {(memberOf -ne $AdministratorsDn) -and (memberOf -ne $DomainsAdminsDn)}

对于最后一行,我想要结合这两个变量,使过滤更加具体(即查找不是管理员或域管理员的用户)。我花了大约10分钟挖掘PowerShell等效的&&运算符 - 这正如我所预料的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接