即将到期的AD用户的Powershell脚本

时间:2013-05-14 00:36:42

标签: powershell active-directory quest

所以基本上,我在这里有一个脚本,它将扫描它导入的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
}

根据要求更新新脚本....仍有问题。

是否有一种简单的方法可以让每位经理发送一封电子邮件,即使该经理有多个用户向他们报告即将过期的电子邮件?

2 个答案:

答案 0 :(得分:0)

为此,您需要推迟电子邮件处理。在哈希表中收集用户,例如经理电子邮件地址:

...

$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

答案 1 :(得分:0)

所以我终于决定在很多个月之后再次访问这个脚本。 我在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")

        }


}