Скрипт Powershell для пользователей AD, срок действия которых истекает
Итак, в основном, здесь у меня есть скрипт, который будет сканировать CSV, который он импортирует, и для каждой записи в электронной таблице, за исключением людей из RANDOM.DOMAIN, он найдет адрес электронной почты менеджера и отправит автоматическое письмо на менеджер говорит им, что пользователь XYZ скоро истекает, и они должны что-то с этим сделать.
Если по какой-либо причине электронная почта менеджера недоступна, по умолчанию она отправляется мне. Этот скрипт работает хорошо.
Проблема, с которой я сталкиваюсь, заключается в том, что я хочу сделать так, чтобы каждому менеджеру отправлялось только одно электронное письмо, несмотря на то, что несколько пользователей (или записей) из электронной таблицы указывали их в качестве менеджера.
Т.е. если у Джо Блоггса есть менеджер Аарон Т, а у Джейн Доу есть менеджер Аарон Т, то Аарон Т получит два электронных письма, по одному для каждого пользователя.
МОЙ ВОПРОС:
Есть ли простой способ заставить его отправлять только одно электронное письмо на каждого менеджера, даже если у этого менеджера есть несколько пользователей, которые сообщают о том, что их срок действия истекает?
$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 ответа
Поэтому я, наконец, решил вернуться к этому сценарию через много-много месяцев. Мне стало лучше в PowerShell, и хотя я уверен, что это не самый эффективный способ сделать это, это то, что мне подходит.
Я также изменил метод ввода; он извлекает информацию непосредственно из AD, а не использует файл CSV, который раньше создавался из приложения под названием "AD Manager Plus" (ненавижу его).
Помните, что здесь используются 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")
}
}
Для этого вам нужно отложить обработку электронной почты. Соберите пользователей в хеш-таблицу, например, по адресу электронной почты менеджера:
...
$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