检索Active Directory安全组中的用户报告

时间:2019-06-18 19:52:35

标签: powershell active-directory report powershell-4.0

我正在尝试搜索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个条目。

1 个答案:

答案 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