从CSV Powershell中导出用户列表的AD Group Membership



我试图获得'VPN用户'组中所有用户的CSV输出,这些用户也在'域用户'组中。我希望它给出他们的名字,然后是他们的小组成员。每个成员只能在VPN组中。我想确定谁在这两组。

为了实现这一点,我首先将VPN组中的用户列表导出到一个工作良好的CSV。代码的第二部分旨在从该AD组中遍历CSV中的用户列表,并将输出作为包含用户及其组成员关系的CSV导出,这对我来说不起作用。对于CSV中的每个用户,它返回错误:Get-ADUser: Cannot find an object with identity: '"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:DocumentsVPN Users ReportVPNUsers.csv”

Get-Content “C:DocumentsVPN Users ReportVPNUsers.csv” | Get-ADUser | ForEach{
$user = $_
$groups = Get-ADPrincipalGroupMembership $user
$groups | %{ New-Object PSObject -Property @{ User = $user.SamAccountName; Group = $_.SamAccountName } }
} | Export-Csv "C:VPN Users ReportResultsOutput.csv"

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

之后你阅读这个csv文件使用Get-Content,而不是Import-Csv,所以引号不会被删除,你有用户名像"User001_vpn"而不是User001_vpn

你不需要使用这个"中间"cvs,仔细一想,你可以离开Get-ADUser,除非你想从这些用户的其他属性,而不是Get-ADGroupMember已经返回(即区分名称,名称,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 ReportResultsOutput.csv" -NoTypeInformation
我添加了Where-Object { $_.objectClass -eq 'user' },因为Get-ADGroupMembercmdlet可以返回用户、组和/或计算机对象


根据您的最新评论:


DistinguishedName, Enabled, GivenName, Name, ObjectClass, ObjectGUID, SamAccountName, SID, Surname, UserPrincipalName 如果您想从用户获得更多属性,您需要Get-ADUser

,它在默认情况下返回具有这些属性的对象:如果您还需要更多,例如用户的电子邮件地址,您需要通过添加-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 ReportResultsOutput.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.

相关内容

最新更新