본문 바로가기
IT/Powershell

[PowerShell] Active Directory 사용자 패스워드 초기화(Set-ADAccountPassword), 계정 활성화(Enable-ADAccount) 스크립트

by 퐁시냥 2022. 1. 20.

업무 특성상 계정, 권한 관리를 Microsoft Active Directory로 하고 있는데, 

사용자 계정이 잠기거나, 암호가 만료될 때 초기화를 요청하는 경우가 많다.

 

사용자가 직접 초기화 할 수 있도록 사이트가 있으나, 내부망에 연결된 후에 접근이 가능하므로 실제로 원격으로 접속하는 경우에는 사용자가 직접 초기화 불가능하다. 그래서 불편하더라도 담당자가 직접 진행해야하는데, 이 부분도 개선하도록 해야겠다.  

 

기존에는 해당 요청이 발생하는 경우 아래와 같은 프로세스로 진행을 하였다. 

[AS-IS]

1. AD 서버 원격 접속
2. Active Directory 사용자 및 컴퓨터 실행 
3. 초기화(계정잠금해제) 할 사용자 검색 
4. 초기화(계정잠금해제) 수동 작업 진행 

 

진행 단계가 많을 뿐만 아니라, 계정이 여러 개일 경우에 일일이 입력하기가 너무 번거로워서 파워쉘(Powershell)로 스크립트를 개발했다. 

 

개발한 스크립트를 사용하면 단계를 두가지로 줄일 수 있다.

[Active Directory] ↔ [사용자 컴퓨터] 간 통신 가능하도록 포트만 오픈하면 단계를 하나로 줄일 수도 있는데, 그 부분은 추후에 개발하도록 하겠다. 

[TO-BE]

1. AD 서버 원격 접속
2. 파워쉘 스크립트 실행

powershell-active-directory-password-change-script
powershell active directory password change script

1. AD 사용자 패스워드(암호) 초기화

Set-ADAccountPassword

Set-ADAccountPassword
   [-WhatIf]
   [-Confirm]
   [-AuthType <ADAuthType>]
   [-Credential <PSCredential>]
   [-Identity] <ADAccount>
   [-NewPassword <SecureString>]
   [-OldPassword <SecureString>]
   [-Partition <String>]
   [-PassThru]
   [-Reset]
   [-Server <String>]
   [<CommonParameters>]
  • 참고 : https://docs.microsoft.com/en-us/powershell/module/activedirectory/set-adaccountpassword?view=windowsserver2022-ps

 

Example1

$user 계정을 $password 로 암호 초기화

$user = "username"
$password = "password"
Set-ADAccountPassword -Identity $user -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $password -Force)

 

Example2

계정 없을 경우 에외처리 추가(Try ~ Catch) 

- Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException

Try{
            #Try set password
            Set-ADAccountPassword -Identity $user -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $password -Force -ErrorAction Stop)            
            Write-Host "[" $user "]" "암호 초기화를 완료하였습니다."
       
}Catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]{
           "[ "+ $user+ " ]" + " 암호 초기화에 실패하였습니다.(사유: 계정 없음)"
}

 

Example3

사용자 입력을 받아서 입력 받은 계정 암호 초기화(복수개 입력 가능)

$userLists = Read-Host '암호를 초기화 할 AD 계정을 입력하세요. 2개 이상일 경우 띄어쓰기로 구분(ex. user1 user2 user3 ...)'
$cnt = 0
$userLists = $userLists.Split(" ") # 띄어쓰기로 구분

Write-Host "==========================================="
Write-Host "▶암호 초기화 & 계정 잠금 해제 시작!!!"
foreach($user in $userLists){
    if($user -ne ""){
        Write-Host "==========================================="
        Write-Host "[" $user "]" "암호를 초기화를 시작합니다."
        Try{
            $password = "password"
            #Try set password
            Set-ADAccountPassword -Identity $user -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $password -Force -ErrorAction Stop)
            
            Write-Host "[" $user "]" "암호 초기화를 완료하였습니다."
            $cnt++
       
            }Catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]{
                   "[ "+ $user+ " ]" + " 암호 초기화에 실패하였습니다.(사유: 계정 없음)"
            }
        
        
    }

}
Write-Host "==========================================="

Write-Host "▶암호 초기화된 계정 수: " $cnt "개"

}

2. AD 사용자 잠금 해제, 계정 활성화

Enable-ADAccount

Enable-ADAccount
      [-WhatIf]
      [-Confirm]
      [-AuthType <ADAuthType>]
      [-Credential <PSCredential>]
      [-Identity] <ADAccount>
      [-Partition <String>]
      [-PassThru]
      [-Server <String>]
      [<CommonParameters>]
  • 참고 : https://docs.microsoft.com/en-us/powershell/module/activedirectory/enable-adaccount?view=windowsserver2022-ps

Unlock-ADAccount

Unlock-ADAccount
      [-WhatIf]
      [-Confirm]
      [-AuthType <ADAuthType>]
      [-Credential <PSCredential>]
      [-Identity] <ADAccount>
      [-Partition <String>]
      [-PassThru]
      [-Server <String>]
      [<CommonParameters>]
  • 참고 : https://docs.microsoft.com/en-us/powershell/module/activedirectory/unlock-adaccount?view=windowsserver2022-ps

Example1

$user 계정 활성화

- 비활성화되어 있을 경우, AD 계정 사용 불가

$user = "username"
# Enable AD Account
Enable-ADAccount -Identity $user

 

Example2 

$user 계정 잠금 해제(AD 암호 정책으로 관리, ex. 계정 패스워드를 5회 이상 틀린 경우 30분 잠금)

- 잠금 되어 있을 경우, AD Group Policy에 의해 정해진 시간동안 접속이 불가함.(ex. 30분동안 잠금)

- 예를 들어 Windows 도메인 계정 접속 시 "참조된 계정이 잠겨있습니다." 라는 메세지가 발생하는 경우가 이 케이스에 해당함.

$user = "username"
Get-ADUser -Identity $user | Unlock-ADAccount

 

Example3

계정 없을 경우 에외처리 추가(Try ~ Catch)

- Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException

Try{
            #Try enable AD Account
            Enable-ADAccount -Identity $user -ErrorAction Stop   
            Get-ADUser -Identity $user | Unlock-ADAccount
            Write-Host "[" $user "]" "계정 잠금 해제를 완료하였습니다."
       
}Catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]{
           "[ "+ $user+ " ]" + " 계정 잠금 해제에 실패하였습니다.(사유: 계정 없음)"
}

 

Example4

사용자 입력을 받아서 입력 받은 계정 초기화(복수개 입력 가능)

$userLists = Read-Host '계정 잠금 해제할 AD 계정을 입력하세요. 2개 이상일 경우 띄어쓰기로 구분(ex. user1 user2 user3 ...)'
$cnt = 0
$userLists = $userLists.Split(" ")

Write-Host "==========================================="
Write-Host "▶계정 잠금 해제 시작!!!"
foreach($user in $userLists){
    if($user -ne ""){
        Write-Host "==========================================="
        Write-Host "[" $user "]" "계정 잠금 해제를 시작합니다."
        Try{
            
            #Try set password
            Enable-ADAccount -Identity $user -ErrorAction Stop   
            Get-ADUser -Identity $user | Unlock-ADAccount
            Write-Host "[" $user "]" "계정 잠금 해제를 완료하였습니다."
            $cnt++
       
         }Catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]{
                   "[ "+ $user+ " ]" + " 계정 잠금 해제에 실패하였습니다.(사유: 계정 없음)"
         }
        
        
    }

}

 


최종 스크립트

최종 스크립트는 사용자의 입력에 따라 두 가지 작업을 처리할 수 있도록 작성하였다. 

암호초기화를 할 때 잠금 해제까지 요청하는 경우가 많기 때문에,

암호초기화 요청 시 계정 잠금 해제까지 수행하도록했다. 

 

1. 작업 선택(1:암호초기화&잠금해제, 2:계정잠금해제)

2-1. "1:암호초기화&잠금해제" 선택

  1) Enable-ADAccount 

  2) Set-ADAccountPassword

2-2. "2:계정잠금해제" 선택

  1) Enable-ADAccount

3. 작업완료(작업 완료된 계정 수 출력)

 

$selectItem = Read-Host "▶원하는 작업을 선택하세요.(1:암호초기화&잠금해제, 2:계정잠금해제)" 
if($selectItem -eq "1"){

$userLists = Read-Host '암호를 초기화 할 AD 계정을 입력하세요. 2개 이상일 경우 띄어쓰기로 구분(ex. user1 user2 user3 ...)'
$cnt = 0
$userLists = $userLists.Split(" ")

Write-Host "==========================================="
Write-Host "▶암호 초기화 & 계정 잠금 해제 시작!!!"
foreach($user in $userLists){
    if($user -ne ""){
        Write-Host "==========================================="
        Write-Host "[" $user "]" "암호를 초기화를 시작합니다."
        Try{
            $password = "password"
            #Try set password
            Enable-ADAccount -Identity $user 
            Get-ADUser -Identity $user | Unlock-ADAccount
            Set-ADAccountPassword -Identity $user -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $password -Force -ErrorAction Stop)
            
            Write-Host "[" $user "]" "암호 초기화를 완료하였습니다."
            $cnt++
       
            }Catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]{
                   "[ "+ $user+ " ]" + " 암호 초기화에 실패하였습니다.(사유: 계정 없음)"
            }
        
        
    }

}
Write-Host "==========================================="

Write-Host "▶암호 초기화된 계정 수: " $cnt "개"

}
elseif($selectItem -eq "2"){
$userLists = Read-Host '계정 잠금 해제할 AD 계정을 입력하세요. 2개 이상일 경우 띄어쓰기로 구분(ex. user1 user2 user3 ...)'
$cnt = 0
$userLists = $userLists.Split(" ")

Write-Host "==========================================="
Write-Host "▶계정 잠금 해제 시작!!!"
foreach($user in $userLists){
    if($user -ne ""){
        Write-Host "==========================================="
        Write-Host "[" $user "]" "계정 잠금 해제를 시작합니다."
        Try{
            
            #Try set password
            Enable-ADAccount -Identity $user -ErrorAction Stop   
            Get-ADUser -Identity $user | Unlock-ADAccount
            
            Write-Host "[" $user "]" "계정 잠금 해제를 완료하였습니다."
            $cnt++
       
         }Catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]{
                   "[ "+ $user+ " ]" + " 계정 잠금 해제에 실패하였습니다.(사유: 계정 없음)"
         }
        
        
    }

}
Write-Host "==========================================="

Write-Host "▶계정 잠금 해제 계정 수: " $cnt "개"
}
else{
    Write-Host "잘못된 입력입니다. 다시 실행해주세요."
}

댓글