2016-11-16 3 views
0

Я использую UserPrincipal для сбора сведений о локальных пользователях на серверах-членах, не являющихся доменами. Я хочу отправлять пользователям сообщения, когда их пароли истекают или истекли.POWERSHELL: Получить пароль с датой использования UserPrincipal

У меня есть все, кроме Max Password Age. Я не могу получить эту ценность, и все, что я нахожу, говорит о подключениях Active Directory, которые мне не нужны. Когда я пытаюсь адаптировать его к локальному серверу, он не работает.

Вот что у меня есть:

$date = Get-Date 
$contextType = [System.DirectoryServices.AccountManagement.ContextType]::Machine 
$principalContext = New-Object System.DirectoryServices.AccountManagement.PrincipalContext($contextType) 
$principalSearcher = New-Object System.DirectoryServices.AccountManagement.PrincipalSearcher(New-Object System.DirectoryServices.AccountManagement.UserPrincipal($principalContext)) 

ForEach($userPrincipal in $principalSearcher.FindAll()) 
{ 
    $maxPasswordAge = 90 

    $name = $userPrincipal.Name 
    $samAccountName = $userPrincipal.SamAccountName 
    $description = $userPrincipal.Description 
    $fullname = $userPrincipal.DisplayName 
    $lastPasswordSet = $userPrincipal.LastPasswordSet 
    $passwordExpires = $lastPasswordSet.AddDays($maxPasswordAge) 
    $passwordExpiresDays = New-TimeSpan -Start $date -End $passwordExpires 
    $passwordExpiresDays = [Math]::Floor($passwordExpiresDays.TotalDays) 

    Write-Host "Name: "$name 
    Write-Host "SAM Account Name: "$samAccountName 
    Write-Host "Full Name: "$fullName 
    Write-Host "Password last set: "$lastPasswordSet 
    Write-Host "Password expires: "$passwordExpiresDays 
    Write-Host "Max Password Age: "$maxPasswordAge 
} 

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

Я попытался следующий, чтобы извлечь объект DirectoryEntry из моего UserPrincipal, а затем собственный объект, но я не могу заставить его работать:

$directoryEntry = $userPrincipal.GetUnderlyingObject() 
$native = [ADSI]$directoryEntry.NativeObject 

Я уверен, что его легко, и я проглядел что-то очевидное ....

ответ

0

Вероятно, вы не получите значение по истечении срока действия пароля для локальных учетных записей пользователей по умолчанию.

Вам нужно будет вручную включить Maximum password age в локальной политике безопасности компьютеров.


EDIT: Вы можете прочитать значение локальной политики безопасности настройки из реестра:

$maxPasswordAge = (Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters -Name MaximumPasswordAge).MaximumPasswordAge 
+0

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

+0

см. Обновление для ответа –

+0

Это похоже на работу, просто тестирование и возвращение к вам. Благодарю. – neildeadman

Смежные вопросы