В Active Directory есть параметр, который заставляет пользователя изменить свой пароль при следующем входе в систему - он отображается в апплете «Пользователи и компьютеры AD», когда пользователь щелкает правой кнопкой мыши, выбирает «Свойства», затем «Учетная запись» ... самый первый флажок в поле " Список параметров учетной записи помечен как «Пользователь должен сменить пароль при следующем входе в систему».
Это не совсем то, что мне нужно. Мне было поручено найти способ гарантировать, что новые пользователи AD будут вынуждены изменить свой пароль при первом входе в систему (например, при самом первом входе в систему). Есть такая политика? В идеале мне нужно что-то, что работает с доменами Server 2003 и выше.
На самом деле, это не вся история ... если такая политика существует, мне нужно написать сценарий, который проверяет что именно так настроена политика (то есть убедитесь, что все новые пользователи воля должны пройти процесс смены паролей).
JDS: Это сценарий, которым я закончил. Вы можете погуглить некоторые магические числа - я забыл подробности. Несмотря на то, что это PowerShell, его довольно легко перевести на что-то другое. (Простите за форматирование, что-тос ним проблемы):
function Get-PwdLastSetValuesOfNeverLoggedInButEnabledAccounts () {$ root = [ADSI] ""
# Search criteria: Enabled accounts that have never logged in
$search = [ADSISearcher]$root
$search.Filter = "(&(objectclass=user)(objectcategory=user)" + `
"(!(useraccountcontrol:1.2.840.113556.1.4.803:=2))" + `
"(logoncount:=0)" + `
")"
$search.SizeLimit = 1500
$dictionary = New-Object 'System.Collections.Generic.Dictionary[System.String, System.Int64]'
try
{
$results = $search.FindAll()
}
catch [System.Exception]
{
# Ignore (allow) "The specified domain either does not exist or could not be contacted"
# (the machine is not on a domain at all)
if ( $_.Exception.HResult -ne 0x8007054B )
{
$dictionary.Add( "ExceptionWasThrown", -1 )
}
return $dictionary
}
foreach ( $result in $results )
{
Write-Host "User $($result.Properties[ "name" ]): $($result.Properties[ "pwdlastset" ][ 0 ])"
if ( $result.Properties[ "pwdlastset" ] -ne 0 )
{
# Ignore admin accounts ending with "$"
if ( $result.Properties[ "name" ][ 0 ].EndsWith( "$" ) ) { continue; }
$dictionary.Add( $result.Properties[ "name" ], $result.Properties[ "pwdlastset" ][ 0 ] )
}
}
return $dictionary
}
$ dictionary = Get-PwdLastSetValuesOfNeverLoggedInButEnabledAccounts
Здесь запрашивается технический контроль безопасности, где в настоящее время существует только административный контроль безопасности - техническое обеспечение существующей политики, которая сообщает администраторам, что при создании новых пользователей необходимо установить флажок изменить пароль при следующем входе в систему.
Это можно сделать с помощью специальной библиотеки DLL фильтра паролей для AD. Фильтр паролей получает уведомление об изменении пароля пользователя и может оттуда предпринять любые действия. Обычно это используется для приложений синхронизации паролей (например, для синхронизации паролей AD с Google Apps).
В этом случае действие будет чем-то вроде определения возраста учетной записи пользователя, если менее X минут, тогда проверьте флаг изменения пароля в учетной записи пользователя, если не установлен, установите флаг в учетной записи, тем самым удалив возможность администраторов не устанавливать этот флаг намеренно или иначе.
Пользовательские фильтры паролей описан в MSDN, и есть существующая DLL называется Password Hook это уже делает самую сложную часть того, что вам нужно - обнаруживает изменение пароля и запускает программу / скрипт, указанную в разделе реестра.