从 CSV Powershell 导出用户列表的 AD 组成员身份

Export the AD Group Membership of a list of users from a CSV Powershell

我正在尝试获取 'VPN Users' 组中所有也在 'Domain Users' 组中的用户的 CSV 输出。我希望它给出他们的名字,然后给出他们的组成员身份。每个成员只能在 VPN 组中。我想确定谁在这两个组中。

为了实现这一点,我首先将 VPN 组中的用户列表导出到 CSV 文件中,效果很好。代码的第二部分旨在浏览来自该 AD 组的 CSV 中的用户列表,并将输出导出为包含用户及其组成员身份的 CSV,这对我不起作用。对于 CSV 中的每个用户,它 returns 错误:Get-ADUser:找不到具有标识的对象:'"User001_vpn"'.....

我不确定我正在处理的方法是否是完成手头任务的最佳方法,或者你们中的任何人是否可以帮助我完成它? Get-ADUser 似乎没有从 CSV 中找到用户。

#Retrieves list of users that are in the VPN Users group and exports them into a CSV
(Get-ADGroupMember "VPN Users" -Recursive | Get-ADUser -Properties * |
Select-Object SamAccountName |
ConvertTo-Csv -NoTypeInformation) |
Select-Object -Skip 1 |
Set-Content -Path "C:\Documents\VPN Users Report\VPNUsers.csv”


Get-Content “C:\Documents\VPN Users Report\VPNUsers.csv” | Get-ADUser | ForEach{
    $user = $_
    $groups = Get-ADPrincipalGroupMembership $user
    $groups | %{ New-Object PSObject -Property @{ User = $user.SamAccountName; Group = $_.SamAccountName } }
} | Export-Csv "C:\VPN Users Report\Results\Output.csv"

我认为问题出在引号上,因为您在检索用户时使用 ConvertTo-Csv,所有用户 SamAccountNames 都将被引用。

之后您使用 Get-Content 而不是 Import-Csv 读取此 csv 文件,因此不会删除引号并且您的用户名类似于 "User001_vpn" 而不是 User001_vpn

你根本不必使用这个 'in-between' cvs 并且再三考虑,你也可以省略 Get-ADUser 除非你想要这些用户的其他属性而不是 Get-ADGroupMember已经 returns(即 distinguishedName、name、objectClass、objectGUID、SamAccountName、SID)

尝试

# Retrieves list of users that are in the VPN Users group
(Get-ADGroupMember "VPN Users" -Recursive | Where-Object { $_.objectClass -eq 'user' }).SamAccountName | ForEach-Object {
    foreach ($group in (Get-ADPrincipalGroupMembership -Identity $_)) {
        [PsCustomObject]@{
            User  = $_
            Group = $group.SamAccountName
        }
    }
} | Export-Csv "C:\VPN Users Report\Results\Output.csv" -NoTypeInformation

我添加了Where-Object { $_.objectClass -eq 'user' },因为Get-ADGroupMember cmdlet 可以return 用户、组、and/or 计算机对象


根据您的最新评论:

如果您想要用户的更多属性,您需要 Get-ADUser,默认情况下 returns 具有这些属性的对象:
DistinguishedName, Enabled, GivenName, Name, ObjectClass, ObjectGUID, SamAccountName, SID, Surname, UserPrincipalName

如果您还需要更多,例如用户的电子邮件地址,您需要通过添加 -Properties EmailAddress

来询问
# demo to include the users first and last name
Get-ADGroupMember "VPN Users" -Recursive | Where-Object { $_.objectClass -eq 'user' } | ForEach-Object {
    $user = Get-ADUser -Identity $_.DistinguishedName
    foreach ($group in (Get-ADPrincipalGroupMembership -Identity $user.DistinguishedName)) {
        [PsCustomObject]@{
            User      = $user.SamAccountName
            FirstName = $user.GivenName
            LastName  = $user.Surname
            Group     = $group.SamAccountName
        }
    }
} | Export-Csv "C:\VPN Users Report\Results\Output.csv" -NoTypeInformation

我建议 让 LDAP 处理用户过滤的替代方法。

此查询的结果将是 GroupX GroupY 成员的用户:

$groupX = (Get-ADGroup 'VPN Users').DistinguishedName
$groupY = (Get-ADGroup 'Domain Users').DistinguishedName

Get-ADUser -LDAPFilter "(&(memberOf=$groupX)(memberOf=$groupY))"

如果您正在寻找其中一个组两个组的间接成员,意思是,那些嵌套组的可能成员您可以使用 memberOf:1.2.840.113556.1.4.1941: 的组。示例:

Get-ADUser -LDAPFilter "(&(memberOf:1.2.840.113556.1.4.1941:=$groupX)(memberOf=$groupY))"

将带来 GroupX 的所有成员 (递归),它们也是 GroupY 直接 成员。