企業常需提供 Web 自助服務讓使用者變更網域密碼,減少 Service Desk 壓力。本文提供經典 ASP (VBScript) 程式碼範例,示範透過 LDAP 提供者驗證舊密碼並設定新密碼的核心邏輯,適用於 Windows 2000/2003 環境。
<%
' 接收表單參數
userflag = Trim(Request("userflag")) ' 使用者帳號 (CN)
oldPwd = Trim(Request("oldPwd")) ' 舊密碼
newPwd = Trim(Request("newPwd")) ' 新密碼
' 建立 LDAP 繫結路徑:LDAP:///cn=,cn=users,dc=,dc=
' 實際部署請修改 dc=yulong,dc=com 為您的實際網域 DNS 名稱
adsPath = "LDAP://server/cn=" & userflag & ",cn=users,dc=yulong,dc=com"
Set oo = GetObject("LDAP:")
On Error Resume Next
' 使用使用者提供的舊密碼進行繫結驗證 (模擬使用者身分)
Set obj = oo.OpenDSObject(adsPath, userflag, oldPwd, 0) ' 0 = ADS_SECURE_AUTHENTICATION
If Err.Number <> 0 Then
Err.Clear
%>
<script language="javascript">
alert("使用者名稱或密碼錯誤,請重新輸入!");
history.go(-1);
</script>
<%
Else
' 驗證成功,設定新密碼 (需具備重設密碼權限或為帳號擁有者)
obj.SetPassword newPwd
Response.Write("<div class=aa>您已成功修改網路密碼!</div>")
End If
%>
| 項目 | 說明 |
|---|---|
| LDAP 路徑格式 | LDAP://。範例中 cn=users 為預設 Users 容器;實際環境中使用者可能在 OU 中,需完整 DN (如 ou=Sales,ou=Taipei,dc=corp,dc=com)。 |
| OpenDSObject 參數 | OpenDSObject(ADsPath, UserName, Password, AuthFlags)。UserName 可為 UPN (user@domain.com) 或 Down-Level (DOMAIN\user)。AuthFlags: 0=安全驗證, 1=加密, 2=僅簽章, 4=委派, 8=伺服器繫結。 |
| SetPassword vs ChangePassword | SetPassword:管理員重設行為,不需舊密碼,繞過密碼歷程/複雜度/最短壽命檢查,需「重設密碼」權限。ChangePassword:使用者自助變更,需提供舊密碼,受密碼原則約束。範例已驗證舊密碼後呼叫 SetPassword,實務上建議改用 ChangePassword 以強制原則檢查。 |
| 錯誤處理 | 使用 On Error Resume Next 捕捉繫結失敗 (錯誤密碼、帳號鎖定、網路不通);Err.Number 非 0 表示失敗;生產環境建議記錄詳細錯誤至日誌。 |
| 權限需求 | 執行此腳本的 IIS 應用程式集區身分 (或模擬帳號) 需具備目標使用者物件的「重設密碼」權限 (若用 SetPassword);或使用者自身具備「變更密碼」權限 (預設擁有)。 |
| 傳輸加密 | 生產環境必須啟用 HTTPS (SSL/TLS) 保護密碼傳輸;LDAP 通訊建議使用 LDAPS (Port 636) 或 StartTLS。 |
pwdProperties、minPwdLength, pwdHistoryLength, minPwdAge 屬性讀取)。userAccountControl 位元 (LOCKOUT, PASSWD_NOTREQD, DONT_EXPIRE_PASSWORD 等)。UserPrincipal.ChangePassword(oldPwd, newPwd),程式碼更簡潔、型別安全、支援 .NET Core 跨平台。userflag 防止 LDAP 注入 (雖然 OpenDSObject 參數化較安全,但 DN 串接處仍需注意)。透過 ADSI LDAP 提供者的 OpenDSObject 驗證舊密碼、SetPassword/ChangePassword 設定新密碼,即可快速建立密碼自助變更 Web 介面。關鍵在於:正確構建 DN 路徑、妥善處理錯誤與權限、強制 HTTPS 加密、遵循密碼原則。現代開發建議遷移至 .NET System.DirectoryServices.AccountManagement 或 PowerShell 模組,獲得更佳的型別安全、維護性與跨平台能力。
Windows Server 2003 Active Directory 進階應用:DNS 整合、站台複寫與 LDAP 協議實務
解決 Windows Server 2003 升級為網域控制站後 DNS 記錄缺失問題
Windows Server 2008 容錯移轉叢集深度解析
Windows Server 2003 軟體部署群組原則 (發佈/指派 MSI 套件) 實作教學
Windows Server 2008 Server Core:小體積、大安全、極致精簡的伺服器核心
Windows 2000 SNMP 查詢工具 Snmputilg.exe 完整操作指南
使用 .NET Framework System.DirectoryServices 存取 Active Directory (上)