如何在AD用户Manager字段为空时给自己发送邮件?
PowerShell AD账号到期通知脚本修改方案
针对你遇到的用户Manager字段为空时报错的问题,我们可以通过添加空值判断、修正原脚本语法错误的方式,实现无经理用户的通知邮件发送给自己的需求,以下是具体修改方案:
核心修改点
- 修正原脚本中的拼写错误(如
filer→Filter、bodayashtml→BodyAsHtml等)与语法疏漏(如未闭合的引号、递归调用脚本块问题) - 新增Manager字段为空的判断逻辑,将无经理的用户单独归类,发送邮件至指定的自己的邮箱
- 优化邮件内容格式,区分经理通知和无经理用户的通知主题与内容
完整修正脚本
Import-Module ActiveDirectory # 基础邮件配置,替换为你的邮箱与SMTP服务器 $mailProps = @{ From = "test@domainname.com" SmtpServer = "server.domain.com" BodyAsHtml = $true } # 账号到期时间范围:接下来X天内到期的用户,替换x为具体天数 $startDate = Get-Date $endDate = $startDate.AddDays(7) # 查询AD中到期时间在指定范围内的用户,包含Manager字段 $userQueryProps = @{ Filter = "AccountExpirationDate -gt '$startDate' -and AccountExpirationDate -lt '$endDate'" Properties = 'AccountExpirationDate', 'Manager' } $users = Get-ADUser @userQueryProps # 将用户按Manager分组,空值Manager单独成组 $users | Group-Object Manager | ForEach-Object { # 确定收件邮箱:Manager为空时用自己的邮箱,否则取经理邮箱 if ([string]::IsNullOrEmpty($_.Name)) { $recipientEmail = "your-own-email@domainname.com" # 替换为你的邮箱 $emailSubject = "账号到期通知:无经理用户列表" } else { $managerEmail = (Get-ADUser $_.Name -Properties EmailAddress).EmailAddress $recipientEmail = $managerEmail $emailSubject = "账号到期通知:你的下属账号即将到期" } # 生成用户到期列表的HTML内容 $userListHtml = "<ul>" foreach ($user in $_.Group) { $expiryDate = $user.AccountExpirationDate.ToString("yyyy-MM-dd HH:mm") $userListHtml += "<li>$($user.Name) 的账号将于 $expiryDate 到期</li>" } $userListHtml += "</ul>" # 组装完整邮件内容 $mailBody = @" <h3>$emailSubject</h3> <p>以下是即将到期的账号信息:</p> $userListHtml <p>请及时处理相关账号续期事宜。</p> "@ # 发送邮件 Send-MailMessage @mailProps -To $recipientEmail -Subject $emailSubject -Body $mailBody }
关键逻辑说明
- 空Manager处理:通过
[string]::IsNullOrEmpty($_.Name)判断分组后的Manager是否为空,为空时将收件人设置为自己的邮箱 - 语法修正:修复了原脚本中
Filter拼写错误、From字段未闭合引号、BodyAsHtml拼写错误,以及原脚本中递归调用$bodyScriptBlock导致的无限循环问题 - HTML内容优化:因为原脚本设置了
BodyAsHtml=$true,所以用HTML格式生成邮件内容,提升可读性
内容的提问来源于stack exchange,提问作者Jonathan Hernandez
相关产品推荐
相关产品推荐

