업무 특성상 계정, 권한 관리를 Microsoft Active Directory로 하고 있는데,
사용자 계정이 잠기거나, 암호가 만료될 때 초기화를 요청하는 경우가 많다.
사용자가 직접 초기화 할 수 있도록 사이트가 있으나, 내부망에 연결된 후에 접근이 가능하므로 실제로 원격으로 접속하는 경우에는 사용자가 직접 초기화 불가능하다. 그래서 불편하더라도 담당자가 직접 진행해야하는데, 이 부분도 개선하도록 해야겠다.
기존에는 해당 요청이 발생하는 경우 아래와 같은 프로세스로 진행을 하였다.
[AS-IS]
1. AD 서버 원격 접속
2. Active Directory 사용자 및 컴퓨터 실행
3. 초기화(계정잠금해제) 할 사용자 검색
4. 초기화(계정잠금해제) 수동 작업 진행
진행 단계가 많을 뿐만 아니라, 계정이 여러 개일 경우에 일일이 입력하기가 너무 번거로워서 파워쉘(Powershell)로 스크립트를 개발했다.
개발한 스크립트를 사용하면 단계를 두가지로 줄일 수 있다.
[Active Directory] ↔ [사용자 컴퓨터] 간 통신 가능하도록 포트만 오픈하면 단계를 하나로 줄일 수도 있는데, 그 부분은 추후에 개발하도록 하겠다.
[TO-BE]
1. AD 서버 원격 접속
2. 파워쉘 스크립트 실행
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 "잘못된 입력입니다. 다시 실행해주세요."
}
'IT > Powershell' 카테고리의 다른 글
[Powershell] Windows 디스크확장 파워쉘 명령어 Resize-Partition (0) | 2022.02.10 |
---|---|
[VMware] 연결서버(HVServer) Powershell로 Pool에 VM 추가, 사용자 추가 스크립트 (0) | 2022.01.27 |
댓글