【问题标题】:Powershell script for Soon-to-expire AD users适用于即将到期的 AD 用户的 Powershell 脚本
【发布时间】:2014-04-25 18:24:06
【问题描述】:

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

已按要求使用新脚本进行了更新....仍有问题。

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

【问题讨论】:

    标签: powershell active-directory quest


    【解决方案1】:

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

    ...
    
    $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
    

    【讨论】:

    • 感谢您的回复 - 我可能有点密集,但我似乎无法让您的代码正常工作。它似乎在它发送的电子邮件中报告每个条目。它似乎根本没有过滤它。不过你说的绝对有道理!
    • 当我使用一些模拟数据进行测试时对我有用(这里没有 AD)。在第一个循环之后检查$expiringUsers 的内容,例如$expiringUsers | fc。如果这无助于解决问题,请使用修改后的代码更新您的问题。
    • 嗯 .. 所以我玩了一点,我现在遇到了其他问题......我无法让它在电子邮件中很好地显示(即它将所有用户的详细信息集中在一起显示在一个块中,其余的在另一个块中).. 我想我需要了解更多关于哈希表的信息。这几乎就像它需要一个“foreach”声明。我很快就会用你提供的脚本更新我的问题..
    【解决方案2】:

    所以我终于决定在很多很多个月后重新审视这个剧本。 我在 PowerShell 方面变得更好了,虽然我确信这不是最有效的方法,但这对我来说很有效。

    我也改了输入法;它直接从 AD 中提取信息,而不是使用过去从名为“AD Manager Plus”的应用程序生成的 CSV 文件(讨厌它)。

    请记住,这里使用 Quest CMDlets 因为我们没有 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")
    
            }
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 2020-11-09
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多