Команда net user некорректно отображает дату истечения срока действия пароля; скрипт, который читает поле и выводит, если срок его действия истек, неверен. Возможный обходной путь?

Хорошо, вот что у меня есть на данный момент:

@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

Команда net user некорректно отображает дату истечения срока действия пароля; скрипт, который читает поле и выводит, если срок его действия истек, неверен. Возможный обходной путь?

Немного фона, если хотите, иначе пропустите немного.

Я аналитик службы поддержки уровня 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

Вам нужно поговорить со своим администратором AD, чтобы выяснить, в чем заключается основная причина, если вы считаете, что срок действия пароля должен истечь через 90 дней. Вы уверены, что для этого пользователя нет политики, которая позволяла бы им пользоваться в этом году?

Squashman 24.10.2018 21:32

Вы уверены, что срок их действия истекает через 90 дней? Вы можете использовать Get-ADDefaultDomainPasswordPolicy в PowerShell, чтобы проверить политику «MaxPasswordAge» в вашем домене. Например, у нас «30.00: 00: 00», что означает 30 дней.

Gabriel Luci 24.10.2018 21:35

Или в AD Users and Computers на вкладке Attribute Editor для пользователя посмотрите на атрибут msDS-UserPasswordExpiryTimeComputed (убедитесь, что у вас включены атрибуты «Constructed» в меню кнопки «Filter»). Посмотрите, говорит ли он вам что-то другое.

Gabriel Luci 24.10.2018 21:39

Я точно знаю, что у нашей политики срок действия паролей истекает через 90 дней после установки, к сожалению, связаться с администратором AD, чтобы исправить это, не вариант, поскольку они просто скажут мне: «добавьте 90 дней к последней установленной дате и выясните это ". : / Я что-то пробовал, надеюсь, это привело меня в нужное место.

Mackenzie Williams 24.10.2018 21:58

Я бы отказался, если это обычная проблема. Это проблема AD. Не твоя проблема. Мне посчастливилось ладить со всеми главными администраторами, когда я работал в Networking. Если я не знал, как что-то делать, я спрашивал, и мне показывали, как это исправить.

Squashman 24.10.2018 22:06

Вам не кажется, что было бы намного проще правильно закодировать все это в виде сценария PowerShell, вместо того, чтобы пытаться поместить все это в один лайнер?

Squashman 24.10.2018 22:13

К сожалению, я не могу отказаться от этого. Моя компания передает свои услуги другой компании, поэтому я работаю в их среде удаленно из своих компаний, я мало общаюсь / контактирую с администраторами, поскольку я просто устраняю неполадки и отправляю заявки на более высокий уровень, когда не могу решить проблему. Что касается превращения этого в сценарий PowerShell, я, честно говоря, понятия не имею, с чего начать, так как это было частично передано предыдущим сотрудником с некоторыми небольшими изменениями, сделанными мной в результате поиска в Google. Думаю, я мог бы просто поискать, как это сделать, и посмотреть, смогу ли я достичь того же результата.

Mackenzie Williams 24.10.2018 22:25

Я был бы очень удивлен, если net user даст вам неправильные результаты. Действительно ли Get-ADDefaultDomainPasswordPolicy сообщает вам, что «MaxPasswordAge» равно «90.00: 00.00»?

Gabriel Luci 25.10.2018 14:39

Я ценю заботу Габриэля. Я могу с уверенностью сказать, что наша политика паролей составляет 90 дней для рассматриваемой среды, поскольку эта информация была предоставлена, и я наблюдал ее из первых рук. Мне не удалось заставить Get-ADDefaultDomainPasswordPolicy работать в PowerShell или CMD, поэтому я не совсем уверен, где его ввести.

Mackenzie Williams 25.10.2018 18:50

Это для PowerShell, но, возможно, у вас не установлен модуль ActiveDirectory. Вы также можете проверить это, открыв AD Users and Computers, щелкните правой кнопкой мыши корень домена -> Свойства -> вкладка Attribute Editor и проверьте значение maxPwdAge.

Gabriel Luci 25.10.2018 19:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
1 515
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Да, вы можете попробовать поискать по LDAP.

$Searcher=New-Object DirectoryServices.DirectorySearcher
$Searcher.Filter = "(&(samaccountname=username))"
$Results=$Searcher.findone()
$Results.Properties

предоставит вам много информации, и последний установленный пароль является одним из них.

Я бы посоветовал вам передать группе поддержки сценарий PowerShell вместо пакетного файла.

net user просто извлекает те же данные.
Gabriel Luci 24.10.2018 21:36

Я ценю информацию, так как это потребует, чтобы я полностью переписал то, что у меня есть, и я уже потратил на это много времени, я оставлю это открытым в качестве резервного варианта для дальнейшего поиска.

Mackenzie Williams 24.10.2018 22:04

Вы также можете сократить это: $s = [adsisearcher]'(&(samaccountname=username))'

Maximilian Burszley 24.10.2018 22:39
Ответ принят как подходящий

Если вы хотите получить срок действия пароля для пользователя, вы можете преобразовать атрибут 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 дней?

Mackenzie Williams 24.10.2018 22:27

@MackenzieWilliams Я обновил решение, чтобы уточнить детали

jrider 24.10.2018 22:35

Спасибо! Большое спасибо. У меня нет возможности работать с тем, что у меня есть, но я считаю, что это то, чего мне не хватало. : D Еще раз огромное вам спасибо!

Mackenzie Williams 24.10.2018 23:20

@MackenzieWilliams Рад помочь. Если это помогло решить вашу проблему, отметьте это как ответ

jrider 24.10.2018 23:33

Сделаю! Я собираюсь подождать, пока я не смогу заставить его работать с остальной частью того, что у меня есть, чтобы я мог опубликовать результат, по крайней мере, если это приемлемо.

Mackenzie Williams 24.10.2018 23:47

@MackenzieWilliams звучит хорошо. Сообщите мне, если у вас возникнут дополнительные проблемы.

jrider 25.10.2018 15:07

Это то, что у меня получилось, и оно отлично работает в той среде, в которой я нуждаюсь.

Mackenzie Williams 25.10.2018 17:11

Другие вопросы по теме