Есть ли способ в bginfo показывать количество дней до изменения пароля пользователя A.D.?
Например, вы должны сменить пароль через 10 дней.
Пароль A.D необходимо сбрасывать каждые 2 месяца или 60 дней.
BGInfo поддерживает следующее для определения пользовательских переменных:
Первое, что приходит в голову, это сначала определить сценарий входа в систему для пользователя. Что-то, что находит срок годности и затем записывает его в файл на локальном компьютере:
$Searcher = New-Object System.DirectoryServices.DirectorySearcher
$Searcher.Filter = "(sAMAccountName=$($Env:USERNAME))"
$Searcher.SearchRoot = "LDAP://$Env:USERDNSDOMAIN"
$Searcher.SearchScope = 'Subtree'
$ADAccount = $Searcher.FindAll()
$PwdLastSet = [DateTime]::FromFileTime($ADAccount.Properties.pwdlastset[0])
$PwdAge = (New-TimeSpan $PwdLastSet (Get-Date)).TotalDays
$NextPwdChange = 60 - $PwdAge
[Math]::Round($NextPwdChange, 0) | Out-File (Join-Path $Env:USERPROFILE 'pwdage.txt')
Это позволит выяснить, когда в последний раз был изменен пароль пользователя, рассчитать, сколько ему лет, и запишет разницу с 60 дней в текстовый файл в папке профиля пользователя. Поэтому, если я изменил свой пароль 30 дней назад, в текстовом файле было бы записано «30», потому что у меня есть 30 дней до следующей смены пароля.
Затем вы можете заставить BGInfo использовать содержимое этого текстового файла.
Спасибо за отличный сценарий PowerShell. Мне пришлось изменить одну вещь (кодировку с txt с utf на ascii), потому что BGInfo не может отображать файлы UTF TXT.
$Searcher = New-Object System.DirectoryServices.DirectorySearcher
$Searcher.Filter = "(sAMAccountName=$($Env:USERNAME))"
$Searcher.SearchRoot = "LDAP://$Env:USERDNSDOMAIN"
$Searcher.SearchScope = 'Subtree'
$ADAccount = $Searcher.FindAll()
$PwdLastSet = [DateTime]::FromFileTime($ADAccount.Properties.pwdlastset[0])
$PwdAge = (New-TimeSpan $PwdLastSet (Get-Date)).TotalDays
$NextPwdChange = 60 - $PwdAge
[Math]::Round($NextPwdChange, 0) | Out-File -encoding {ascii} (Join-Path $Env:USERPROFILE 'pwdage.txt' )
Я просто хотел выбросить небольшую модификацию предлагаемого скрипта Powershell на основе мсДС-UserPasswordExpiryTimeComputed свойство. Он имеет то преимущество, что автоматически дает вам точную дату / время, когда истечет срок действия пароля данного пользователя, даже с учетом таких вещей, как детализированные политики паролей, если вы их используете. Таким образом, нет необходимости жестко кодировать какие-либо известные значения для существующей политики паролей, и если вы когда-нибудь измените свою политику, вам не нужно обновлять скрипт.
$Searcher = [adsisearcher]"(&(sAMAccountName=$($Env:USERNAME))(sAMAccountType=805306368))"
$Searcher.PropertiesToLoad.Add("msDS-UserPasswordExpiryTimeComputed")
$ADAccount = $Searcher.FindOne()
$PwdExp = [DateTime]::FromFileTime($me.Properties.'msds-userpasswordexpirytimecomputed'[0])
$NextPwdChange = [Math]::Round(($PwdExp - (Get-Date)).TotalDays)
$NextPwdChange | Out-File -encoding {ascii} (Join-Path $Env:USERPROFILE 'pwdage.txt' )
Ваша идея хороша, но сценарий выдает ошибку.
Я также сделал новый скрипт, который отображает дату истечения срока в формате ДД: ММ: ГГГГ ЧЧ: ММ. Вам нужно только изменить максимальный срок действия пароля. Если у вас есть пользователи, которые не выходят из системы в конце дня, BGInfo продолжает отображать одни и те же дни до истечения срока действия пароля, что приводит к неверному значению. Мы реализовали следующий скрипт:
$Searcher = New-Object System.DirectoryServices.DirectorySearcher
$Searcher.Filter = "(sAMAccountName=$($Env:USERNAME))"
$Searcher.SearchRoot = "LDAP://$Env:USERDNSDOMAIN"
$Searcher.SearchScope = 'Subtree'
$ADAccount = $Searcher.FindAll()
$PwdLastSet = [datetime]::FromFileTime($ADAccount.Properties.pwdlastset[0])
$PwdExpire =$PwdLastSet.AddDays(60)
$PwdExpire = $PwdExpire.ToShortDateString() + " " + $PwdExpire.ToShortTimeString()
$PwdAge = (New-TimeSpan $PwdLastSet (Get-Date))
$NextPwdChange = $PwdAge
$PwdExpire | Out-File -encoding {ascii} (Join-Path $Env:USERPROFILE 'pwdage.txt' )
Также важно создать 2 политики (1 для BGInfo и 1 для PS-Script), потому что в противном случае PS-Script будет слишком долго создавать .txt-файл, и BGInfo не сможет отобразить значение на рабочем столе. Кроме того, установите параметр: «Сначала запускать PS-скрипты» в Политике. У нас это сработало.