Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Windows 2000 伺服器帳號密碼變更程式碼範例:LDAP 身分驗證實作

編輯:Windows Server 教學

前言:Web 介面整合 AD 密碼自助變更

企業常需提供 Web 自助服務讓使用者變更網域密碼,減少 Service Desk 壓力。本文提供經典 ASP (VBScript) 程式碼範例,示範透過 LDAP 提供者驗證舊密碼並設定新密碼的核心邏輯,適用於 Windows 2000/2003 環境。

核心程式碼 (ASP/VBScript)

<%
' 接收表單參數
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。

進階改良建議

  1. 密碼原則驗證: 前端/後端檢查新密碼長度、複雜度、歷程、最短壽命 (可透過網域 pwdProperties、minPwdLength, pwdHistoryLength, minPwdAge 屬性讀取)。
  2. 帳號狀態檢查: 變更前檢查 userAccountControl 位元 (LOCKOUT, PASSWD_NOTREQD, DONT_EXPIRE_PASSWORD 等)。
  3. 防暴力破解: 實作 CAPTCHA、IP 限流、帳號鎖定閾值監控。
  4. 审計日誌: 記錄變更時間、IP、User-Agent、成功/失敗原因,寫入資料庫或 SIEM。
  5. 改用 .NET (System.DirectoryServices.AccountManagement): 現代專案建議使用 UserPrincipal.ChangePassword(oldPwd, newPwd),程式碼更簡潔、型別安全、支援 .NET Core 跨平台。
  6. 多網域/森林支援: 依使用者輸入的 UPN 尾碼判斷目標網域,動態構建 LDAP 路徑與 GC 連接埠 (3268) 進行跨網域查詢。

安全性警示

  • 勿在程式碼中硬編碼管理員帳號密碼。 範例使用使用者自身舊密碼驗證,屬較安全模式。
  • 輸入驗證: 嚴格過濾 userflag 防止 LDAP 注入 (雖然 OpenDSObject 參數化較安全,但 DN 串接處仍需注意)。
  • 最小權限原則: IIS 執行身分僅具備必要權限;避免使用 Domain Admin 執行 Web 應用。

結語

透過 ADSI LDAP 提供者的 OpenDSObject 驗證舊密碼、SetPassword/ChangePassword 設定新密碼,即可快速建立密碼自助變更 Web 介面。關鍵在於:正確構建 DN 路徑、妥善處理錯誤與權限、強制 HTTPS 加密、遵循密碼原則。現代開發建議遷移至 .NET System.DirectoryServices.AccountManagement 或 PowerShell 模組,獲得更佳的型別安全、維護性與跨平台能力。

Copyright © Windows教程網 All Rights Reserved