查找不是特定 GG 组成员的用户?
Find users that are not members of a specific GG group?
我使用脚本导出活动目录中具有确定 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'
成员的用户
根据您希望代码的动态程度,有多种方法可以解决这个问题。
场景 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 查询组的可分辨名称并存储结果 $groupDN
。 Get-ADUser
用于查询所有AD用户,然后将结果过滤为输出.MemberOf
属性中没有group Distinguished Name的用户。 .where()
方法与 -notcontains
运算符一起用于 post-query 过滤。
场景 2 循环遍历多个组并创建一个字符串数组,稍后将在 .where()
方法中使用。字符串是使用格式运算符 (-f
) 创建的,尽管在这种情况下串联看起来更漂亮。每个数组条目仅包含 $_.memberOf -notcontains <Group Distinguished Name>
。这些条目由 -and
运算符连接,然后转换为 ScriptBlock,由 $whereFilter
表示。由于 .where()
方法接受 ScriptBlock 类型作为参数,我们可以简单地传递 $whereFilter
.
$Users
包含从查询返回的用户对象。我已经选择了您在问题中提供的属性,但是可以很容易地针对您想要的任何属性进行调整。
老实说,查询所有 AD 用户可能更容易。然后从所有 AD 用户查询中进行特定过滤。除了 ActiveDirectory 模块中缺少健壮的命令之外,搜索并不简单的主要原因是您要在数组中搜索值数组。检查数组中的单个值要简单得多,PowerShell 可以本机处理大多数 Collection 对象类型中的这些类型的查询。
我使用脚本导出活动目录中具有确定 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'
成员的用户根据您希望代码的动态程度,有多种方法可以解决这个问题。
场景 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 查询组的可分辨名称并存储结果 $groupDN
。 Get-ADUser
用于查询所有AD用户,然后将结果过滤为输出.MemberOf
属性中没有group Distinguished Name的用户。 .where()
方法与 -notcontains
运算符一起用于 post-query 过滤。
场景 2 循环遍历多个组并创建一个字符串数组,稍后将在 .where()
方法中使用。字符串是使用格式运算符 (-f
) 创建的,尽管在这种情况下串联看起来更漂亮。每个数组条目仅包含 $_.memberOf -notcontains <Group Distinguished Name>
。这些条目由 -and
运算符连接,然后转换为 ScriptBlock,由 $whereFilter
表示。由于 .where()
方法接受 ScriptBlock 类型作为参数,我们可以简单地传递 $whereFilter
.
$Users
包含从查询返回的用户对象。我已经选择了您在问题中提供的属性,但是可以很容易地针对您想要的任何属性进行调整。
老实说,查询所有 AD 用户可能更容易。然后从所有 AD 用户查询中进行特定过滤。除了 ActiveDirectory 模块中缺少健壮的命令之外,搜索并不简单的主要原因是您要在数组中搜索值数组。检查数组中的单个值要简单得多,PowerShell 可以本机处理大多数 Collection 对象类型中的这些类型的查询。