Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

Active Directory 사용자 암호 만료일 확인 및 암호 변경 알림 설정 방법

이 글에서는 PowerShell을 사용해 Active Directory(AD) 사용자 계정의 암호 만료일을 확인하는 방법, 암호를 무기한으로 설정하는 방법(PasswordNeverExpires = True), 그리고 사용자에게 미리 암호 변경을 알리는 방법을 소개합니다.

도메인에서 사용자 암호가 만료되면 계정 자체는 잠기지 않지만, 사용자가 만료된 암호를 새 암호로 변경하기 전까지는 도메인 리소스에 접근할 수 없습니다. 특히 원격 근무 사용자들은 표준 도구로 암호를 변경할 수 없어 만료 문제를 자주 겪습니다.

도메인의 암호 유효 기간(최대 암호 사용 기간)과 복잡성 요구 사항은 AD 도메인 암호 정책에서 설정합니다. 이러한 값은 기본 도메인 정책(Default Domain Policy) 또는 세분화된 암호 정책(Fine-Grained Password Policy)에서 지정할 수 있습니다.

다음 PowerShell 명령으로 도메인의 현재 암호 만료 정책 설정을 확인할 수 있습니다:

Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge

예시 환경에서는 도메인의 최대 암호 사용 기간이 60일입니다.

Active Directory 사용자 암호 만료일 확인 및 암호 변경 알림 설정 방법

Active Directory에서 사용자 암호 만료일 확인하는 방법

명령 프롬프트에서 Net user 명령으로 암호 사용 기간과 마지막 변경 날짜를 확인할 수 있습니다:

net user jsmith /domain

Active Directory 사용자 암호 만료일 확인 및 암호 변경 알림 설정 방법

다음 항목에서 필요한 정보를 찾을 수 있습니다:

  • Password last set — 2020-09-09 오전 9:23:59
  • Password expires — 2021-01-07 오전 9:23:59
  • Password changeable — 2020-09-10 오전 9:23:59

모든 사용자의 암호 만료일을 조회할 수 있으며, 이를 위해 관리자 권한이나 사용자 계정 컨테이너에 대한 위임 권한은 필요하지 않습니다.

AD 계정 설정을 확인하려면 다양한 AD 개체 속성 값을 가져올 수 있는 전용 PowerShell 모듈(Active Directory 모듈)을 사용합니다. Windows 10 및 Windows Server 2012 R2/2016에 AD PowerShell 모듈을 설치하고 가져오는 방법은 별도 문서를 참고하세요.

Get-ADUser cmdlet을 사용하면 사용자 암호가 마지막으로 변경된 날짜와 PasswordNeverExpires 옵션 설정 여부를 확인할 수 있습니다:

get-aduser jsmith -properties PasswordLastSet, PasswordNeverExpires, PasswordExpired |ft Name, PasswordLastSet, PasswordNeverExpires,PasswordExpired

Active Directory 사용자 암호 만료일 확인 및 암호 변경 알림 설정 방법

  • PasswordLastSet: 마지막 암호 변경 날짜 및 시간
  • PasswordNeverExpires: 암호가 무기한이면 True 반환
  • PasswordExpired: 암호가 만료되었으면 True, 만료되지 않았으면 False 반환

그래픽 MMC 스냅인인 Active Directory 사용자 및 컴퓨터(dsa.msc)에서도 마지막 암호 변경 시간을 확인할 수 있습니다. 사용자 속성을 연 후 [특성 편집기(Attribute Editor)] 탭에서 pwdLastSet 특성 값을 확인하면 됩니다.

하지만 MMC 스냅인에는 암호가 변경된 시간만 표시될 뿐, 암호가 언제 만료되는지는 바로 알 수 없습니다.

Active Directory 사용자 암호 만료일 확인 및 암호 변경 알림 설정 방법

마지막 변경 시간 대신 암호 만료일을 가져오려면 특수한 생성(construced) AD 특성인 msDS-UserPasswordExpiryTimeComputed를 사용합니다. 이 값은 마지막 암호 변경 날짜와 도메인 암호 정책을 기반으로 자동 계산됩니다.

UserPasswordExpiryTimeComputed 매개 변수는 TimeStamp 형식으로 날짜를 반환하므로, FromFileTime 함수를 사용해 사람이 읽을 수 있는 값으로 변환합니다:

Get-ADUser -Identity jsmith -Properties msDS-UserPasswordExpiryTimeComputed | select-object @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed") }}

이렇게 하면 사용자 암호 만료일을 얻을 수 있습니다.

Active Directory 사용자 암호 만료일 확인 및 암호 변경 알림 설정 방법

msDS-UserPasswordExpiryTimeComputed 값이 0이면 pwdLastSet이 비어 있거나(null) 0인 경우, 즉 암호가 한 번도 변경되지 않았음을 의미합니다.

AD의 특정 컨테이너(OU)에 있는 모든 사용자의 암호 만료일을 가져오려면 다음 PowerShell 스크립트를 사용할 수 있습니다:

$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=woshub,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, PasswordLastSet, CannotChangePassword
$Users | select Name, @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime ($_."msDS-UserPasswordExpiryTimeComputed")}}, PasswordLastSet

실행 결과로 활성 사용자 목록과 각 사용자의 암호 만료일, 마지막 암호 변경 시간이 담긴 표가 출력됩니다.

Active Directory 사용자 암호 만료일 확인 및 암호 변경 알림 설정 방법

암호가 이미 만료된 사용자만 표시할 수도 있습니다:

$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=woshub,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, PasswordLastSet, CannotChangePassword
foreach($user in $Users){
if( [datetime]::FromFileTime($user."msDS-UserPasswordExpiryTimeComputed") -lt (Get-Date)) {
$user.Name
}
}

AD 사용자 암호를 무기한으로 설정하는 방법

계정에 영구 암호를 설정하려면 AD 사용자 속성에서 암호 만료 없음(Password Never Expires) 옵션을 체크합니다. 이 옵션은 UserAccountControl 특성의 비트 값 중 하나입니다.

Active Directory 사용자 암호 만료일 확인 및 암호 변경 알림 설정 방법

또는 PowerShell로 사용자 특성을 설정해 이 옵션을 활성화할 수 있습니다:

Get-ADUser jsmith | Set-ADUser -PasswordNeverExpires:$True

텍스트 파일의 목록에 있는 여러 사용자에게 한 번에 적용할 수도 있습니다:

$users=Get-Content "C:\PS\users_password_never_expire.txt"
Foreach ($user in $users) {
Set-ADUser $user -PasswordNeverExpires:$True
}

일반 암호 변경 옵션이 비활성화된 모든 사용자 목록을 표시하려면 다음 명령을 사용합니다:

Get-ADUser -filter * -properties Name, PasswordNeverExpires | where {$_.passwordNeverExpires -eq "true" } | Select-Object DistinguishedName,Name,Enabled |ft

Active Directory 암호 만료 알림 정책

Windows에는 사용자에게 암호 변경이 필요함을 알리는 전용 그룹 정책 매개 변수가 있습니다.

정책 이름은 대화형 로그온: 암호가 만료되기 전에 사용자에게 변경을 요구(Interactive logon: Prompt user to change password before expiration)이며, GPO의 Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Local Policies -> Security Options 섹션에 위치합니다.

기본적으로 로컬 Windows 설정에서 이 정책은 활성화되어 있으며, 암호 만료 5일 전부터 알림이 나타나기 시작합니다. 사용자에게 암호 변경 알림이 표시되는 일수는 조정할 수 있습니다.

Active Directory 사용자 암호 만료일 확인 및 암호 변경 알림 설정 방법

이 정책을 활성화하면 사용자 암호가 곧 만료될 경우 로그온할 때마다 트레이에 암호 변경 알림이 표시됩니다.

Consider changing your password
Your password will expire in xx days.

Active Directory 사용자 암호 만료일 확인 및 암호 변경 알림 설정 방법

또한 암호 만료가 5일 미만으로 남았을 때 자동으로 암호 변경 안내 대화 상자를 표시하는 간단한 PowerShell 스크립트를 사용할 수도 있습니다:

Add-Type -AssemblyName PresentationFramework
$curruser= Get-ADUser -Identity $env:username -Properties 'msDS-UserPasswordExpiryTimeComputed','PasswordNeverExpires'
if ( -not $curruser.'PasswordNeverExpires') {
$timediff=(new-timespan -start (get-date) -end ([datetime]::FromFileTime($curruser."msDS-UserPasswordExpiryTimeComputed"))).Days
if ($timediff -lt 5) {
$msgBoxInput = [System.Windows.MessageBox]::Show("Your password expires in "+ $timediff + " days!`nDo you want to change it now?","Important!","YesNo","Warning")
switch ($msgBoxInput) {
'Yes' {
cmd /c "explorer shell:::{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}"
}
'No' { }
}
}
}

사용자가 [예(YES)]를 클릭하면 Ctrl+Alt+Del(RDP/RDS 연결인 경우 Ctrl+Alt+End)을 눌렀을 때 나타나는 Windows 보안 화면이 열립니다.

Active Directory 사용자 암호 만료일 확인 및 암호 변경 알림 설정 방법

이 스크립트는 사용자 컴퓨터에 PowerShell용 AD 모듈이 설치되어 있다고 가정합니다. RSAT가 설치되지 않은 환경에서도 사용할 수 있으며, 관련 내용은 "RSAT 설치 없이 AD 모듈 사용" 문서를 참고하세요.

PS 스크립트의 자동 시작을 활성화하거나 GPO 로그온 스크립트로 실행하면 됩니다.

PowerShell을 이용한 암호 만료 이메일 알림

사용자에게 암호 만료를 이메일로 알리고 싶다면 다음 PowerShell 스크립트를 사용할 수 있습니다:

$Sender = "info@woshub.com"
$Subject = 'Important! Your password expires soon!'
$BodyTxt1 = 'Your password for'
$BodyTxt2 = 'expires in '
$BodyTxt3 = 'days. Remember to change your password in advance. If you have other questions, contact the HelpDesk.'
$smtpserver ="smtp.woshub.com"
$warnDays = (get-date).adddays(7)
$2Day = get-date
$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=woshub,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, EmailAddress, Name | select Name, @{Name ="ExpirationDate";Expression= {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}, EmailAddress
foreach ($user in $users) {
if (($user.ExpirationDate -lt $warnDays) -and ($2Day -lt $user.ExpirationDate) ) {
$lastdays = ( $user.ExpirationDate -$2Day).days
$EmailBody = $BodyTxt1, $user.name, $BodyTxt2, $lastdays, $BodyTxt3 -join ' '
Send-MailMessage -To $user.EmailAddress -From $Sender -SmtpServer $smtpserver -Subject $Subject -Body $EmailBody
}
}

이 스크립트는 암호가 곧 만료될 예정인 모든 활성 도메인 사용자를 검사합니다. 암호 만료 7일 전부터 AD에 등록된 이메일 주소로 알림 메일이 발송되며, 암호가 변경되거나 실제로 만료될 때까지 계속 발송됩니다.

관리자는 Set-ADAccountPassword cmdlet을 사용해 사용자 암호 변경을 강제할 수도 있습니다.

이 PowerShell 스크립트를 도메인 내 임의의 컴퓨터/서버에서 정기적으로 실행하세요(작업 스케줄러를 활용하면 편리합니다). 단, 이메일을 발송하는 호스트의 IP 주소를 SMTP 서버의 허용 발신자 목록(인증 없이 메일 발송 가능)에 추가해야 합니다.