![](/img/trans.png)
[英]Powershell Send single Email to Manager for all his soon to expire users
[英]Powershell script for Soon-to-expire AD users
因此,基本上,我在这里拥有的脚本将扫描它导入的CSV,并且对于电子表格中的每个条目,除了RANDOM.DOMAIN中的人员外,它将找到经理的电子邮件地址,并将自动电子邮件发送至经理告诉他们XYZ用户即将过期,因此他们需要为此做些事情。
如果经理的电子邮件由于某些原因而无法使用,则默认为将电子邮件发送给我。 该脚本运行良好。
我遇到的问题是,我希望做到这一点,因此尽管电子表格中有多个用户(或条目),但仅向每位经理发送一封电子邮件,将他们列为经理。
例如,如果Joe Bloggs的经理Aaron T和Jane Doe的经理Aaron T,则Aaron T将收到两封电子邮件,每位用户一封电子邮件。
我的问题:
有没有一种简单的方法可以让每个经理仅发送一封电子邮件,即使该经理有多个要向他们报告的用户即将到期?
$datai = Import-Csv "Soon-to-expire User Accounts22.csv" | select 'Display Name',Manager,'Domain Name','Account Expiry Time'
Connect-QADService -Service another.DC | Out-Null
$expiringUsers = @{}
foreach ($i in $datai) {
$dn = $i.'Display Name'
$dn1 = $i.'Domain Name'
$man = $i.'Manager'
$aet = $i.'Account Expiry Time'
$subject = "Account about to expire: $dn"
$getmail = get-qaduser "$man" -LdapFilter '(mail=*)' | select mail
$emailAD = $getmail.mail
if ($man -eq "-" -or $man -like 'CN=*' -or $getmail -eq $null -or $man -eq "") {
$man = "Aaron T"
$getmail = get-qaduser "$man" -LdapFilter '(mail=*)' | select mail
$emailAD = $getmail.mail
}
if ($expiringUsers.Contains($emailAD)) {
$expiringUsers[$emailAD]["dn"] += $dn += "`n"
$expiringUsers[$emailAD]["aet"] += $aet += "`n"
$expiringUsers[$emailAD]["man"] += $man += "`n"
} else {
$expiringUsers[$emailAD] = @{
#"dn1" = $dn1
#"aet" = $aet
#"man" = $man
# "dn" = @( $dn )
}
}
}
$expiringUsers | fc #as suggested
foreach ($emailAD in $expiringUsers.Keys) {
$dn = $expiringUsers[$emailAD]["dn"]
$dn1 = $expiringUsers[$emailAD]["dn1"]
$man = $expiringUsers[$emailAD]["man"]
$aet = $expiringUsers[$emailAD]["aet"]
$subject = "Account/s About to Expire!"
$content = @"
Hi,
$dn `n
$dn1 `n
$man `n
$aet `n
$emailAD `n
Technology Services
"@
Send-MailMessage -from "aaron@website.com" `
-To $emailAD `
-Subject $subject `
-Body $content `
-Priority high `
-smtpServer "relay.server"
#using this as a test instead of sending mass emais all the time
Write-Host $content
}
根据要求使用新脚本进行了更新。...仍然存在问题。
有没有一种简单的方法可以让每个经理仅发送一封电子邮件,即使该经理有多个要向他们报告的用户即将到期?
为此,您需要推迟电子邮件处理。 将用户收集在哈希表中,例如通过经理电子邮件地址:
...
$expiringUsers = @{}
foreach ($i in $datai) {
If ($i.'Domain Name' -notmatch "RANDOM.DOMAIN") {
...
if ($expiringUsers.Contains($emailAD)) {
$expiringUsers[$emailAD]["dn"] += $dn
} else {
$expiringUsers[$emailAD] = @{
"dn1" = $dn1
"aet" = $aet
"man" = $man
"dn" = @( $dn )
}
}
}
}
并将实际的电子邮件处理移到循环外:
foreach ($emailAD in $expiringUsers.Keys) {
$dn1 = $expiringUsers[$emailAD]["dn1"]
$man = $expiringUsers[$emailAD]["man"]
$aet = $expiringUsers[$emailAD]["aet"]
$subject = "Account about to expire: $($expiringUsers[$emailAD]["dn"])"
$content = @"
Hi,
...
Technology Services
"@
Send-MailMessage -from "Test Script - Powershell <email@test.com>" `
-To "$emailAD" `
-Subject $subject `
-Body $content `
-Priority high `
-smtpServer servername
Write-Host "Mail Sent to $man"
}
请注意,为简单起见,以上代码仅记录了第一个用户的到期日期。 如果要分别记录每个用户的到期日期,则必须采取其他步骤,例如
$expiringUsers[$emailAD]["expiry"] += @{
"name" = $dn;
"date" = $aet;
}
代替
$expiringUsers[$emailAD]["dn"] += $dn
因此,我终于决定在许多月后重新审阅此脚本。 我在PowerShell方面有了一些进步,虽然我确定这不是最有效的方法,但是这对我来说很有用。
我也改变了输入法。 它直接从AD提取信息,而不是使用以前从称为“ AD Manager Plus”的应用程序生成的CSV文件(讨厌它)。
请记住,在这里使用Quest CMDlet,因为我们没有2008环境。 (因此使用Get-QADUser而不是Get-ADuser)
仅供参考,我只在此处发布了将数据整理到单独表中的代码-您可以决定如何利用这些结果。 对于我们的环境,我让它构建了一个不错的HTML表和主体,然后将其发送给适当的管理器进行处理。
#user data input
$data = get-qaduser -SizeLimit 0 -includedproperties accountexpires | where {$_.AccountExpires -ne $null -and $_.AccountExpires -le ((Get-Date).AddDays(45)) }
#get a list of managers, unique.
$uniqueMan = $data | select Manager -Unique
#foreach manager from $uniqueman
Foreach ($manager in $uniqueman) {
#create the array variable / clear it out for the next manager.
$myarray = @()
#foreach User found in in $data query
Foreach ($user in $data) {
#Search the $user's query for people with the same manager as that of the $uniqueman list.
If ($user.Manager -eq $manager.Manager) {
#do what with the result.
#add the person to an array
$myarray += New-Object psobject -Property @{
Name = $user.'Name'
UserName = $user.'SAMAccountName'
AccountExpires = $user.'AccountExpires'
Manager = $user.Manager
}
}
#for testing, to output the results to an HTML file.
#$myarray | ConvertTo-Html | Out-File ("C:\test\" + $manager.Manager + ".html")
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.