我正在尝试搜索AD安全组列表,并创建每个安全组中的用户报告。该报告应具有组名,名称,用户名和UPN或电子邮件地址。
我找到了一些可以帮助我解决大部分问题的代码。我需要对其进行修改以显示UPN或电子邮件地址。另外,我还需要递归搜索任何组。目前,我要解决的主要问题是在安全性成员对象中显示所有信息。
$Group = (Get-Content -Path C:\Users\myusername\Documents\test\list.txt)
$Table = @()
$Record = [ordered] @{
"Group Name" = ""
"Name" = ""
"Username" = ""
}
foreach ($Group in $Groups)
{
$Arrayofmembers = Get-ADGroupMember -Identity -Group|selectname,samaccountname
foreach ($Member in $Arrayofmembers)
{
$Record."Group Name" = $Group
$Record."Name" = $Member.name
$Record."Username" = $Member.samaccountname
$objRecord = New-Object psobject -Property $Record
$Table += $objrecord
}
}
$Table |export-csv "C:\users\myusername\Documents\securitygroups.csv" -NoTypeInformation
该代码未提取所有列出的对象。例如,我的安全组有3个用户和1个组作为成员列出。看起来该脚本只显示了前2个条目。
答案 0 :(得分:0)
由于Get-AdGroupMember
不返回用户主名称或邮件,因此您将需要以其他方式获取该数据。一种方法是致电Get-ADUser
。
$Record.UserPrincipalName = (Get-ADUser $Member).UserPrincipalName
您可以通过用New-Object
类型的加速器替换[pscustomobject]
命令来使其效率更高一些。同样,您可以只在foreach循环中输出对象,然后将该输出分配给变量。您执行操作的方式(+=
)迫使PowerShell在执行重新分配之前将变量扩展到内存中。随着变量存储越来越多的数据,该过程的效率越来越低。下面的代码反映了我提到的想法。
$Groups = (Get-Content -Path C:\Users\myusername\Documents\test\list.txt)
$Table = foreach ($Group in $Groups)
{
$Arrayofmembers = Get-ADGroupMember -Identity $Group | select name,samaccountname
$Output = foreach ($Member in $Arrayofmembers)
{
[pscustomobject]@{
"Group Name" = $Group
"Name" = $Member.name
"Username" = $Member.samaccountname
"UserPrincipalName" = (Get-ADUser $Member.samaccountname).UserPrincipalName
}
}
$Output
}
$Table | export-csv "C:\users\myusername\Documents\securitygroups.csv" -NoTypeInformation