При создании учетных записей пользователей в Active Directory администратор обычно задает каждой учетной записи уникальный начальный пароль, который затем сообщается пользователю (обычно при первом входе у пользователя требуется сменить этот пароль с помощью опции “User must change password at next logon” атрибута AD userAccountControl). Т.к. вам не хочется каждый раз выдумывать новый случайный пароль пользователям, или вы используете PowerShell скрипт для заведения учетных хзаписей в AD, вы можете автоматизировать генерацию уникальный паролей пользователей с помощью PowerShell.
Для генерации пароля можно воспользоваться методом GeneratePassword из .Net класса System.Web.Security.Membership. Сгенерируем сложный пароль командами:
Add-Type -AssemblyName System.Web
[System.Web.Security.Membership]::GeneratePassword(10,2)
Метод GeneratePassword позволяется генерировать пароль длиной до 128 символов. Метод принимает на вход два параметра — длина пароля (в моем случае 10 символов) и минимальное количество не буквенно-цифровых спецсимволов, таких как !, -, $, &, @, #, % и т.д. (2 спецсимвола). Как вы видите, в моем случае был сгенерирован пароль
tm-qZl!uQv
согласно заданным аргументам.
_{!$.R%2*[
пользователю будет нереально.Таким образом при заведении новых пользователей с помощью командлета PowerShell New-ADUser с уникальным паролем можно использовать следующими командами:
Add-Type -AssemblyName System.Web
New-ADUser -Name "Anton Semenov" -GivenName "Semenov" -Surname "Anton" -SamAccountName "asemenov" -UserPrincipalName "[email protected]" -Path "OU=Users,OU=MSK,DC=winitpro,DC=ru" –AccountPassword ([System.Web.Security.Membership]::GeneratePassword(10,2)) -Enabled $true
Также вы можете использовать метод GeneratePassword при сбросе пароля пользователей Active Directory.
Если в вашей организации используются жесткие политики паролей, в некоторых случаях пароль, сгенерированный методом GeneratePassword может не соответствовать требованиям вашей доменной парольной политике . Перед тем, как назначить пароль пользователю вы можете проверить, что он соответствует политикам сложности пароля. Естественно, проверять его на длину и отсутствия логина пользователя в пароле смысла нет. Вы можете проверить, что сложность пароля соответствует как минимум 3 требованиям политики Password must meet complexity requirements (пароль должен содержать 3 типа символов из списка: цифры, символы в нижнем регистре, символы в верхнем регистре и спецсимволы). Если пароль не прошел проверку, нужно сгенерировать его еще раз.
У меня получилась такая PowerShell функция, которая генерирует новый пароль и проверяет его на соответствие требованиям сложности:
Function Generate-Complex-Domain-Password ([Parameter(Mandatory=$true)][int]$PassLenght)
{
Add-Type -AssemblyName System.Web
$requirementsPassed = $false
do {
$newPassword=[System.Web.Security.Membership]::GeneratePassword($PassLenght,1)
If ( ($newPassword -cmatch "[A-Z\p{Lu}\s]") `
-and ($newPassword -cmatch "[a-z\p{Ll}\s]") `
-and ($newPassword -match "[\d]") `
-and ($newPassword -match "[^\w]")
)
{
$requirementsPassed=$True
}
} While ($requirementsPassed -eq $false)
return $newPassword
}
Для генерации пароля из 4 символов с минимум одним спецсимволом выполните команду:
Generate-Complex-Domain-Password (4)
Данный скрипт на выходе всегда будет выдавать пароль, соответствующий критериям сложности домена.
За инструмент спасибо, но в текст нужно внести изменение: 2-й параметр определяет минимальное числ спец символов, а не максимальное. Об это прямо указано в документации.
Вы правы, минимальное число спецсимволов. Thnks за внимательность )
А я отказался от практики создания учёток с атрибутом “User must change password at next logon”.
Дело в том, что пару раз была такая ситуация, что пользователь каким-то образом (каким? не знаю!!!) умудрялся войти в систему не сменив пароль. В итоге имеем залогинившегося пользователя у которого ни черта не работает, т.к. учётка по факту заблокирована.
К сожалению ни разу своими глазами не наблюдал как такое происходит, но факт есть факт. Уровень AD 2012 R2 клиенты на Windows 7.
кэш не сетевого соединения с доменом
Чёрт его знает, по моему разумению не должно такого быть что бы пользователь смог залогиниться не сменив пароль. Соединение у тех машин с контроллерами домена стабильное было, т.к. в одной локалке. Даже если предположить, что машина потеряла соединение с DC, то она всё равно не должна была пускать этого пользователя т.к. он новый и в кэше машины не мог быть по определению. Т.е. тут на лицо какое-то чуднОе сочетание факторов и [скорее всего] действий пользователя.
Кэшинование доменных учёток впрочем я впоследствии тоже отключил. Но это вроде было уже после тех случаев (за давностью лет уже точно не упомню).
А как избавиться от спец. символов в пароле?
Не ставить второй параметр?
Не помогает.
Я однажды обнаружил на предприятии попытки взлома, и нужно было срочно всем в домене поменять пароли на более-менее безопасные.
Подумав, решил, что будет слишком напряжно народу придумывать новые пароли, но решил сделать это за них (потому что потом замучают своими забываниями, и беспокойством меня со сбросом их пароля). Так вот, чтобы их поменьше писали на стикерах на мониторах, нужно было, чтобы они были легко запоминаемыми. У меня они были читаемыми через генерацию в apg в linux (некоторые спецсимволы и похожие символы исключил):
apg -a 0 -n 10 -m 12 -x 12 -M SNCL -E ‘»1lIO0`^*()-_][{}?/\;=.,:+|’
Т.е.
— сделал выгрузку AD users samaccounts в csv
— сгенерировал пароли, скопипастил их в csv
— скриптом импортировал новые пароли, где автоматом высылался новый пароль на прописанный в csv email пользователя (с копией мне, админу).
Так вот, очень тогда не хватало мозгов придумать или найти нормальную рабочую функцию генерации нормальных читаемых паролей в powershell, с опцией исключений нужных символов (похожих и спецсимволов).
Может быть, вы с этой задачей справитесь?
Могу поделиться своим скриптом, если кому нужно.
Для наглядности, пароли получались вида:
6ShruQuapeb&
Hufoag!fluv3
!odAntUjyes4
LapJer5Hesh!
gigh7Ercyon&
bercocAt2ow@
Cayct5droyg#
9Grit7shnal#
AsEryank4or#
#ocBickyerm8
get-random -count 10 -input (48..57 + 65..90 + 97..122) | foreach-object -begin { $pass = $null } -process {$pass += [char]$_} -end {$pass}
вот Вам генерация нормальных паролей с длиной пароля равной count т.е. 10
Работает, но немного не понял что в input.
Думаю тут ответ на твой вопрос https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html
Пароли, конечно, хорошие и правильные — но высока вероятность того, что пользователи наклеят их на монитор или рядом где-то оставят — и их смысл потерян….
как можно использовать этот скрипт вместе с созданием локального пользователя?
New-LocalUser «adminlocal» -Password $Password -FullName «admin7»
$Password = Generate-Complex-Domain-Password (8)
$SecurePassword = ConvertTo-SecureString -AsPlainText -Force $Password
New-LocalUser -name User03 -Password $SecurePassword
Как добавить исключения некоторых букв и символов?
nomatch в скобках знаки для исключения.
$newPassword=[System.Web.Security.Membership]::GeneratePassword($PasswordLenght,1)
If ( ($newPassword -cmatch «[A-Z\p{Lu}\s]») `
-and ($newPassword -cmatch «[a-z\p{Ll}\s]») `
-and ($newPassword -match «[\d]») `
-and ($newPassword -match «[^\w]») `
-and ($newPassword -notmatch «[=/{}^|><\\;\,\[\]\-\.:*()_+]")
)