Установка политики срока действия паролей в организации
Ознакомьтесь со всеми нашими материалами для малого бизнеса в справке по малому бизнесу & обучения.
Эта статья предназначена для пользователей, которые устанавливают политику истечения срока действия паролей для бизнеса, учебного заведения или некоммерческой организации Microsoft 365.
Как администратор, вы можете установить срок действия паролей пользователей через определенное количество дней или задать срок действия паролей так, чтобы они не истекли. По умолчанию срок действия паролей для вашей организации не истекает.
Современные исследования говорят о том, что изменение пароля, установленного в качестве обязательного, приносит больше вреда, чем пользы. Это приводит к тому, что пользователи выбирают ненадежные пароли, повторно используют или обновляют старые пароли, делая их уязвимыми для злоумышленников. Мы рекомендуем включить многофакторную проверку подлинности. Чтобы получить дополнительные сведения о политике паролей, ознакомьтесь с Рекомендациями по политике паролей.
Перед началом работы
Эти действия может выполнять только глобальный администратор.
Если вам нужна помощь с действиями в этом разделе, рассмотрите возможность взаимодействия со специалистом Майкрософт по малому бизнесу. С помощью бизнес-помощника вы и ваши сотрудники получаете круглосуточный доступ к знаниям специалистов по малому бизнесу по мере развития вашего предприятия: от начальных этапов до повседневной работы.
Настройка политики срока действия паролей
Выполните указанные ниже действия, если вы хотите установить срок действия паролей пользователей в днях.
- В Центр администрирования Microsoft 365 перейдите на вкладку Параметры организации. Если вы не являетесь глобальным администратором или администратором безопасности, вы не увидите эту страницу.
- На странице Политика срока действия пароля снимите флажок, чтобы изменить политику паролей.
- Укажите срок действия паролей. Выберите количество дней от 14 до 730 и нажмите кнопку Сохранить.
Уведомления об истечении срока действия пароля больше не поддерживаются в приложениях Центр администрирования Microsoft 365 и Microsoft 365.
Что важно знать об окончании срока действия паролей
Люди, которые используют только приложение Outlook, не будут вынуждены сбрасывать пароль Microsoft 365 до истечения срока его действия в кэше. Это может произойти спустя несколько дней после даты фактического окончания срока действия. Администратор не сможет решить эту проблему.
Предотвращение повторного использования последнего пароля
Если вы хотите запретить пользователям повторно использовать старые пароли, это можно сделать, применив журнал паролей в локальной службе Active Directory (AD). Дополнительные сведения см. в разделе Создание настраиваемой политики паролей.
В Microsoft Entra идентификаторе последний пароль нельзя использовать повторно, когда пользователь изменяет пароль. Политика паролей применяется ко всем учетным записям пользователей, которые создаются и управляются непосредственно в Microsoft Entra идентификаторе. Эта политика паролей не может быть изменена. См. Microsoft Entra политики паролей.
Новые и федеративные домены
Выбранные вами политики паролей задаются для каждого управляемого домена в организации. Если вы добавляете новый домен или преобразуете домен из федеративного в управляемый, необходимо повторно включить политику паролей организации, чтобы снова обновить все домены. В противном случае новый или преобразованный домен сохранит политику по умолчанию.
Синхронизация хэшей паролей пользователей из локальная служба Active Directory с идентификатором Microsoft Entra (Microsoft 365)
Эта статья посвящена настройке политики истечения срока действия для пользователей только в облаке (идентификатор Microsoft Entra). Она не применима к пользователям в гибридной среде, для которых используется синхронизация хэшей паролей, сквозная проверка подлинности или локальная служба федерации, например ADFS.
Сведения о том, как синхронизировать хэши паролей пользователей из локальной службы AD с идентификатором Microsoft Entra, см. в статье Реализация синхронизации хэша паролей с помощью Microsoft Entra Connect Sync.
Политики паролей и ограничения учетных записей в идентификаторе Microsoft Entra
Вы можете задать дополнительные политики паролей и ограничения в Microsoft Entra идентификаторе. Дополнительные сведения см. в статье Политики паролей и ограничения учетных записей в Microsoft Entra ID.
Обновление политики паролей с помощью PowerShell
Командлет Update-MgDomain обновляет политику паролей указанного домена или клиента и указывает срок действия пароля до его изменения.
Сведения об обновлении политики паролей для определенного домена или клиента см. в разделе Update-MgDomain.
Как посмотреть истекающие пароли в AD?
Как посмотреть пользователей и компьютеры с истекающим паролем? к примеру скок действия пароля мене 10 дней.
- Вопрос задан более трёх лет назад
- 2877 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 1
PowerShell вам в помощь.
Get-ADUser -Filter –Properties "SamAccountName", "msDS-UserPasswordExpiryTimeComputed" | Select-Object -Property "SamAccountName", @>
Так вы получаете список активных пользователей в домене, за исключением тех, срок действия пароля которых не ограничен, с дополнительным параметром профиля msDS-UserPasswordExpiryTimeComputed, который затем приводите в читабельный вид.
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- Active Directory
- +2 ещё
Kerberos аутентификация пользователей в MS Exchange с двух разных доменов?
- 1 подписчик
- 25 апр.
- 36 просмотров
Настройка политики паролей в домене Active Directory
01.12.2023
itpro
Active Directory, Windows 10, Windows Server 2019, Безопасность, Групповые политики
комментариев 47
Парольная политика в домене Active Directory задает базовые требования безопасности к паролям учетных записей пользователей такие как сложность, длину пароля, частоту смены пароля и т.д. Надежная политика паролей AD позволяет снизить возможность подбора или перехвата паролей пользователей.
Настройка политики паролей в Default Domain Policy
Настройки политика паролей пользователей в домене AD по умолчанию задаются через групповую политику Default Domain Policy. Вы можете просмотреть и изменить настройки парольной политики в домене с помощью консоли управления консоль управления доменными GPO
- Откройте консоль gpmc.msc и выберите Default Domain Policy, которая назначена на корень домена;
- Щелкните правой кнопкой по Default Domain Policy и выберите Edit;
- Разверните Конфигурация компьютера -> Политики -> КонфигурацияWindows-> Параметры безопасности -> Политики учетных записей -> Политика паролей (Computer configuration -> Policies -> Windows Settings -> Security Settings -> Account Policies -> Password Policy
- В этом разделе есть шесть параметров политики паролей (описаны ниже);
- Чтобы изменить настройки параметра, дважды щелкните по ней. Чтобы включить политику, отметьте галку Define this policy settings и укажите необходимую настройку (в примере на скриншоте я задал минимальную длину пароля пользователя 8 символов). Сохраните изменения;
- Новые настройки парольной политики применяться ко всем пользователям домена после обновления настроек GPO на контролере домена с FSMO ролью PDC Emulator.
Основные параметры политики паролей в домене
Всего доступно шесть параметров политики паролей:
Чтобы исключить использование пользователями простых паролей (из словаря популярных паролей) рекомендуется периодически выполнять аудит паролей в домене.
Если пользователь попытается задать пароль, которые не соответствует политике паролей в домене, Windows выдаст ошибку:
Не удается обновить пароль. Введенный пароль не обеспечивает требований домена к длине пароля, его сложности или истории обновления.
Unable to update the password. The value provided for the new password does not meet the length, complexity, or history requirements of the domain.
Обычно вместе с политикой паролей нужно настроить параметры блокировки пользователей при неправильном введении пароля. Эти настройки находятся в разделе GPO: Политика блокировки учетной записи (Account Lockout Password):
- Пороговое значение блокировки (AccountLockoutThreshold) – через сколько попыток набрать неверный пароль учетная запись пользователя будет заблокирована;
- Продолжительность блокировки учетной записи (AccountLockoutDuration) – длительность блокировки учетной записи, в течении которой вход в домен будет невозможен;
- Время до сброса счетчика блокировки (Resetaccountlockoutcounterafter) – через сколько минут счетчик неверных паролей (Account Lockout Threshold) будет сброшен.
Если учетные записи блокируются слишком часто, вы можете найти компьютер/сервер источник блокировки так.
Настройки парольных политик домена Active Directory по-умолчанию перечислены в таблице:
Политика | Значение по-умолчанию |
Enforce password history | 24 пароля |
Maximum password age | 42 дня |
Minimum password age | 1 день |
Minimum password length | 7 |
Доменная политика паролей действует только на к пользователям AD. Компьютеры, добавленные в AD, самостоятельно меняют пароли своих учетных записей компьютеров в AD раз в 30 дней (по умолчанию). Подробнее об этом в статье о восстановлении доверительных отношениях между рабочими станциями и доменом.
Управление параметрами политики паролей AD с помощью PowerShell
Для просмотра настроек и изменения конфигурации политики паролей в AD можно использовать командлеты PowerShell из модуля Active Directory:
Вывести настройки дефолтной политики паролей:
ComplexityEnabled : True DistinguishedName : DC=winitpro,DC=ru LockoutDuration : 00:30:00 LockoutObservationWindow : 00:30:00 LockoutThreshold : 0 MaxPasswordAge : 42.00:00:00 MinPasswordAge : 1.00:00:00 MinPasswordLength : 7 objectClass : objectGuid : PasswordHistoryCount : 24 ReversibleEncryptionEnabled : False
Или с помощью команды:
net accounts
Также вы можете узнать текущие настройки политики паролей AD на любом компьютере в отчете результирующей политики, сгенерированном с помощью консольной утилиты gpresult.
Вывести информацию о том, когда пользователь менял пароль последний раз, и когда истекает его пароль:
net user aivanov /domain
Изменить параметры политики паролей AD:
Set-ADDefaultDomainPasswordPolicy -Identity winitpro.ru -MinPasswordLength 14 -LockoutThreshold 10
Несколько парольных политик в домене Active Directory
С помощью групповых политик на домен можно назначить только одну политику, которая будет действовать на всех пользователей без исключения. Даже если вы создадите новую GPO с другими парольными настройками и примените ее к OU с пользователями, эти настройки фактически не применяться.
Начиная с версии Active Directory в Windows Server 2008 с помощью гранулированных политик паролей Fine-Grained Password Policies (FGPP) можно применять индивидуальный параметры политики паролей для конкретных пользователей или групп. Например, вы хотите, чтобы пользователи из группы Server-Admins использовали пароли с минимальной длиной 15 символов.
- Откройте консоль Active Directory Administrative Center ( dsac.exe );
- Перейдите в раздел System ->Password Settings Container и создайте новый объект PSO (Password Settings Object);
- В открывшемся окне укажите название политики паролей и ее приоритет. Включите и настройте параметры парольной паролей, которые вы хотите применить. В разделе Directly Applies to нужно добавить группы или пользователей, для которых должны применяться ваши особые настройки политики паролей.
Чтобы проверить, применяются ли к конкретному пользователю особая политика паролей, выполните команду:
Get-ADUserResultantPasswordPolicy -Identity aivanov
Команда выведет результирующие настройки политики паролей, которые дейсвтуиют на пользователя.
Предыдущая статья Следующая статья
Автоматическое управление паролями в Active Directory
Однажды мне всё это надоело…
Вероятно, в большинстве случаев именно с этой фразы начинается творчество системных администраторов. В результате мы видим (хотя, правильнее сказать, даже и не замечаем) появление множества маленьких программ, которые выполняют свои точные и строго определённые задачи в одной большой системе.
Случилась (да и регулярно случается) со мной подобная история. Не скажу, что я изобрёл что-то новое и выдающееся. Скорее наоборот – воспользовался трудами коллег, найденными в просторах интернета и в кладезях премудрости Хабра. Но мне удалось объединить их для решения вполне конкретной и достаточно интересной задачи. Далее я опишу конкретное решение конкретной задачи по управлению паролями пользователей в Active Directory. Точнее, автоматизацию проверки срока действия этих паролей и генерации новых паролей. В качестве признательности коллегам я счёл необходимым опубликовать это решение здесь, в надежде, что оно кому-то пригодится или послужит источником новых идей.
Итак, существует некая организация с могучей и разветвлённой филиальной сетью. Филиалов много по всей нашей необъятной Родине и все они разнокалиберны. Большая часть из них включена в корпоративную сеть с доменной структурой, но множество подключено по принципу home-office. В дополнение к тому многие сотрудники постоянно находятся в длительных командировках без возможности подключаться к доменной сети и к интернету вообще.
В результате часто возникает проблема просроченных паролей. Политикой компании определён запрет на бессрочные пароли, а требования с строгости паролей достаточно суровы, что вызывает у пользователей сложности с их придумыванием и заменой. Соответственно, ничтоже сумняшеся свою головную боль они радостно перекладывают на IT поддержку, звоня и требуя сменить их уже недействующий пароль. Регулярно. Надоело.
Итак, что же мне захотелось сделать? Мне нужно средство, которое:
• само проверяло срок истечения действия пароля пользователя;
• предварительно предупреждало его о дате смены пароля по электропочте;
• предлагало пользователю вариант нового пароля;
• если пользователь не успел сменить пароль, автоматически заменяло его на новый;
• уведомляло пользователя о новом пароле посредством SMS.
Интерес состоял в том, чтобы решить эту задачу максимально подручными средствами, не привлекая сторонних услуг и сервисов. Ну вот не было никакого желания выбирать тарифы и пакеты. Зато был свободный GSM-модем. И всемогущий PowerShell.
В результате получился скрипт, а точнее — два скрипта. Почему так, объясняется просто – так сложилось исторически. Дело в том, что проверку паролей производит скрипт на виртуальной машине, расположенной в одном филиале, а рассылкой уведомлений по SMS занимается другая машина, расположенная в противоположной части страны. Из-за условий мобильного оператора иначе делать было нерентабельно.
Далее привожу оба скрипта целиком, которые я максимально прокомментировал. Выглядят они немного кучеряво. У меня не было особой потребности их причёсывать, поскольку работают они хорошо и в таком виде:
# Скрипт производит проверку паролей, срок действия которых истекает завтра, # отсылает владельцу новый пароль по email, # и автоматически заменяет, если срок действия паролей истёк. # # функция записи логов. $dt=Get-Date -Format "dd-MM-yyyy" $setupFolder = "c:\Active_Directory\Log" New-Item -ItemType directory -Path $setupFolder -Force | out-null #Создаю директорию для логов $global:logfilename="C:\Active_Directory\Log\"+$dt+"_LOG.log" [int]$global:errorcount=0 #Ведем подсчет ошибок [int]$global:warningcount=0 #Ведем подсчет предупреждений function global:Write-log # Функция пишет сообщения в лог-файл и выводит на экран. "warning" < $global:warningcount++ write-host $msg -ForegroundColor yellow >"completed" < write-host $msg -ForegroundColor green >"info" < write-host $msg >default < write-host $msg >> > > #Функция генератора сложных паролей function global:Get-RandomPassword < [CmdletBinding()] param( [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)] [ValidateRange(4,15)] [Int] $PasswordLength ) Begin<> Process < $numberchars=0..9 | % $lochars = [char]'a' .. [char]'z' | % $hichars = [char]'A' .. [char]'Z' | % $punctchars = [char[]](33..47) $PasswordArray = Get-Random -InputObject @($hichars + $lochars + $numberchars + $punctchars) -Count $PasswordLength $char1 = Get-Random -InputObject $hichars $char2 = Get-Random -InputObject $lochars $char3 = Get-Random -InputObject $numberchars $char4 = Get-Random -InputObject $punctchars $RndIndexArray = Get-Random (0..($PasswordLength-1)) -Count 4 $PasswordArray[$RndIndexArray[0]] = $char1 $PasswordArray[$RndIndexArray[1]] = $char2 $PasswordArray[$RndIndexArray[2]] = $char3 $PasswordArray[$RndIndexArray[3]] = $char4 return [system.string]::Join('', $PasswordArray) > End<> > #SMTP адрес почтового сервера $smtpServer = "mail.domain.local" #создаем объект письмо $msg = new-object Net.Mail.MailMessage $msgr = new-object Net.Mail.MailMessage #создаем объект почтовый сервер $smtp = new-object Net.Mail.SmtpClient($smtpServer) # Функция для сообщения пользователю Function EmailStructure($to,$expiryDate,$upn) < $msg.IsBodyHtml = $true $msg.From = "ITHelpDesk@domain.local" $msg.To.Clear() $msg.To.Add($to) $msg.Subject = "Password expiration notice" $msg.Body = "This is an automatically generated message from Company IT Service.
Please note that the password for your account domain\$upn will expire on $expiryDate.
System automatically generated a new password for you.
You can use password - $generated_password
Please change your password immediately or at least before this date as you will be unable to access the service without contacting your administrator.
If you will not change your password, System set it automatically. "> # Функция для отчёта администратору Function EmailStructureReport($to) < $msgr.IsBodyHtml = $true $msgr.From = "PasswordChecker@domain.local" $msgr.To.Add($to) $msgr.Subject = "Script running report" $msgr.Body = "This is a daily report.
Script for check expiried passwords has successfully completed its work.
$NotificationCounter users have recieved notifications:
$ListOfAccounts "> # Подключаем модуль для работы с Active Directory Import-Module activedirectory # получаем список всех активированных российских пользователей, у которых установлен срок действия пароля $NotificationCounter = 0 $OU = "OU=Russia,DC=local,DC=domain" $ADAccounts = Get-ADUser -LDAPFilter "(objectClass=user)" -searchbase $OU -properties PasswordExpired, employeeNumber, PasswordNeverExpires, PasswordLastSet, Mail, mobile, Enabled | Where-object # для каждого пользователя foreach ($ADAccount in $ADAccounts) #проверяем политику сложности пароля < $accountFGPP = Get-ADUserResultantPasswordPolicy $ADAccount if ($accountFGPP -ne $null) < $maxPasswordAgeTimeSpan = $accountFGPP.MaxPasswordAge >else < $maxPasswordAgeTimeSpan = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge >#Заполняем переменные пользовательскими данными $samAccountName = $ADAccount.samAccountName $userEmailAddress = $ADAccount.mail $userPrincipalName = $ADAccount.UserPrincipalName $userStorePassword = $ADAccount.employeeNumber $usermobile = $ADAccount.mobile # Для каждого из пользователей, не успевшего сменить пароль if ($ADAccount.PasswordExpired) < # Считываем пароль из атрибутного поля AD # Если нет ранее сохранённого пароля, устанавливаем пароль по умолчанию - Pa$$w0rd if ($userStorePassword -eq $NULL -or $useStorePassword -eq " ") < $userStorePassword = "Pa$$w0rd" ># Заменяем пароль на новый $newpwd = ConvertTo-SecureString -String $userStorePassword -AsPlainText –Force Set-ADAccountPassword -Identity $samAccountName -NewPassword $newpwd –Reset # Сохраняем новый пароль и номер мобильного телефона в TXT файл if ($usermobile -ne $NULL) < $SMSfile="C:\ActiveDirectory\SMS_notice.txt" $SMSMessage=$usermobile + "," + $userStorePassword Out-File -FilePath $SMSfile -InputObject $SMSMessage -Append -encoding unicode ># Делаем запись в журнале write-log "for $samAccountName will set a stored password - $userStorePassword. Message send to mobile - $usermobile" write-log "---------------------------------------------------------------------------------------------------------" # Очищаем атрибутное поле AD Set-ADUser $samAccountName -employeeNumber $null > else # Для всех тех, у кого пароль истекает завтра, то есть $DaysToExpireDD меньше 2 < $ExpiryDate = $ADAccount.PasswordLastSet + $maxPasswordAgeTimeSpan $TodaysDate = Get-Date $DaysToExpire = $ExpiryDate - $TodaysDate #Вычисляем дней до просрочки в DaysToExpireDD в формате дней $DaysToExpireDD = $DaysToExpire.ToString() -Split ("\S$") if (($DaysToExpire.Days -le 2)) < Write-log "The password for account $samAccountName expires on: $ExpiryDate. Days left: $DaysToExpireDD # Генерируем новый пароль в переменную $generated_password $generated_password = Get-RandomPassword 10 write-log "Generated password: $samAccountName - $generated_password" write-log "-----------------------------------------------------------------------------------------" # Записываем новый пароль в атрибутное полe AD. Будем пользоваться атрибутом employeeNumber Set-ADUser $samAccountName -employeeNumber $generated_password # отсылаем письмо с предупреждением пользователю if ($userEmailAddress) #проверяем наличие адреса электронной почты у пользователя. < EmailStructure $userEmailAddress $expiryDate $samAccountName $smtp.Send($msg) write-log "NOTIFICATION - $samAccountName :: e-mail was sent to $userEmailAddress" $NotificationCounter = $NotificationCounter + 1 $ListOfAccounts = $ListOfAccounts + $samAccountName + " - $DaysToExpireDD days left. Sent to $userEmailAddress
" > > > > #Отправляем список новых паролей на сервер, который занимается отправкой SMS # Если список существует If (Test-Path $SMSfile) < Copy-Item -Path $SMSfile -Destination \\SMS-Send-Server.domain.local\C$\ActiveDirectory\SMS_notice.txt # Удаляем файл со списком новых паролей Remove-Item $SMSfile ># отсылаем копию отчёта администратору Write-log "SENDING REPORT TO IT DEPARTMENT" EmailStructureReport("ITHelpdesk@domain.local") $smtp.Send($msgr)
Этот скрипт добавим в Планировщик Заданий Windows, настроив его на выполнение в нужное нам время. Например, ночью.
К сожалению, скрипт проверяет просроченные пароли в момент своего выполнения. Так что если срок действия пароля истекает днём, то он его не будет учитывать. Но ведь нам это и не требуется, ибо в рабочее время сотрудник может поменять пароль самостоятельно.
В результате мы получаем список мобильных номеров пользователей, которым установлен новый пароль. Этот список мы отправим на сервер, к которому подключен GSM-модем. А там этим списком займется уже следующий скрипт.
# #Скрипт получает список мобильный номеров и сообщений из файла и рассылает пользователям # # указываем, где хранится файл со списком $sms_text_filename = "SMS_notice.txt" $PathToSmsPrepareToSend = "C:\ActiveDirectory" + "\" + $sms_text_filename $dt=Get-Date -Format "dd.MM.yyyy" # указываем, куда мы будем сохранять журнал событий $of="C:\ActiveDirectory\Log\"+$dt+"_LOG.log" # Проверяем наличие списка сообщений If (Test-Path $PathToSmsPrepareToSend) < $SMS = Import-Csv $PathToSmsPrepareToSend -Header mobile, newpassword # для каждой строки из списка сообщений foreach ($SM in $SMS) < # $mobileForSMS = $SM.mobile # $passwordFroSMS = $SM.newpassword # echo $mobileForSMS # Объявляем экземпляр класса SerialPort $serialPort = new-Object System.IO.Ports.SerialPort # Устанавливаем переменные настроек порта, к которому подключен модем $serialPort.PortName = "COM3" $serialPort.BaudRate = 115200 $serialPort.WriteTimeout = 500 $serialPort.ReadTimeout = 3000 $serialPort.DtrEnable = "true" # Открываем порт # $serialPort.Open() # Сохраняем номер телефона и сообщение в переменные # Удаляем лишние пробелы в номере телефона $phoneNumber = [Regex]::replace($SM.mobile,'\s','') $textMessage = "Your new password - " + $SM.newpassword try < $serialPort.Open() >catch < # Ждём 5 секунд и пытаемся снова Sleep -Milliseconds 500 $serialPort.Open() >If ($serialPort.IsOpen -eq $true) < # Указываем модему, что будем использовать режим AT-команд $serialPort.Write("AT+CMGF=1`r`n") Sleep -Milliseconds 500 # Отправляем данные в модем # Сначала номер телефона в международном формате # и символы в конце $serialPort.Write("AT+CMGS=`"$phoneNumber`"`r`n") # Даём модему время на обработку Sleep -Milliseconds 500 # Записываем в модем наше сообщение $serialPort.Write("$textMessage`r`n") Sleep -Milliseconds 500 # отсылаем в модем Ctrl+Z в качестве завершения сообщения. $serialPort.Write($([char] 26)) # подождём, пока модем отошлёт сообщение Sleep -Milliseconds 500 > # Закрываем порт $serialPort.Close() if ($serialPort.IsOpen -eq $false) < # записываем результат в журнал $dts=Get-Date -Format "dd.MM.yyyy HH:mm:ss" $msg=$dts+" :Message "+$textMessage+" send to "+ $phoneNumber Out-File -FilePath $of -InputObject $msg -Append -encoding unicode >Sleep -Milliseconds 1000 > #Конец цикла обработки строки из списка # переименовываем файл списка сообщений для сохранения в истории $newname =$dt+"_"+$sms_text_filename rename-item -path $PathToSmsPrepareToSend -newname $newname > #Конец проверки существования списка Else # Если списка сообщений не существует
Скрипты проверены в боевых условиях и показали себя с наилучшей стороны.
Я не буду объяснять, почему сделал именно так, поскольку задача была достаточно конкретна. И решение получилось вполне конкретное.
Но я буду рад любым советам по улучшению или оптимизации скриптов.
UPD:
Вылезла интересная ошибка.
Импорт паролей из текстового файла основан на функции Import-Csv, которая справедливо считает запятую разделителем полей.
А генератор паролей вполне активно использует запятую в качестве одного из спецсимволов.
В итоге пароль устанавливался нормальной длины, как и предполагалось, а вот в SMS пользователю приходил «обрезанный» пароль.
Решение незатейливое: раз нельзя использовать запятую, будем использовать звёздочку (её больше любят, чем знаки препинания)
Добавляем строчку сразу после генерации пароля:
$generated_password = $generated_password_comma -replace ",","*"
Досадная мелочь, непродуманная заранее (mea culpa), а доверие пользователей подкосило здорово.