繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM