SID(Security IDentifier, 보안 식별자)는 Windows 또는 Active Directory 도메인에서 사용자, 그룹, 컴퓨터 등 보안 개체가 생성될 때 부여되는 고유 식별자입니다. Windows는 사용자 이름이 아닌 SID를 기반으로 네트워크 공유 폴더, 레지스트리 키, 파일 시스템 개체(NTFS 권한), 프린터 등 다양한 리소스에 대한 접근을 제어합니다. 이 글에서는 사용자, 그룹 또는 컴퓨터의 SID를 확인하는 방법과, 반대로 알려진 SID로 개체 이름을 조회하는 방법을 소개합니다.
SID(Windows 보안 식별자)란 무엇인가?
앞서 설명했듯이 SID(보안 식별자)는 특정 범위(도메인 또는 로컬 컴퓨터) 내에서 사용자, 그룹, 컴퓨터를 고유하게 식별하는 역할을 합니다. SID는 다음과 같은 형식의 문자열입니다.
S-1-5-21-489056535-1467421822-2524099697-1231
- 489056535-1467421822-2524099697: SID를 발급한 도메인의 고유 식별자입니다. 동일 도메인 내 모든 개체는 이 부분이 같습니다.
- 1231: 개체의 상대 보안 식별자(RID, Relative Identifier)입니다. 1000부터 시작하며 새 개체가 생성될 때마다 1씩 증가하고, FSMO 역할 중 RID Master를 담당하는 도메인 컨트롤러가 발급합니다.
Active Directory 개체의 SID는 ntds.dit 데이터베이스에 저장되며, 로컬 사용자 및 그룹의 SID는 레지스트리 키 HKEY_LOCAL_MACHINE\SAM\SAM에 있는 로컬 SAM(Security Account Manager) 데이터베이스에 저장됩니다.
Windows에는 Well-known SID(잘 알려진 SID)라고 불리는 특수한 SID들이 있습니다. 이는 모든 Windows 컴퓨터에 내장된 사용자 및 그룹에 할당되는 SID입니다. 예시는 다음과 같습니다.
S-1-5-32-544– 내장 Administrators 그룹S-1-5-32-545– 로컬 Users 그룹S-1-5-32-555– RDP를 통해 로그인할 수 있는 Remote Desktop Users 그룹S-1-5-domainID-500– Windows 내장 관리자(Administrator) 계정
Windows에서는 whoami 도구, wmic, WMI 클래스, PowerShell 또는 서드파티 유틸리티 등 다양한 도구를 사용하여 SID → 이름, 사용자 이름 → SID 변환을 수행할 수 있습니다.
로컬 사용자 SID를 확인하는 방법
로컬 사용자 계정의 SID를 확인하려면 컴퓨터의 WMI 네임스페이스를 쿼리할 수 있는 wmic 도구를 사용하면 됩니다. 로컬 사용자 test_user의 SID를 가져오는 WMIC 명령은 다음과 같습니다.
wmic useraccount where name='test_user' get sid
이 명령은 WMI 저장소가 손상된 경우 오류를 반환할 수 있습니다. 이 경우 WMI 저장소 복구 가이드를 참고하여 복구 후 다시 시도하세요.
위 명령은 지정된 로컬 사용자의 SID를 반환합니다. 이 예제에서는 S-1-5-21-1175659216-1321616944-201305354-1005입니다.
모든 로컬 Windows 사용자의 SID 목록을 확인하려면 다음 명령을 실행합니다.
wmic useraccount get name,sid
현재 로그인한 사용자의 SID가 필요하다면 다음 명령을 사용하세요.
wmic useraccount where name='%username%' get sid
PowerShell에서도 WMI를 직접 쿼리할 수 있습니다.
(Get-WmiObject -Class win32_userAccount -Filter "name='test_user' and domain='$env:computername'").SID
PowerShell Core 7.x 이상 버전에서는 Get-WmiObject cmdlet 대신 Get-CimInstance를 사용해야 합니다.
로컬 사용자 및 그룹을 관리하는 내장 PowerShell 모듈(Microsoft.PowerShell.LocalAccounts)을 사용하면 더욱 간편하게 SID를 확인할 수 있습니다.
Get-LocalUser -Name 'test_user' | Select-Object Name, SID
같은 방식으로 로컬 컴퓨터의 그룹 SID도 조회할 수 있습니다.
Get-LocalGroup -Name tstGroup1 | Select-Object Name, SID
또한 .NET 클래스인 System.Security.Principal.SecurityIdentifier와 System.Security.Principal.NTAccount를 사용하여 PowerShell로 사용자 SID를 가져올 수도 있습니다.
$objUser = New-Object System.Security.Principal.NTAccount("LOCAL_USER_NAME")
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
$strSID.Value
Active Directory에서 사용자/그룹 SID를 확인하는 방법
현재 도메인 계정의 SID를 확인하려면 다음 명령을 사용합니다.
whoami /user
WMIC 도구를 사용하여 Active Directory 도메인 사용자의 SID를 찾을 수도 있습니다. 명령에 도메인 이름을 지정해야 합니다.
wmic useraccount where (name='jjsmith' and domain='corp.woshub.com') get sid
AD 도메인 사용자의 SID를 찾으려면 Windows PowerShell용 Active Directory 모듈에 포함된 Get-ADUser cmdlet을 사용할 수 있습니다. 도메인 사용자 계정 jabrams의 SID를 확인해 보겠습니다.
Get-ADUser -Identity 'jabrams' | select SID
AD 그룹의 SID는 Get-ADGroup cmdlet으로 조회할 수 있습니다.
Get-ADGroup -Filter {Name -like "fr-sales-*"} | Select SID
컴퓨터에 PowerShell AD 모듈이 설치되어 있지 않다면, 앞서 소개한 .NET 클래스를 사용하여 AD 도메인에서 사용자의 SID를 가져올 수 있습니다.
$objUser = New-Object System.Security.Principal.NTAccount("corp.woshub.com","jabrams")
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
$strSID.Value
동일한 작업을 수행하는 PowerShell 한 줄 명령은 다음과 같습니다.
(new-object security.principal.ntaccount "jabrams").translate([security.principal.securityidentifier])
컴퓨터의 도메인 SID 및 로컬 머신 SID 확인
Windows 컴퓨터가 Active Directory 도메인에 가입되어 있으면 두 개의 서로 다른 SID를 가지게 됩니다. 첫 번째는 로컬 컴퓨터 식별자(Machine SID)이고, 두 번째는 AD에서의 고유 컴퓨터 개체 식별자입니다.
Active Directory 도메인에 있는 컴퓨터의 SID는 다음 명령으로 확인할 수 있습니다.
Get-ADComputer mun-rds1 -properties sid|select name,sid
로컬 컴퓨터의 SID(Machine SID)는 PsGetSID 도구(https://docs.microsoft.com/en-us/sysinternals/downloads/psgetsid)를 사용하여 확인할 수 있습니다. 단, 각 컴퓨터에 이 도구를 직접 다운로드하여 설치해야 합니다.
.\PsGetsid64.exe
또는 로컬 사용자의 SID에서 마지막 4자리(RID)를 제거하는 방법으로도 구할 수 있습니다.
$user=(Get-LocalUser Administrator).sid
$user -replace ".{4}$"
도메인 내 각 컴퓨터가 고유한 로컬(머신) SID를 가져야 한다는 점이 중요합니다. 컴퓨터나 가상 머신을 복제하거나 템플릿으로 생성하는 경우, 도메인 가입 전에 반드시 sysprep 유틸리티를 실행하여 로컬 Machine SID를 초기화해야 합니다. 이를 통해 흔히 발생하는 트러스트 관계 오류를 예방할 수 있습니다.
SID를 사용자 또는 그룹 이름으로 변환하는 방법
SID로 사용자 계정의 이름을 확인하려면(역방향 조회) 다음 명령 중 하나를 사용할 수 있습니다.
wmic useraccount where sid='S-1-3-12-12451234567-1234567890-1234567-1434' get name
RSAT-AD-PowerShell 모듈을 사용하면 SID로 도메인 사용자의 이름을 조회할 수 있습니다.
Get-ADUser -Identity S-1-3-12-12451234567-1234567890-1234567-1434
알려진 SID로 도메인 그룹 이름을 찾으려면 다음 명령을 사용합니다.
Get-ADGroup -Identity S-1-5-21-247647651-3965464288-2949987117-23145222
추가 모듈 없이 내장 PowerShell 클래스만으로도 SID를 통해 그룹 또는 사용자 이름을 확인할 수 있습니다.
$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-3-12-12451234567-1234567890-1234567-1434")
$objUser = $objSID.Translate([System.Security.Principal.NTAccount])
$objUser.Value
PowerShell로 SID 기반 Active Directory 검색하기
특정 SID가 어떤 유형의 AD 개체에 속하는지, 그리고 어떤 PowerShell cmdlet(Get-AdUser, Get-ADComputer, Get-ADGroup 등)을 사용해야 하는지 모르는 경우에는 Get-ADObject cmdlet을 사용하여 Active Directory 도메인에서 SID로 개체를 범용적으로 검색하는 방법을 활용할 수 있습니다.
$sid = 'S-1-5-21-2412346651-123456789-123456789-12345678'
Get-ADObject -IncludeDeletedObjects -Filter "objectSid -eq '$sid'" | Select-Object name, objectClass
IncludeDeletedObjects 매개변수를 사용하면 Active Directory 휴지통에서 삭제된 개체까지 검색할 수 있습니다.
이 예제에서 지정된 SID를 가진 AD 개체는 objectClass 특성에서 확인할 수 있듯이 도메인 컴퓨터입니다.