从 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
的 直接 成员。
我正在尝试获取 '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
我建议
此查询的结果将是 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
的 直接 成员。