อัปเดตล่าสุด: 20 กรกฎาคม 2026
Windows LAPS (Local Administrator Password Solution) คือฟีเจอร์ในตัวของ Windows 10/11 และ Windows Server ที่จัดการรหัสผ่านของบัญชี Local Administrator ให้หมุนอัตโนมัติ พร้อม backup ไปเก็บใน Active Directory หรือ Microsoft Entra ID ปัญหาที่พบบ่อยที่สุดในหน้างาน Helpdesk ก็คือรหัสผ่านไม่ยอมหมุน, Event ID 10022/10023 ขึ้น, backup ไป Entra ID ล้มเหลว หรือเครื่องยังติด Legacy Microsoft LAPS เก่าอยู่ ผมสรุปสาเหตุจริงและวิธีแก้แบบใช้ได้ใน production ให้ทีม Tier-1 ทำตามได้ทันที (เคสจริงจากที่ผมนั่งไล่บั๊กเองมาหลายรอบ ไม่ใช่ตามเอกสารเปล่า ๆ)
Windows LAPS คืออะไร และต่างจาก Legacy LAPS อย่างไร
Windows LAPS เป็น component ที่มาพร้อม Windows 10 22H2, Windows 11 (ทุกเวอร์ชันที่ยัง supported) และ Windows Server 2019/2022/2025 หลัง April 11, 2023 cumulative update (KB5025221 สำหรับ Windows 10, KB5025224 สำหรับ Windows Server) ไม่ต้องติดตั้ง MSI แยกอีกต่อไป หน้าที่ของมันคือสุ่มรหัสผ่านของบัญชี Local Administrator ในเครื่องปลายทาง, เก็บไว้เป็น attribute ในไดเรกทอรี (AD หรือ Entra ID) ที่มีการควบคุมสิทธิ์อ่านได้ และหมุนตามรอบที่กำหนด
ที่ทีม Helpdesk ต้องเข้าใจให้ตรงกันคือ Windows LAPS ไม่ใช่ version ใหม่ของ Microsoft LAPS ตัวเก่า (MSI ที่เคยดาวน์โหลดจาก Microsoft Download Center) แต่เป็นการเขียนใหม่ทั้งหมด ใช้ PowerShell module ชื่อ LAPS คนละตัวกับของเดิม, ใช้ CSP/GPO คนละ path, และเก็บข้อมูลใน attribute ใหม่ (msLAPS-Password, msLAPS-PasswordExpirationTime, msLAPS-EncryptedPassword) แยกออกจาก ms-Mcs-AdmPwd ของตัวเก่าโดยสิ้นเชิง เพราะฉะนั้นการ "อัปเกรด" ไม่ใช่แค่ push GPO ใหม่ทับ ต้องถอน MSI ตัวเก่าให้เกลี้ยงก่อน มิฉะนั้นจะเกิด conflict ที่ผมจะอธิบายในหัวข้อถัดไป
ข้อได้เปรียบชัด ๆ ของ Windows LAPS เมื่อเทียบกับตัวเก่า: รองรับ Entra ID เป็น backup destination (Legacy ทำได้แค่ AD on-premises), รองรับ encrypted password ที่ต้องใช้ Windows Server 2016 DFL ขึ้นไป, มี password history เก็บใน AD Recycle Bin, และมี PowerShell cmdlets ที่ตั้งใจ design มาสำหรับ automation จริง ๆ ไม่ใช่ wrapper ของ ADSI แบบเดิม สำหรับรายละเอียดฉบับเต็มดูได้จาก Microsoft Learn: Windows LAPS overview ผมแนะนำให้อ่านผ่าน ๆ ก่อนลงมือ อย่างน้อยส่วน architecture
เตรียม environment ก่อนใช้งาน Windows LAPS
ก่อนจะไล่บั๊ก ต้องมั่นใจก่อนว่า environment ครบตาม prerequisites
เอาจริง ๆ นะ ผมเจอ ticket ที่ "LAPS ไม่ทำงาน" มาเป็นสิบเคส ปรากฏว่าครึ่งหนึ่งพลาดที่ prereq ล้วน ๆ ไม่ใช่บั๊กเลย นี่คือ checklist ที่ผมให้ Tier-1 ใช้:
- Windows build: Windows 11 22H2 ขึ้นไป หรือ Windows 10 22H2 พร้อม April 2023 cumulative update ตรวจด้วย
winverหรือGet-ComputerInfo | Select OsBuildNumber, OsHardwareAbstractionLayer - Directory schema: ถ้า backup ไป AD ต้อง update schema ด้วย
Update-LapsADSchemaโดย Schema Admins เพราะ schema attribute ใหม่จะไม่มีให้จนกว่าจะรัน - Backup destination รองรับ: เครื่องต้อง domain-joined (AD) หรือ Entra Joined/Hybrid Joined (Entra ID) เท่านั้น ส่วน Entra Registered device เอาไม่อยู่
- ADMX template: Windows 11 22H2+ มีมาให้ในตัว แต่ถ้าใช้ Central Store ต้อง copy
LAPS.admxและLAPS.admlจากC:\Windows\PolicyDefinitionsของเครื่อง admin ไปที่ SYSVOL - Legacy LAPS ถอนออก: ถ้ายังเจอ
AdmPwd.dllหรือ registry key เก่า ๆ อยู่ ตัวใหม่จะเข้าโหมด compatibility และหยุด process ตัวเอง
Event ID สำคัญของ Windows LAPS ที่ทีม Helpdesk ต้องอ่านให้ออก
Event log ของ Windows LAPS อยู่ที่ Event Viewer > Applications and Services Logs > Microsoft > Windows > LAPS > Operational ผมสอน Tier-1 ให้จำแค่ 5 ตัวนี้ก็ครอบคลุมได้ 95% ของเคส Microsoft มีเอกสาร reference ครบทั้งชุดที่ Windows LAPS event log reference (บุ๊กมาร์กเก็บไว้เลย จำเป็นแน่)
| Event ID | ระดับ | ความหมาย | สิ่งที่ต้องทำต่อ |
|---|---|---|---|
| 10004 | Information | Password ถูก rotate สำเร็จและ backup ผ่าน | ไม่มี เป็น success log |
| 10018 | Warning | Policy processing สำเร็จแต่ password ยังไม่หมด expiration | ปกติ รอตามรอบ หรือสั่ง rotate on-demand |
| 10022 | Error | ไม่พบ managed account หรือ account ที่ระบุใน policy | ตรวจว่า Administrator SID -500 ยัง enabled อยู่ หรือ custom account มีจริง |
| 10023 | Error | Backup ไป directory ล้มเหลว (permission หรือ connectivity) | ตรวจ Kerberos, DNS, และ device permission ใน AD/Entra |
| 10029 | Error | ตรวจพบ Legacy Microsoft LAPS ค้างอยู่ในเครื่อง | ถอน MSI เก่า, ลบ registry key legacy, restart |
คำแนะนำจากประสบการณ์ตรง: อย่าไล่แก้ทีละ Event ID โดยไม่ดู ลำดับเวลา ให้ export log ออกเป็น XML แล้วดูว่า 10022 หรือ 10023 มาก่อนกัน เพราะ 10022 ที่ตามด้วย 10023 บอกคนละ story กับ 10023 เดี่ยว ๆ ตัวแรกคือ policy โหลดไม่ถูก account ส่วนตัวหลังคือ policy ถูกแล้วแต่ push ไปเก็บไม่ได้ ผมเคยเสียเวลาไปครึ่งวันเพราะไม่ได้ดูลำดับนี้
คำสั่ง PowerShell สำหรับดึง Event log แบบเร็ว
# ดึง event LAPS 200 รายการล่าสุด พร้อม timestamp และ level
# ใช้ได้ใน Windows PowerShell 5.1 และ PowerShell 7
Get-WinEvent -LogName 'Microsoft-Windows-LAPS/Operational' -MaxEvents 200 |
Select-Object TimeCreated, Id, LevelDisplayName, Message |
Format-Table -AutoSize -Wrap
# กรองเฉพาะ error/warning และ export ไป CSV ให้ Tier-2 ดู
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-LAPS/Operational'
Level = 2,3 # 2=Error, 3=Warning
StartTime = (Get-Date).AddDays(-7)
} | Export-Csv -Path C:\Temp\laps-errors.csv -NoTypeInformation -Encoding UTF8
แก้ปัญหา Windows LAPS ไม่หมุนรหัสผ่าน
อาการที่พบบ่อยที่สุด คือตั้ง policy แล้วรอ 2 อาทิตย์ password ยังไม่เปลี่ยน หรือ Get-LapsADPassword ยัง return ค่าเดิม สาเหตุแยกเป็นสาย policy กับสาย engine ให้ไล่ตามลำดับนี้
ขั้นที่ 1: ยืนยันว่า policy ถูก apply จริง รัน gpresult /h C:\Temp\gpresult.html หรือถ้าเป็น Intune ให้ดู MDMDiagnosticsTool.exe -area DeviceEnrollment;DeviceProvisioning;Autopilot -cab C:\Temp\mdm.cab แล้วดูว่า Windows LAPS setting อยู่ใน Applied Settings จริงไหม เจอมาเยอะที่ตั้งใน GPO แต่ Intune enrollment override ทับ (ผมจะพูดเรื่องนี้ตอนท้าย)
ขั้นที่ 2: เช็ค effective policy บนเครื่อง คำสั่งนี้บอกได้เลยว่า engine เห็น policy อะไร ไม่ต้องเดา
# แสดง effective LAPS policy ที่ engine กำลังใช้
# output จะบอก BackupDirectory, PasswordAgeDays, ComplexityPolicy ครบชุด
Get-LapsDiagnostics
# ถ้าอยากดู raw configuration source ให้ดู CSP path
Get-LapsDiagnostics -Mode Configuration | Format-List *
ขั้นที่ 3: สั่งประมวลผลทันทีแทนการรอ ปกติ engine จะรันตาม schedule ทุก 1 ชั่วโมง ถ้าอยาก trigger เดี๋ยวนั้นเลย
# บังคับให้ LAPS ประมวลผลนโยบายและตัดสินใจว่าต้อง rotate ไหม
# ไม่ได้แปลว่าจะ rotate เสมอไป จะ rotate เฉพาะเมื่อ password หมดอายุ
Invoke-LapsPolicyProcessing
# ถ้าต้องการ rotate ทันทีโดยไม่สนใจ expiration ใช้คำสั่งนี้
# ต้องรัน as SYSTEM หรือ Administrator
Reset-LapsPassword
ขั้นที่ 4: ถ้ายังไม่หมุน เปิด Event log ดู Event ID 10022 (account ไม่พบ) เป็นสาเหตุอันดับหนึ่ง เกิดจากการ disable บัญชี Administrator (SID -500) ผ่าน Security Baseline หรือ policy อื่น Windows LAPS ต้องการ account ที่ enabled ถ้า disable ต้อง configure ให้ LAPS ใช้ custom local admin account (AdministratorAccountName ใน policy) แทน
Backup ไป Entra ID ล้มเหลว: สาเหตุและวิธีแก้
เคสจากลูกค้า SMB ที่ใช้ Intune-only (ไม่มี AD on-prem) เจอบ่อย: ตั้ง Windows LAPS ผ่าน Intune แล้ว Event ID 10023 ขึ้นตลอด password ไม่ backup ไป Entra ID สาเหตุที่พบบ่อยเรียงตามอัตราการเจอ:
- Device อยู่ในสถานะ Entra Registered ไม่ใช่ Joined: ตรวจด้วย
dsregcmd /statusดูบรรทัดAzureAdJoined : YESถ้าเป็น NO และWorkplaceJoined : YESคือ Registered ไม่ใช่ Joined จะ backup ไม่ได้ ต้อง unenroll แล้ว join ใหม่ - Policy ตั้ง BackupDirectory ผิดค่า: ค่าที่ถูกคือ 2 = Entra ID, 1 = AD, 0 = Disabled ถ้าตั้งเป็น 1 ในเครื่อง Entra-only จะ error 10023 เพราะไม่มี domain controller ให้ contact
- Tenant ยังไม่เปิด LAPS feature: ไปที่ Entra admin center > Devices > Device settings > Enable Microsoft Entra Local Administrator Password Solution (LAPS) ตั้งเป็น Yes ค่า default คือ No ในหลาย tenant
- Time skew: ถ้าเวลาบนเครื่องเพี้ยนเกิน 5 นาที Kerberos/OAuth token exchange จะ fail ตรวจด้วย
w32tm /query /statusแล้วw32tm /resync
สำหรับการดึงรหัสผ่านจาก Entra ID ต้องมี role อย่างใดอย่างหนึ่ง: Cloud Device Administrator, Intune Administrator, หรือ Global Administrator (ไม่แนะนำเด็ดขาด) และ permission Microsoft.Directory/deviceLocalCredentials/password/read ควรมอบผ่าน custom role หรือ PIM eligible เพื่อให้ตรวจสอบย้อนหลังได้ อ่านรายละเอียด role assignment เพิ่มเติมได้ที่ Microsoft Tech Community: Windows LAPS platform update
คำสั่งดึง password จาก Entra ID
# ต้อง install module Microsoft.Graph ก่อน (ครั้งเดียว)
# Install-Module Microsoft.Graph.Beta.Identity.DirectoryManagement -Scope CurrentUser
# ล็อกอินด้วย scope ที่จำเป็น
Connect-MgGraph -Scopes 'DeviceLocalCredential.Read.All'
# ดึง password ล่าสุดของเครื่องด้วย DeviceId (GUID จาก Entra)
$deviceId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
Get-LapsAADPassword -DeviceIds $deviceId -IncludePasswords -AsPlainText
# ถ้าอยากดู password history ทั้งหมดที่ยังเก็บอยู่
Get-LapsAADPassword -DeviceIds $deviceId -IncludePasswords -AsPlainText -IncludeHistory
โครงสร้าง auth และ device state ของ Entra ID กระทบตรง ๆ กับ LAPS ดังนั้นถ้าเคสมาจาก device ที่เพิ่งย้าย tenant หรือเพิ่งถูก reset ผ่าน Autopilot ให้ตรวจสอบขั้นตอน device provisioning ประกอบด้วย ผมเขียนเรื่องการดู log ของ Autopilot ไว้ในบทความ แก้ปัญหา Microsoft Intune Autopilot และ ESP อ่านคู่กันได้ครับ
Legacy LAPS Conflict: วิธีย้ายอย่างปลอดภัย
ตั้งแต่ Microsoft ประกาศ deprecate Legacy Microsoft LAPS (MSI) ปลายปี 2023 หลายองค์กรก็ยังไม่ได้ย้ายครบ ผลคือเครื่องที่ push Windows LAPS policy ลงไปทับจะเจอ Event ID 10029 และ engine เข้าโหมด Legacy compatibility คือ หยุดทำงาน ตัวเองเพื่อป้องกัน overwrite attribute เก่า อาการดูเหมือน "ตั้งค่าแล้วไม่มีอะไรเกิดขึ้น" ทั้งที่จริง ๆ engine กำลัง protect ข้อมูลอยู่
ขั้นตอนย้ายที่ผมใช้กับลูกค้าและไม่เคยเจอปัญหา:
# ---- ขั้นตอนที่รันบนเครื่อง endpoint (deploy ผ่าน GPO Startup Script หรือ Intune Win32 App) ----
# 1) ตรวจว่ามี Legacy LAPS ติดตั้งอยู่หรือไม่
$legacy = Get-CimInstance Win32_Product -Filter "Name LIKE '%Local Administrator Password Solution%'"
if ($legacy) {
Write-Host "พบ Legacy LAPS: $($legacy.Name) เวอร์ชัน $($legacy.Version)"
# 2) ถอน MSI ตัวเก่าออกแบบ silent
Start-Process msiexec.exe -ArgumentList "/x $($legacy.IdentifyingNumber) /qn /norestart" -Wait
}
# 3) ลบ registry keys เก่าที่ policy Client-Side Extension เก่าใช้
$legacyKeys = @(
'HKLM:\SOFTWARE\Policies\Microsoft Services\AdmPwd',
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\{D76B9641-3288-4f75-942D-087DE603E3EA}'
)
foreach ($k in $legacyKeys) {
if (Test-Path $k) { Remove-Item -Path $k -Recurse -Force -ErrorAction SilentlyContinue }
}
# 4) บังคับ LAPS ตัวใหม่ประมวลผลใหม่
Invoke-LapsPolicyProcessing
# 5) ตรวจว่า engine เริ่มทำงานปกติ (ไม่ควรเห็น 10029 อีก)
Get-WinEvent -LogName 'Microsoft-Windows-LAPS/Operational' -MaxEvents 5
สำหรับ AD ฝั่ง server ถ้าองค์กรจะเลิกใช้ attribute ms-Mcs-AdmPwd ของเก่าให้ปล่อยไว้ก่อน อย่าเพิ่งลบ เผื่อ rollback ในช่วง transition 1-2 sprint และเมื่อมั่นใจแล้วค่อยเขียน script ล้างที่ OU level ไม่ใช่ลบ attribute ออกจาก schema (schema deletion ต้องใช้ deactivation ไม่ใช่ removal อันนี้พลาดทีเดียวคือหายทั้ง forest)
ดึงรหัสผ่านและ rotate on-demand ด้วย PowerShell
PowerShell module ที่ชื่อ LAPS มาพร้อม Windows หลัง April 2023 update ไม่ต้อง install แยก cmdlets ที่ Tier-1 ใช้บ่อยที่สุดมีอยู่ไม่กี่ตัว ผมรวมไว้เป็น cheat sheet
# ---- ดึงรหัสผ่านจาก Active Directory ----
# ต้องอยู่ใน security group ที่มี permission อ่าน msLAPS-Password ของ OU นั้น
Get-LapsADPassword -Identity 'PC-ACCT-001' -AsPlainText
# ดึงพร้อม expiration และ update time
Get-LapsADPassword -Identity 'PC-ACCT-001' -AsPlainText |
Format-List Account, Password, PasswordUpdateTime, ExpirationTimestamp
# ดึง password history (ต้องเปิด AD Recycle Bin ก่อน)
Get-LapsADPassword -Identity 'PC-ACCT-001' -AsPlainText -IncludeHistory
# ---- Rotate on-demand ผ่าน AD (สั่งจากเครื่อง admin) ----
Reset-LapsPassword -Identity 'PC-ACCT-001'
# ---- ดึงจาก Entra ID ผ่าน Graph ----
Connect-MgGraph -Scopes 'DeviceLocalCredential.Read.All'
Get-LapsAADPassword -DeviceIds (Get-MgDevice -Filter "displayName eq 'PC-ACCT-001'").DeviceId `
-IncludePasswords -AsPlainText
ผมแนะนำให้ทำ wrapper script ที่ log ทุกการเปิดดูรหัสผ่านไปที่ SIEM (Sentinel/Splunk) เพราะ audit ของ AD/Entra จะบันทึกแค่ event ระดับ directory read ไม่ได้บอกว่า Tier-1 คนไหนเปิดดูของเครื่องใคร ใช้ transcript logging ของ PowerShell (Start-Transcript) เป็น baseline ก่อนก็ยังดี
เรื่องการควบคุมสิทธิ์การอ่าน LAPS password มีความสัมพันธ์โดยตรงกับการออกแบบ GPO และการมอบสิทธิ์ใน OU ผมเขียนไว้ในบทความ แก้ปัญหา Active Directory (Account Lockout, GPO, DNS) ที่ครอบคลุมการวางโครงสร้าง permission ในภาพรวม
Group Policy vs Intune: ทางไหนดีกว่ากันจริง ๆ
คำถามยอดฮิตในทีม: "ตั้ง Windows LAPS ผ่าน GPO หรือ Intune ดี?" คำตอบสั้น ๆ ของผมคือ เลือกทางเดียว อย่าตั้งทั้งสองที่ เพราะถ้าซ้อนกัน MDM (Intune) จะ win ตาม MDM Wins over GP policy ของ Windows เจอ ticket แนวนี้บ่อยจนอยากปริ๊นท์แปะไว้หน้าห้อง
เกณฑ์ตัดสินใจของผม:
- Domain-joined only (ไม่มี Intune): ใช้ GPO ผ่าน
Computer Configuration > Policies > Administrative Templates > System > LAPSตรงไปตรงมา, กระจายผ่าน SYSVOL, ตรวจสอบด้วยgpresult - Entra Joined หรือ Hybrid Joined + Intune: ใช้ Intune Settings Catalog > Local Policies Security Options ที่ scope ชื่อ Local admin password solution (LAPS) เห็นสถานะการ apply ใน Intune portal, มี report สำเร็จ/ล้มเหลว ต่างจาก GPO ที่ต้องไปเปิด event log ทีละเครื่อง
- Hybrid ที่ยังใช้ GPO อยู่: ถ้าจะย้ายไป Intune ให้ disable GPO ก่อน (set to Not Configured) แล้วปล่อยให้ tattoo หลุดออก 1-2 refresh cycle ก่อน push Intune policy ป้องกัน conflict
เกี่ยวกับ Group Policy โดยเฉพาะ ผมมีความเห็นชัดเจน: GPO ยังเป็นวิธีที่ predictable ที่สุดในการ configure Windows LAPS สำหรับองค์กรที่มี AD อยู่แล้ว เพราะ policy ถูก enforce ผ่าน gpupdate cycle ที่รู้จักกันดี, มี logging ที่คุ้นเคย, และไม่ขึ้นกับ cloud connectivity แต่ถ้าคุณกำลังจะไป Intune-first หรือ hybrid modernization อย่ายืดเวลาไว้ Microsoft Learn เขียนไว้ชัดว่า LAPS ผ่าน Intune จะได้ feature ใหม่ก่อน GPO เสมอนับจากปี 2025 เป็นต้นไป
คำถามที่พบบ่อย
Windows LAPS ใช้ได้กับ Windows Server 2019 หรือไม่?
ใช้ได้ครับ Windows LAPS เพิ่มเข้ามาใน Windows Server 2019, 2022 และ 2025 ผ่าน cumulative update ที่ออกเดือน April 2023 เป็นต้นไป (KB5025229 สำหรับ Server 2022, KB5025230 สำหรับ Server 2019) ตรวจ build number ก่อน deploy เสมอ
ทำไม Windows LAPS ถึงต้องการ Update-LapsADSchema?
เพราะ attribute ใหม่ที่ Windows LAPS ใช้เก็บ password (msLAPS-Password, msLAPS-EncryptedPassword, msLAPS-PasswordExpirationTime) ไม่มีอยู่ใน default AD schema ต้อง extend ก่อนเครื่อง endpoint จึงจะสามารถ backup ค่าเข้าไปได้ Legacy schema (ms-Mcs-AdmPwd) แยกกันคนละชุด ไม่ conflict กัน
Windows LAPS ทำงานโดยไม่มี Domain Admin ได้ไหม?
ในการ deploy ปกติทำได้ครับ ต้องใช้ Domain Admin แค่ตอนรัน Update-LapsADSchema และ Set-LapsADComputerSelfPermission เพื่อให้ computer object เขียน attribute ตัวเอง หลังจากนั้นการอ่านหรือ delegation สามารถมอบผ่าน custom security group ที่มี Extended Right เฉพาะได้ ไม่ต้องพึ่ง Domain Admin
ต่างจาก Password Vault ของ third-party อย่าง CyberArk หรือ BeyondTrust อย่างไร?
Windows LAPS จัดการเฉพาะรหัสผ่านของ built-in local admin account ไม่ใช่ session recording, JIT elevation หรือ shared account management เต็มรูปแบบ ถ้าต้องการ audit trail ระดับ session, workflow ขออนุมัติ หรือ vault สำหรับ service account ต้องใช้ PAM tool เต็มตัว Windows LAPS ตอบโจทย์แค่ endpoint local admin เท่านั้น
Rotate password ทันทีหลังใช้งานได้อย่างไร?
ใช้ Set-LapsADPasswordExpirationTime -Identity 'PC-ACCT-001' -WhenEffective ((Get-Date).AddMinutes(-5)) เพื่อบังคับให้ policy มอง password ว่าหมดอายุ engine จะ rotate ในรอบถัดไป (ปกติภายใน 1 ชั่วโมง) หรือรัน Invoke-LapsPolicyProcessing บนเครื่องปลายทางเพื่อ trigger ทันที




