Назад | Перейти на главную страницу

Уведомление о пароле Windows для пользователей Ubuntu / Mac

Итак, я знаю, что в Windows Server вы можете настроить объект групповой политики для уведомления «пользователей Windows» x количество дней до истечения срока действия их пароля. Мой вопрос: как лучше / проще всего уведомить другие платформы? В настоящее время мы используем нечто, называемое «Самообслуживание паролей», но оно никогда не работало правильно, и я хочу от него избавиться. Это больше проблем, чем того стоит.

Любые предложения были бы замечательными, спасибо!

Вы можете написать сценарий PowerShell, который запускается запланированной службой на контроллере домена, который находит всех пользователей, чьи пароли истекают через определенное время и электронные письма каждому пользователю уведомление. Требования к этому решению включают достаточно свежую версию PowerShell (может быть достаточно 2.0 или более поздней версии), сервер ретрансляции SMTP в какой-то точке и поля адреса электронной почты, заполненные в AD для каждого пользователя. Сценарий должен запускаться с повышенными привилегиями.

$from = "<administrator@example.com>"
$subject = "Your password on the domain example.com is expiring soon"
$smtpServer = "smtprelay.example.com"

$today = Get-Date

# An HTML formatted e-mail body has been created and saved to a text file.
# This command reads the file into an array, each array element is one line of the file.

$bodyArray = Get-Content -Path "C:\ScriptData\emailbody.txt"

# The e-mail command won't correctly send the array for the e-mail body, we have to convert it to a stream of text.

for ($i=0; $i -lt $bodyArray.Count; $i++) {
  $body += $bodyArray[$i]
}

# Regarding the dates in this next command, it's meant to get passwords
# expiring within seven days (that's where the 8 comes from) and exclude
# passwords that have already expired. In AD, numerical zero means 1/1/1600,
# but outside of AD numerical zero is 1/1/1, so 1600 years must be added to
# dates retrieved from AD to compare them to dates computed in PowerShell
# using Get-Date.

$expiringUsers = Get-ADUser -Filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties "GivenName","samAccountName","EmailAddress","msDS-UserPasswordExpiryTimeComputed" | Where-Object {((Get-Date($_.'msDS-UserPasswordExpiryTimeComputed')).AddYears(1600) -lt (Get-Date).AddDays(8)) -and ((Get-Date($_.'msDS-UserPasswordExpiryTimeComputed')).AddYears(1600) -gt (Get-Date))}

foreach ($user in $expiringUsers) {

  $timeRemaining = New-TimeSpan -Start $today -End (Get-Date($user.'msDS-UserPasswordExpiryTimeComputed')).AddYears(1600)
  $daystopassexpiry = $timeRemaining.Days

  # The next command replaces what I'll call constants in the e-mail body file
  # with the values retrieved from the user's AD information. This
  # personalizes each e-mail.

  $newbody = $body -replace "--GIVENNAME--",$user.GivenName -replace "--USERNAME--",$user.SamAccountName -replace "--NUMBER OF DAYS--",$daystopassexpiry -replace "--EMAILADDRESS--",$user.EmailAddress

  Send-MailMessage -From $from -To $user.EmailAddress -Subject $subject -BodyAsHTML -Body $newbody -SmtpServer $smtpServer

  $newbody = $null
}

Предлагаю добавить отлов ошибок (try/catch), и если вы все же запускаете его как запланированное задание, мне нравится добавлять средство ведения журнала, используя Start-Transcript чтобы мне было легче понять, что пошло не так. Я также предлагаю добавить -BCC к Send-MailMessage cmdlet для себя, чтобы вы могли убедиться, что электронные письма проходят и правильно отформатированы.

Я создал тело электронного письма, создав письмо, которое выглядело так, как я хотел, со всеми «константами», записанными, а затем я отправил его себе, а затем я просмотрел источник электронной почты и скопировал его в текстовый файл.