0

我正在尝试获取同样在“域用户”组中的“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"

4

2 回答 2

1

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

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

您根本不必使用此“中间” cvs,再三考虑,您也可以省略,Get-ADUser除非您希望这些用户的其他属性比Get-ADGroupMember已经返回的属性(即 distinctName、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-ADGroupMembercmdlet 可以返回用户、组和/或计算机对象


根据您的最新评论:

如果您想从用户那里获得更多属性,则需要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
于 2021-08-10T14:13:05.177 回答
0

我提出了Theo 的有用答案的替代方法,让 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

于 2021-08-10T14:29:03.977 回答