SID (Security IDentifier) คือตัวระบุเฉพาะที่มอบหมายให้กับผู้ใช้ กลุ่ม คอมพิวเตอร์ หรือออบเจ็กต์ความปลอดภัยอื่นๆ เมื่อถูกสร้างใน Windows หรือโดเมน Active Directory Windows ใช้ SID แต่ไม่ใช่ชื่อผู้ใช้ เพื่อควบคุมการเข้าถึงทรัพยากรต่างๆ: โฟลเดอร์แชร์เครือข่าย คีย์รีจิสทรี ออบเจ็กต์ระบบไฟล์ (NTFS permissions) พิมพ์ ฯลฯ ในบทความนี้ เราจะแสดงวิธีง่ายๆ เพื่อหา SID ของผู้ใช้ กลุ่ม หรือคอมพิวเตอร์ และขั้นตอนย้อนกลับ – วิธีได้ชื่อออบเจ็กต์จาก SID ที่ทราบ
SID (Windows Security Identifier) คืออะไร?
ตามที่กล่าวไว้ SID (ตัวระบุความปลอดภัย) ช่วยให้คุณระบุผู้ใช้ กลุ่ม หรือคอมพิวเตอร์ได้อย่างเฉพาะเจาะจงภายในขอบเขตที่กำหนด (โดเมนหรือคอมพิวเตอร์ท้องถิ่น) SID เป็นสตริงในรูปแบบ:
S-1-5-21–489056535-1467421822-2524099697–1231
- 489056535-1467421822-2524099697 – นี่คือตัวระบุเฉพาะของโดเมนที่ออก SID (ส่วนนี้จะเหมือนกันสำหรับออบเจ็กต์ทั้งหมดในโดเมนเดียวกัน):
- 1231 – ตัวระบุความปลอดภัยสัมพัทธ์ของออบเจ็กต์ (RID) เริ่มต้นที่ 1000 และเพิ่มขึ้น 1 สำหรับแต่ละออบเจ็กต์ใหม่ ออกโดยโดเมนคอนโทรลเลอร์ที่มีบทบาท FSMO RID Master
SIDs ของออบเจ็กต์ Active Directory ถูกเก็บในฐานข้อมูล ntds.dit และ SIDs ของผู้ใช้และกลุ่มท้องถิ่นในฐานข้อมูล Windows Security Account Manager (SAM) ท้องถิ่นในคีย์รีจิสทรี HKEY_LOCAL_MACHINE\SAM\SAM
มี Well-known SIDs ใน Windows นี่คือ SIDs สำหรับผู้ใช้และกลุ่มในตัวบนคอมพิวเตอร์ Windows ใดๆ ตัวอย่างเช่น:
S-1-5-32-544– กลุ่ม Administrators ในตัวS-1-5-32-545– ผู้ใช้ท้องถิ่นS-1-5-32-555 – กลุ่ม Remote Desktop Users ที่ได้รับอนุญาตให้ล็อกอินผ่าน RDPS-1-5-domainID-500– บัญชีผู้ดูแลระบบ Windows ในตัว- และอื่นๆ
ใน Windows คุณสามารถใช้เครื่องมือต่างๆ เพื่อแปลง SID → Name และ Username → SID: whoami tool, wmic, WMI classes, PowerShell หรือยูทิลิตี้ของบุคคลที่สาม
วิธีหา Security Identifier (SID) ของผู้ใช้ท้องถิ่น
เพื่อรับ SID ของบัญชีผู้ใช้ท้องถิ่น คุณสามารถใช้เครื่องมือ wmic ซึ่งอนุญาตให้สอบถามเนมสเปซ WMI ของคอมพิวเตอร์ เพื่อรับ SID ของผู้ใช้ท้องถิ่น test_user คุณสามารถใช้คำสั่ง WMIC:
wmic useraccount where name='test_user' get sid
คำสั่งนี้อาจคืนค่าข้อผิดพลาดหากที่เก็บ WMI เสียหาย ใช้คู่มือนี้เพื่อซ่อมแซมที่เก็บ WMI
คำสั่งด้านบนคืนค่า SID ของผู้ใช้ท้องถิ่นที่ระบุ ในตัวอย่างนี้ – S-1-5-21-1175659216-1321616944-201305354-1005
เพื่อแสดงรายการ SIDs ของผู้ใช้ Windows ท้องถิ่นทั้งหมด ให้รัน:
wmic useraccount get name,sid
หากคุณต้องการรับ SID ของผู้ใช้ปัจจุบัน ให้รันคำสั่งต่อไปนี้:
wmic useraccount where name='%username%' get sid
คุณสามารถสอบถาม WMI โดยตรงจาก PowerShell:
(Get-WmiObject -Class win32_userAccount -Filter "name='test_user' and domain='$env:computername'").SID
ใน PowerShell Core 7.x ใหม่กว่า คุณต้องใช้ Get-CimInstance แทนคำสั่ง Get-WmiObject
แต่ยังง่ายกว่านั้นในการรับ SID ของผู้ใช้ท้องถิ่นโดยใช้โมดูล PowerShell ในตัวสำหรับจัดการผู้ใช้และกลุ่มท้องถิ่น (Microsoft.PowerShell.LocalAccounts)
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 เพื่อรับ SID ของผู้ใช้ผ่าน PowerShell:
$objUser = New-Object System.Security.Principal.NTAccount("LOCAL_USER_NAME")
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
$strSID.Value
วิธีรับ User/Group SID ใน Active Directory
คำสั่งต่อไปนี้สามารถใช้เพื่อรับ SID ของบัญชีโดเมนปัจจุบัน:
whoami /user
คุณสามารถหา SID ของผู้ใช้โดเมน Active Directory โดยใช้เครื่องมือ WMIC คุณต้องระบุชื่อโดเมนของคุณในคำสั่งต่อไปนี้:
wmic useraccount where (name='jjsmith' and domain=′corp.woshub.com′) get sid
เพื่อหา SID ของผู้ใช้โดเมน AD คุณสามารถใช้คำสั่ง Get-ADUser ที่เป็นส่วนของ Active Directory Module for Windows PowerShell มารับ SID สำหรับบัญชีผู้ใช้โดเมน jabrams:
Get-ADUser -Identity 'jabrams' | select SID
คุณสามารถรับ SID ของกลุ่ม AD โดยใช้คำสั่ง Get-ADGroup:
Get-ADGroup -Filter {Name -like "fr-sales-*"} | Select SID
หากโมดูล PowerShell AD ไม่ได้ติดตั้งบนคอมพิวเตอร์ของคุณ คุณสามารถรับ SID ของผู้ใช้จากโดเมน AD โดยใช้คลาส .Net ที่กล่าวมาข้างต้น:
$objUser = New-Object System.Security.Principal.NTAccount("corp.woshub.com","jabrams")
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
$strSID.Value
คำสั่ง PowerShell one-liner เดียวกัน:
(new-object security.principal.ntaccount “jabrams").translate([security.principal.securityidentifier])
การตรวจสอบ SID ของโดเมนและเครื่องท้องถิ่นของคอมพิวเตอร์
หากคอมพิวเตอร์ Windows เข้าร่วมโดเมน Active Directory มันจะมี SID สองตัวที่แตกต่างกัน SID แรกคือตัวระบุคอมพิวเตอร์ท้องถิ่น (Machine SID) และอันที่สองคือตัวระบุออบเจ็กต์คอมพิวเตอร์ที่เฉพาะเจาะจงใน AD
คุณสามารถรับ SID ของคอมพิวเตอร์ในโดเมน Active Directory โดยใช้คำสั่ง:
Get-ADComputer mun-rds1 -properties sid|select name,sid
SID ของคอมพิวเตอร์ท้องถิ่น (Machine SID) สามารถรับได้โดยใช้เครื่องมือ PsGetSID (https://docs.microsoft.com/en-us/sysinternals/downloads/psgetsid) แต่คุณต้องดาวน์โหลดและติดตั้งเครื่องมือบนแต่ละคอมพิวเตอร์ด้วยตนเอง
.\PsGetsid64.exe
หรือเพียงแค่ตัดตัวอักษร 4 ตัวสุดท้าย (RID) จาก SID ของผู้ใช้ท้องถิ่นใดๆ:
$user=(Get-LocalUser Administrator).sid
$user -replace ".{4}$"
สำคัญที่คอมพิวเตอร์แต่ละเครื่องในโดเมนต้องมี SID ท้องถิ่น (machine) ที่ไม่ซ้ำกัน หากคุณโคลนคอมพิวเตอร์หรือเครื่องเสมือน หรือสร้างจากเทมเพลต คุณต้องรันยูทิลิตี้ sysprep ก่อนเข้าร่วมโดเมน เครื่องมือนี้จะรีเซ็ต SID ท้องถิ่นของ Machine ซึ่งจะช่วยหลีกเลี่ยงข้อผิดพลาดความเชื่อมั่นทั่วไป
วิธีแปลง SID เป็นชื่อผู้ใช้หรือกลุ่ม
เพื่อหาชื่อบัญชีผู้ใช้จาก SID (ขั้นตอนย้อนกลับ) คุณสามารถใช้คำสั่งใดคำสั่งหนึ่งต่อไปนี้:
wmic useraccount where sid='S-1-3-12-12451234567-1234567890-1234567-1434' get name
คุณสามารถรับชื่อผู้ใช้โดเมนจาก SID โดยใช้โมดูล RSAT-AD-PowerShell:
Get-ADUser -Identity S-1-3-12-12451234567-1234567890-1234567-1434
เพื่อหาชื่อกลุ่มโดเมนจาก SID ที่ทราบ ให้ใช้คำสั่ง:
Get-ADGroup -Identity S-1-5-21-247647651-3965464288-2949987117-23145222
คุณยังสามารถหาชื่อกลุ่มหรือผู้ใช้จาก SID ด้วยคลาส PowerShell ในตัว (โดยไม่ใช้โมดูลเพิ่มเติม):
$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S S-1-3-12-12451234567-1234567890-1234567-1434")
$objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
$objUser.Value
การค้นหา Active Directory ด้วย SID โดยใช้ PowerShell
หากคุณไม่ทราบว่า SID 某个 属于什么类型的 AD 对象 并且不知道需要使用哪个确切的 PowerShell cmdlet 来查找它 (Get-AdUser, Get-ADComputer 或 Get-ADGroup) 您可以使用通用方法,通过 Get-ADObject cmdlet 按 SID 在 Active Directory 域中搜索对象
$sid = ‘S-1-5-21-2412346651-123456789-123456789-12345678’
Get-ADObject –IncludeDeletedObjects -Filter "objectSid -eq '$sid'" | Select-Object name, objectClass
พารามิเตอร์ IncludeDeletedObjects อนุญาตให้คุณค้นหาออบเจ็กต์ที่ถูกลบใน Active Directory Recycle Bin
ในกรณีของเรา ออบเจ็กต์ AD ที่มี SID ที่ระบุคือคอมพิวเตอร์โดเมน (ดูแอตทริบิวต์ objectClass)