【问题标题】:Export the AD Group Membership of a list of users from a CSV Powershell从 CSV Powershell 导出用户列表的 AD 组成员身份
【发布时间】:2021-08-10 13:42:59
【问题描述】:

我正在尝试获取同样在“域用户”组中的“VPN 用户”组中所有用户的 CSV 输出。我希望它给出他们的名字,然后是他们的组成员身份。每个成员只能在 VPN 组中。我正在寻找确定谁在这两个组中。

为了实现这一点,我首先将 VPN 组中的用户列表导出到 CSV,它可以正常工作。代码的第二部分旨在通过该 AD 组的 CSV 中的用户列表,并将输出导出为 CSV,其中包含对我不起作用的用户及其组成员身份。对于 CSV 中的每个用户,它都会返回错误: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"

【问题讨论】:

  • 我看到您使用的是 -Recursive,这些将是组的间接成员,这意味着 cmdlet 可以带来嵌套组的成员。你确定这是你想要的吗?
  • 你可以读取csv,根据用户对对象进行分组,然后查询分组条件-> Import-Csv output.csv | Group User | Where { $_.Group.group -eq 'domain users' -and $_.Group.group -eq 'vpn users' } | Select -Expand Name

标签: powershell csv active-directory group-membership get-aduser


【解决方案1】:

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

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

你根本不必使用这个“中间” cvs,再三考虑,你也可以省略Get-ADUser,除非你想要这些用户的其他属性而不是Get-ADGroupMember已经返回的属性(即distinguishedName,名称、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 可以返回用户、组和/或计算机对象


根据您的最新评论:

如果你想从用户那里得到更多的属性,你需要Get-ADUser,它默认返回具有这些属性的对象:
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

【讨论】:

  • 我正在研究如何在输出中包含用户的名字和姓氏?
  • @MarkCorrigan 我添加了包括 Get-ADUser 在内的代码,因此可以在 CSV 中输出更多属性。
【解决方案2】:

我提出了一个替代 Theo's helpful answer 的方法,让 LDAP 处理用户过滤。

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

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

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

如果您正在寻找其中一个组或两个组的间接成员,这意味着您可以使用@这些组中嵌套组的可能成员987654325@。示例:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多