我在编写一些 PowerShell 代码时遇到了问题。
我正在尝试针对 Active Directory 运行查询,它将所有组、组成员、电子邮件地址和每个用户的 SID 导出到 CSV 文件。
它必须是递归的,以便能够在组内搜索组。
非常感谢你的帮助!我是新手。
我当前的代码仅显示特定组的名称:
Import-Module ActiveDirectory
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$Group = Get-ADGroupMember -identity “Group distinguishedname” -Recursive
$Group | get-aduser -Properties mail |select name,samaccountname,mail |export-csv -path $scriptPath\Members.csv -NoTypeInformation
答案1
由于时间紧迫,我将这样回答:
您可以按照以下思路进行操作:首先将所有组都找出来放入类似于以下的变量中:
$Groups = Get-ADGroup ...
$Groups
然后以类似的方式迭代该对象:
$Groups | Foreach-Object `
{
$CurrentGroup = $_
$Members = Get-ADGroupMember -Identity $CurrentGroup ...
# Build CSV string here with output from both
# both $CurrentGroup and $Members
# and additional data you might want to pull
# Write CSV string to file here or add it to an array
# to print to file after the looping.
}
希望这能推动您朝着可行的方向前进,我会看看您取得的进展并在时间允许的情况下为您提供帮助。
答案2
这样做的问题是,您的结果不能保证是唯一的。您可能确实有属于多个组的用户。如果发生这种情况,您会发现报告中有重复的条目。
另一个问题是,您的结果中最终会出现其他对象,例如计算机和组。可以过滤掉这些对象。总的来说,尝试在同一行上显示当前组和用户信息会变得相当复杂。
AD 用户对象具有memberOf
属性。如果您仅列出所有 AD 用户和您所需的相关属性(包括属性memberOf
),您将获得更清晰的报告,并且生成速度会更快。
因此你的脚本看起来更像这样:
# Only required if using Powershell 2.0
Import-Module Active Directory
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
Get-ADUser -Filter * -Properties mail,memberOf |
Select Name,SamAccountName,Mail,SID,memberOf |
Export-CSV $script_path\members.tsv -NoTypeInformation -Delimiter "`t"
此解决方案的唯一问题是,memberOf 字段给出了组的 DN(每个组包含逗号,每个组也用逗号分隔),因此这是一个制表符分隔的文档。一旦您有了 TSV,您就可以根据需要对其进行排序和过滤。
这不是最好的解决方案,但否则会变得相当复杂。由于您是新手,最好尽可能保持简单。
答案3
通过使用 add-member cmdlet,我们可以保留 PsObject 并添加需要导出的组信息。将数据保存在 PsObject 中可轻松输出。
$adGroups = Get-ADGroup -Filter *
foreach ($grp in $adGroups){
Write-Host "Processing $($grp.DistinguishedName)"
#get the memebers of the group
$grpMembers = Get-ADGroupMember $grp | where {$_.ObjectClass -eq "user"} | select -ExpandProperty SamAccountName
foreach ($member in $grpMembers){
#Get user information
$user = get-aduser $member -Properties mail
#Add group name and DN to the object
Add-Member -InputObject $user -MemberType NoteProperty -Name Group -Value $grp.Name -Force
Add-Member -InputObject $user -MemberType NoteProperty -Name GroupDn -Value $grp.DistinguishedName -Force
#Output user to CSV
$user | select name, samAccountName, SID, distinguishedName, Group, GroupDn | Export-Csv "c:\Windows\temp\groupMembership.csv" -NoTypeInformation -Append
}
}
注意:这仅输出用户对象