Хорошо, вот что у меня есть на данный момент:
@echo off
powershell "$uid=(Read-Host -Prompt 'Enter UserID');$u = (net user $uid /domain);$u;$lockout=($u | select-string -pattern 'Account active.*Locked');$expired=((get-date ([String]($u | select-string 'Password expires')).Substring(16).Trim()) -lt (get-date));if ($lockout) { Write-Host 'Account locked out' -Foreground 'Red' } else { Write-Host 'Account not locked out' -Foreground 'Green' } if ($expired) { Write-Host 'Password Expired' -Foreground 'Red' } else { Write-Host 'Password not expired' -foreground 'Green' }"
pause
Немного фона, если хотите, иначе пропустите немного.
Я аналитик службы поддержки уровня 1, мои пользователи будут звонить и сообщать, что, по их мнению, их пароль просрочен или учетная запись заблокирована. Я занимаюсь этим некоторое время, поэтому для меня не проблема найти их учетную запись в активном каталоге. Я часть специальной команды, то есть мы обслуживаем только 1 клиента. У нас есть так называемые группы кредитного плеча, которые принимают звонки, когда выделенный сотрудник занят. Я делаю это, чтобы помочь ребятам, использующим рычаги, было легче, поскольку у них не всегда загружен ресурс AD.
Если вас не интересует предыстория, перейдите сюда:
Проблема, с которой я сталкиваюсь, заключается в том, что наш активный каталог неправильно отображает дату истечения срока действия пароля при выполнении "net user% username% / domain". Он отображается как 1 год от последнего установленного поля пароля, тогда как должно быть 90 дней с последней установленной даты. Делать часть моего командного файла, которая выводит, если срок его действия истек, всегда некорректна.
Могу ли я взять поле последнего установленного пароля, добавить 90 дней и получить дату истечения срока действия пароля? Или сравнить эту дату с текущей датой и определить, прошло ли она уже? Может, год вычесть и добавить в поле срока действия пароля 90 дней? Все это очень чуждо мне, поскольку я собрал большую часть этого из результатов поиска Google, этого сайта, Reddit и некоторых коллег, которые здесь работают. Так что я открыт для предложений.
Я очень признателен за любую помощь, которую вы можете предоставить, и, если это неподходящее место для этого, приношу свои извинения.
Edit1: Итак, я что-то попробовал и изменил строку;
Я изменил:
$expired=((get-date ([String]($u | select-string 'Password expires')).Substring(16).Trim()) -lt (get-date))
к
$expired=((get-date ([String]($u | select-string 'Password last set')).Substring(16).Trim()) -lt (get-date).AddDays(30))
но теперь я получаю ошибку.
Get-Date : Cannot bind parameter 'Date'. Cannot convert value "t 10/18/2018 8:13:05 AM" to type
"System.DateTime". Error: "The string was not recognized as a valid DateTime. There is an unknown word starting at
index 0."
At line:1 char:156
+ ... =((get-date ([String]($u | select-string 'Password last set')).Substr ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-Date], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetDateCommand
Это то, что у меня получилось, и оно отлично работает в той среде, в которой я нуждаюсь.
@echo off
powershell "$uid=(Read-Host -Prompt 'Enter UserID');$u = (net user $uid /domain);$u;$lockout=($u | select-string -pattern 'Account active.*Locked');$expiredate=get-date ([String]($u | select-string 'Password expires')).Substring(16).Trim();$expired=$expiredate.AddDays(-275) -lt (get-date);if ($lockout) { Write-Host 'Account locked out' -Foreground 'Red' } else { Write-Host 'Account not locked out' -Foreground 'Green' } if ($expired) { Write-Host 'Password Expired' -Foreground 'Red' } else { Write-Host 'Password not expired' -foreground 'Green' }"
pause
Вы уверены, что срок их действия истекает через 90 дней? Вы можете использовать Get-ADDefaultDomainPasswordPolicy
в PowerShell, чтобы проверить политику «MaxPasswordAge» в вашем домене. Например, у нас «30.00: 00: 00», что означает 30 дней.
Или в AD Users and Computers на вкладке Attribute Editor для пользователя посмотрите на атрибут msDS-UserPasswordExpiryTimeComputed
(убедитесь, что у вас включены атрибуты «Constructed» в меню кнопки «Filter»). Посмотрите, говорит ли он вам что-то другое.
Я точно знаю, что у нашей политики срок действия паролей истекает через 90 дней после установки, к сожалению, связаться с администратором AD, чтобы исправить это, не вариант, поскольку они просто скажут мне: «добавьте 90 дней к последней установленной дате и выясните это ". : / Я что-то пробовал, надеюсь, это привело меня в нужное место.
Я бы отказался, если это обычная проблема. Это проблема AD. Не твоя проблема. Мне посчастливилось ладить со всеми главными администраторами, когда я работал в Networking. Если я не знал, как что-то делать, я спрашивал, и мне показывали, как это исправить.
Вам не кажется, что было бы намного проще правильно закодировать все это в виде сценария PowerShell, вместо того, чтобы пытаться поместить все это в один лайнер?
К сожалению, я не могу отказаться от этого. Моя компания передает свои услуги другой компании, поэтому я работаю в их среде удаленно из своих компаний, я мало общаюсь / контактирую с администраторами, поскольку я просто устраняю неполадки и отправляю заявки на более высокий уровень, когда не могу решить проблему. Что касается превращения этого в сценарий PowerShell, я, честно говоря, понятия не имею, с чего начать, так как это было частично передано предыдущим сотрудником с некоторыми небольшими изменениями, сделанными мной в результате поиска в Google. Думаю, я мог бы просто поискать, как это сделать, и посмотреть, смогу ли я достичь того же результата.
Я был бы очень удивлен, если net user
даст вам неправильные результаты. Действительно ли Get-ADDefaultDomainPasswordPolicy
сообщает вам, что «MaxPasswordAge» равно «90.00: 00.00»?
Я ценю заботу Габриэля. Я могу с уверенностью сказать, что наша политика паролей составляет 90 дней для рассматриваемой среды, поскольку эта информация была предоставлена, и я наблюдал ее из первых рук. Мне не удалось заставить Get-ADDefaultDomainPasswordPolicy
работать в PowerShell или CMD, поэтому я не совсем уверен, где его ввести.
Это для PowerShell, но, возможно, у вас не установлен модуль ActiveDirectory. Вы также можете проверить это, открыв AD Users and Computers, щелкните правой кнопкой мыши корень домена -> Свойства -> вкладка Attribute Editor и проверьте значение maxPwdAge
.
Да, вы можете попробовать поискать по LDAP.
$Searcher=New-Object DirectoryServices.DirectorySearcher
$Searcher.Filter = "(&(samaccountname=username))"
$Results=$Searcher.findone()
$Results.Properties
предоставит вам много информации, и последний установленный пароль является одним из них.
Я бы посоветовал вам передать группе поддержки сценарий PowerShell вместо пакетного файла.
net user
просто извлекает те же данные.
Я ценю информацию, так как это потребует, чтобы я полностью переписал то, что у меня есть, и я уже потратил на это много времени, я оставлю это открытым в качестве резервного варианта для дальнейшего поиска.
Вы также можете сократить это: $s = [adsisearcher]'(&(samaccountname=username))'
Если вы хотите получить срок действия пароля для пользователя, вы можете преобразовать атрибут msDS-UserPasswordExpiryTimeComputed
в DateTime
.
Ниже я собрал пример, чтобы уточнить детали. Имена переменных должны быть понятными. Если вы запустите пример, вы заметите, что атрибут msDS-UserPasswordExpiryTimeComputed
должен указывать необходимую дату истечения срока действия. Однако другие варианты (добавление 90 дней) включены в пример.
Пример (обновлено):
[string]$Identity = "User Account"
$expiredDate = [DateTime]::FromFileTime($((Get-ADUser -Identity $Identity -Properties 'msDS-UserPasswordExpiryTimeComputed').'msDS-UserPasswordExpiryTimeComputed'))
$lastSetDate = [DateTime]::FromFileTime($((Get-ADUser -Identity $Identity -Properties 'pwdLastSet').'pwdLastSet'))
Write-Host "Exipred Date: " $expiredDate
Write-Host "Last Set Date: " $lastSetDate
$lastDate_Plus90 = $lastSetDate.AddDays(90)
Write-Host "Last Set + 90 days: " $lastDate_Plus90
Могу ли я использовать это, чтобы вытащить последнюю установленную дату пароля, а затем добавить 90 дней?
@MackenzieWilliams Я обновил решение, чтобы уточнить детали
Спасибо! Большое спасибо. У меня нет возможности работать с тем, что у меня есть, но я считаю, что это то, чего мне не хватало. : D Еще раз огромное вам спасибо!
@MackenzieWilliams Рад помочь. Если это помогло решить вашу проблему, отметьте это как ответ
Сделаю! Я собираюсь подождать, пока я не смогу заставить его работать с остальной частью того, что у меня есть, чтобы я мог опубликовать результат, по крайней мере, если это приемлемо.
@MackenzieWilliams звучит хорошо. Сообщите мне, если у вас возникнут дополнительные проблемы.
Это то, что у меня получилось, и оно отлично работает в той среде, в которой я нуждаюсь.
Вам нужно поговорить со своим администратором AD, чтобы выяснить, в чем заключается основная причина, если вы считаете, что срок действия пароля должен истечь через 90 дней. Вы уверены, что для этого пользователя нет политики, которая позволяла бы им пользоваться в этом году?