기술자료 (KB)/Active Directory (AD)

Powershell 암호 만료 메일 알림 스크립트

이완주 2021. 10. 12. 15:32

Active Directory에 참여되어 있는 컴퓨터는 암호 만료 5일 전부터 로그온 할경우 오른쪽 하단에 아래와 같은 메시지를 받게 됩니다.

암호 변경 기간이 모두 만료되는 경우 바로 패스워드 변경창이 나타나서 강제 변경을 하게 됩니다.

 

사용자는 불만을 예기하죠

상급자 : 나 메시지 못 봤어 확실하게 공지를 해야 할 거 아니야? 혼날래......(순화된 표현)

누구의 잘못 인지 모르겠지만 우리는 혼나지 않기 위해서 메일로도 공지를 보내는 방법을 연구해야 할 듯 합니다.

그래서 아래와 같이 스크립트를 만들었습니다. (3시간 걸린듯.. 에고 안돌아가는 머리를 쥐어짜고 여기저기 자료를 참고하여...)

 

설마 이걸 수동으로 돌리지는 않겠죠. 작업 스케쥴러 이용해서 메일 한번씩 돌아가게 만드시면 됩니다.

위의 내용은 인터넷에 많으니 저는 지쳐서 이만... 

 

PowerShell 로 명령어 만들어 봤습니다.

아래 소스 입니다. Email 계정은 사용하시는 것으로 변경하시면 됩니다.

 

 

#사용자 계정 Enable 상태 및 암호 사용기간 제한 없음 체크 안된 계정 확인

$accountName = Get-ADUser -Filter "enabled -eq'true'"-properties Name, PasswordNeverExpires | where { $_.passwordNeverExpires -eq 0 } | select samaccountname

 

#위의 조건으로 검색된 사용자를 확인하여 반복 실행

foreach ($user in $accountName.samaccountname)

{

    # Email 확인

    $email = (Get-ADUser -identity $user -Properties mail).mail

 

    # PasswordLastSet - 다음 로그온 시 사용자가 암호를 반드시 변경해야 함  확인 변수

    $pls = (Get-ADUser -identity $user -Properties PasswordLastSet).PasswordLastSet

 

    # 패스워드 만료일 확인 및 Date Type으로 형 변환하여 변수에 입력

    $ped = (Get-ADuser -identity $user -Properties msDS-UserPasswordExpiryTimeComputed `

     | select @{Name = "PasswordExpiry"; Expression = {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}).PasswordExpiry

 

 

    #현재 날짜에서 14일 이전 날짜 확인

    $today14 = (Get-Date).addDays(-14

 

    # PasswordLastSet 값이 있는 경우만 검사 

  if($pls){

        #패스워드 만료일이 현재 날짜보다 14일 이전인 값일 경우 참

        if ($ped -lt $today14 ){

 

            #대상 사용자 정보 표시

            #Write-Host $user $pls $ped

 

            $User = $user + "님의 암호 변경 시점이 다가옵니다."

            $EDate = "패스워드 만료일 ($ped)일 입니다."

            $Message = "변경 방법은  Ctrl + Alt + Delete 를 누르시고 암호 변경을 선택하여 변경해 주시기 바랍니다."

           

            $Body = "$User `n $EDate `n $Message"

 

 

            $EmailFrom = EventMailNotification@globalsoft.co.kr

            $EmailTo = "$email"

            $Subject = "공지사항] 패스워드 만료일 안내 및 변경 방법 안내 입니다."

 

            $SMTPServer = "smtp.office365.com"

            $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)

            $SMTPClient.EnableSsl = $true

            $SMTPClient.Credentials = New-Object System.Net.NetworkCredential(EventMailNotification@globalsoft.co.kr,"계정암호"); $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

          }

    }

}

 

위의 코드를 복사하여 사용하면 여려 문제가 발생한다는 요청에 의해 아래 코드 블럭으로 다시 올립니다.

#사용자 계정 Enable 상태 및 암호 사용기간 제한 없음 체크 안된 계정 확인
$accountName = Get-ADUser -Filter "enabled -eq 'true'"-properties Name, PasswordNeverExpires | where { $_.passwordNeverExpires -eq 0 } | select samaccountname

#위의 조건으로 검색된 사용자를 확인하여 반복 실행
foreach ($user in $accountName.samaccountname)
{
    # Email 확인
    $email = (Get-ADUser -identity $user -Properties mail).mail

    # PasswordLastSet - 다음 로그온 시 사용자가 암호를 반드시 변경해야 함  확인 변수
    $pls = (Get-ADUser -identity $user -Properties PasswordLastSet).PasswordLastSet

    # 패스워드 만료일 확인 및 Date Type으로 형 변환하여 변수에 입력
    $ped = (Get-ADuser -identity $user -Properties msDS-UserPasswordExpiryTimeComputed | select @{Name = "PasswordExpiry"; Expression = {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}).PasswordExpiry

	#현재 날짜에서 14일 이전 날짜 확인
    $today14 = (Get-Date).addDays(-14) 

    # PasswordLastSet 값이 있는 경우만 검사 
	if($pls){

        #패스워드 만료일이 현재 날짜보다 14일 이전인 값일 경우 참
        if ($ped -lt $today14 ){
 
            #대상 사용자 정보 표시
            #Write-Host $user $pls $ped
            $User = $user + "님의 암호 변경 시점이 다가옵니다."
            $EDate = "패스워드 만료일 ($ped)일 입니다."
            $Message = "변경 방법은  Ctrl + Alt + Delete 를 누르시고 암호 변경을 선택하여 변경해 주시기 바랍니다."
            $Body = "$User 'n $EDate 'n $Message"
             
            $EmailFrom = "EventMailNotification@globalsoft.co.kr
출처: https://leemcse.tistory.com/entry/Powershell-암호-만료-메일-알림-스크립트 [완주와 같이 공부하실분 모두 환영 합니다.:티스토리]"
            $EmailTo = $email
            $Subject = "공지사항] 패스워드 만료일 안내 및 변경 방법 안내 입니다."

            $SMTPServer = "smtp.office365.com"
            $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
            $SMTPClient.EnableSsl = $true
            $SMTPClient.Credentials = 
            New-Object System.Net.NetworkCredential($EmailFrom,"암호"); $SMTPClient.Send($EmailFrom,$EmailTo,$Subject,$Body)
          }
    }
}

 

아래 실행 결과 첨부해 드립니다.