У меня есть требование сравнить поле pwdLastSet из Active Directory с текущей датой, и если эта разница дат является настраиваемым числом (фиксируется клиентом), нам нужно инициировать электронное письмо, в котором срок действия пароля истекает. Это сравнение дат также необходимо выполнить с LastLoginTimeStamp в Active Directory для отправки электронных писем. Что было бы лучшим способом для сравнения этих полей, поскольку pwdLastSet является длинным целым числом, и его использование фильтра DirectorySearcher для сравнения с текущей датой будет невозможно.
Необходимо сравнить pwdLastSet в Active Directory с текущей датой и проверить, не истечет ли срок действия пароля. Как лучше всего это сделать?
Ответы (3)
Чтобы получить дату и время из pwdLastSet:
SearchResult sr = ds.FindOne();
hacked = DateTime.FromFileTime((long)sr.Properties["pwdLastSet"][0]);
См. раздел приведение свойства ActiveDirectory pwdLastSet без использования ActiveDs и проверка интервала времени
Чтобы узнать, когда истечет срок действия pawword
Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} –Properties “DisplayName”, “msDS-UserPasswordExpiryTimeComputed” |
Select-Object -Property “Displayname”,@{Name=“ExpiryDate”;Expression={[datetime]::FromFileTime($_.“msDS-UserPasswordExpiryTimeComputed”)}} | export-csv -path c:\paswsword-expiring.csv
Посмотреть, когда последний раз был установлен пароль
Get-ADUser -filter * -properties Displayname,PasswordLastSet | select displayname,passwordlastset |Format-List
настроить оповещение по электронной почте
http://www.powershelladmin.com/wiki/Active_directory_password_expiration_notification
Вы можете получить дату последнего набора пароля пользователя каталога в типе DateTime
, используя свойство LastPasswordSet
, допускающее значение NULL, класса UserPrincipal
из пространства имен System.DirectoryServices.AccountManagement
.
Если отмечена опция User must change password at next logon
, то свойство LastPasswordSet
возвращает значение null
. В противном случае он возвращает последнюю дату и время, когда пароль был установлен в типе DateTime
. Затем вы можете сравнить даты с DateTime.Compare
mathod.
using(PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, Username);
//? - to mark DateTime type as nullable
DateTime? pwdLastSet = (DateTime?)user.LastPasswordSet;
int delta = 7;
if (pwdLastSet != null)
{
if (DateTime.Compare((DateTime)pwdLastSet, DateTime.Now) < delta)
{
//send email
...
}
}
}
MSDN: UserPrincipal
MSDN: LastPasswordSet