协助完善AD组访问审核的经理邮件发送PowerShell脚本
AD用户组访问审核脚本修正方案
以下是修正并完善后的PowerShell脚本,解决了获取用户组成员身份和给经理发送带附件邮件的核心需求:
### Access Review ### # 定义需要审核的用户列表 $Users = @" SamAccountName; User1 User2 User3 User4 "@ | ConvertFrom-Csv -Delimiter ";" # 遍历用户,获取用户基本信息+直属经理+所属AD组 $UserGroupData = foreach ($User in $Users) { $ADUser = Get-ADUser $User.SamAccountName -Properties Name, UserPrincipalName, Manager, MemberOf # 将MemberOf的DN转换为组名 $Groups = $ADUser.MemberOf | Get-ADGroup | Select-Object -ExpandProperty Name # 输出整合后的自定义对象 [PSCustomObject]@{ UserName = $ADUser.Name SamAccountName = $ADUser.SamAccountName UserPrincipalName = $ADUser.UserPrincipalName ManagerDN = $ADUser.Manager ManagerSamAccount = if ($ADUser.Manager) { (Get-ADUser $ADUser.Manager).SamAccountName } else { $null } ManagerEmail = if ($ADUser.Manager) { (Get-ADUser $ADUser.Manager -Properties Mail).Mail } else { $null } MemberOfGroups = $Groups -join ";" # 用分号分隔多个组,方便CSV导出 } } # 按经理DN分组(避免同名经理的冲突) $GroupedByManager = $UserGroupData | Group-Object -Property ManagerDN # 遍历每个经理分组,发送带附件的邮件 foreach ($ManagerGroup in $GroupedByManager) { # 跳过无经理的用户 if (-not $ManagerGroup.Name) { Write-Warning "用户$($ManagerGroup.Group.SamAccountName -join ', ')无直属经理,跳过邮件发送" continue } $ManagerInfo = $ManagerGroup.Group[0] $ManagerEmail = $ManagerInfo.ManagerEmail # 跳过无邮箱的经理 if (-not $ManagerEmail) { Write-Warning "经理$($ManagerInfo.ManagerSamAccount)无邮箱地址,跳过邮件发送" continue } # 生成当前经理负责的用户组信息CSV文件(临时文件) $TempCsvPath = Join-Path $env:TEMP "AD_Access_Review_$($ManagerInfo.ManagerSamAccount)_$(Get-Date -Format 'yyyyMMdd').csv" $ManagerGroup.Group | Select-Object UserName, SamAccountName, UserPrincipalName, MemberOfGroups | Export-Csv -Path $TempCsvPath -NoTypeInformation -Encoding UTF8 # 发送邮件 $EmailParams = @{ From = 'me@contoso.com' To = $ManagerEmail Subject = "[Manager - Action Required] - 下属AD组访问权限审核" Body = @" 您好: 请查收附件中您下属用户的AD组权限列表,请核实这些权限是否符合当前岗位需求,如有需要移除的权限请及时反馈。 下属用户列表:$($ManagerGroup.Group.UserName -join ', ') "@ SmtpServer = 'mail.contoso.com' Attachment = $TempCsvPath Encoding = [System.Text.Encoding]::UTF8 } Send-MailMessage @EmailParams # 清理临时CSV文件 Remove-Item -Path $TempCsvPath -Force -ErrorAction SilentlyContinue }
关键修改说明:
整合用户与组信息
- 将获取用户组的逻辑移到遍历用户的循环内部,确保每个用户都能正确获取自己的所属组
- 把AD组的DN转换为易读的组名,并通过分号分隔存入对象,方便CSV导出查看
- 提前获取经理的SamAccountName和邮箱,避免后续重复查询AD
按经理分组优化
- 使用
ManagerDN(经理的LDAP路径)作为分组依据,避免同名经理导致的分组错误 - 增加了无经理、经理无邮箱的异常处理,避免脚本报错中断
- 使用
邮件与附件逻辑完善
- 为每个经理生成专属的CSV附件,包含其下属所有用户的组权限信息
- 邮件正文明确标注下属用户列表,提升经理的审核效率
- 发送邮件后自动清理临时CSV文件,避免磁盘残留
内容的提问来源于stack exchange,提问作者ak2595
相关产品推荐
相关产品推荐

