You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

协助完善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
}

关键修改说明:

  1. 整合用户与组信息

    • 将获取用户组的逻辑移到遍历用户的循环内部,确保每个用户都能正确获取自己的所属组
    • 把AD组的DN转换为易读的组名,并通过分号分隔存入对象,方便CSV导出查看
    • 提前获取经理的SamAccountName和邮箱,避免后续重复查询AD
  2. 按经理分组优化

    • 使用ManagerDN(经理的LDAP路径)作为分组依据,避免同名经理导致的分组错误
    • 增加了无经理、经理无邮箱的异常处理,避免脚本报错中断
  3. 邮件与附件逻辑完善

    • 为每个经理生成专属的CSV附件,包含其下属所有用户的组权限信息
    • 邮件正文明确标注下属用户列表,提升经理的审核效率
    • 发送邮件后自动清理临时CSV文件,避免磁盘残留

内容的提问来源于stack exchange,提问作者ak2595

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:21:13