【问题标题】:Find users that are not members of a specific GG group?查找不是特定 GG 组成员的用户?
【发布时间】:2019-06-03 11:35:31
【问题描述】:

我使用脚本导出活动目录中具有确定 GG 组的用户,但我想做相反的事情,我的意思是我想导出不是该组成员的用户。我附上了我现在做的部分代码:

$Group = 'GG_LCS_UsersType4'
$Users = Get-ADGroupMember $Group -Recursive -Server $Domain |
         Get-ADUser |
         select SamAccountName, Enabled |
         Export-Csv Temp.csv -NoTypeInformation -Encoding UTF8
Import-Csv Temp.csv |
    Select-Object *, @{Name='Group';Expression={"$Group"}},
        @{Name='Domain';Expression={"$Domain"}} |
    Export-Csv "${Domain}_LicenseControlReport.csv" -NoTypeInformation -Encoding UTF8 -Append

所以现在我想要不是“GG_LCS_UsersType4”、“GG_LCS_UsersType3”、“GG_LCS_UsersType2”、“GG_LCS_UsersType1”成员的用户

【问题讨论】:

  • 我对 AD 工作原理的理解是,每个用户的 .MemberOf 属性将拥有每个用户所属的组。如果这是准确的,那么您可以获取用户列表并过滤掉不需要的组成员资格。 ///// 看起来您无论如何都需要获取 整个 用户列表,因此您最好使用.MemberOf 属性,而不是反过来。
  • 请更新您的问题以删除俚语和缩写。那么您是否只想遍历 AD 中的所有用户并找到不是 GG_LCS_UsersType4" 成员的用户?
  • 对不起我的英语。我想导出不在这些组中的成员:GG_LCS_UsersType4'、'GG_LCS_UsersType3'、'GG_LCS_UsersType2'、'GG_LCS_UsersType1
  • 您可以从该组中获取所有成员并将其与所有用户进行比较。如果 user -notin list -> 找到了一个用户。

标签: powershell active-directory-group


【解决方案1】:

根据您希望代码的动态程度,有多种方法可以解决此问题。

场景 1(用户不在一个组中):

$group = 'GG_LCS_UsersType4'
$groupDN = (Get-ADGroup $group).DistinguishedName
$users = (Get-ADUser -filter {objectclass -eq "user"} -properties memberof).where{$_.memberof -notcontains $groupDN}
$users | Select-Object SamAccountName,Enabled |
    Export-Csv Temp.csv -NoTypeInformation -Encoding UTF8

场景 2(不属于多个组的用户):

$groups = 'GG_LCS_UsersType4', 'GG_LCS_UsersType3', 'GG_LCS_UsersType2', 'GG_LCS_UsersType1'
$whereFilter = $groups | Foreach-Object { 
    $g = (Get-ADGroup $_).DistinguishedName
    "{0} '{1}'" -f '$_.memberOf -notcontains',$g 
}
$whereFilter = [scriptblock]::Create($whereFilter -join " -and ")
$users = (Get-ADUser -filter {objectclass -eq "user"} -properties memberof).where($whereFilter)
$users | Select-Object SamAccountName,Enabled |
    Export-Csv Temp.csv -NoTypeInformation -Encoding UTF8

场景 1 查询组的专有名称并存储结果为$groupDNGet-ADUser 用于查询所有 AD 用户,然后过滤结果以输出在 .MemberOf 属性中不具有组专有名称的用户。 .where() 方法与-notcontains 运算符一起用于查询后过滤。

场景 2 循环遍历多个组并创建一个字符串数组,稍后将在 .where() 方法中使用。字符串是使用格式运算符 (-f) 创建的,即使在这种情况下串联看起来更漂亮。每个数组条目只包含$_.memberOf -notcontains <Group Distinguished Name>。这些条目由-and 运算符连接,然后转换为由$whereFilter 表示的ScriptBlock。由于.where() 方法接受一个ScriptBlock 类型作为参数,我们可以简单地传递$whereFilter

$Users 包含从查询返回的用户对象。我已经选择了您在问题中提供的属性,但这可以很容易地调整为您想要的任何属性。

老实说,查询所有 AD 用户可能更容易。然后从所有 AD 用户查询中进行特定过滤。除了 ActiveDirectory 模块中缺乏强大的命令之外,搜索并不简单的主要原因是您正在搜索数组中的值数组。检查数组中的单个值要简单得多,并且 PowerShell 可以在大多数 Collection 对象类型中本机处理这些类型的查询。

【讨论】:

    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多