Windows Server 2008/IIS 7.0 以後におけるパスワード変更機能について

こんにちは。
日本マイクロソフト、デベロッパー サポート DSI の澤田です。

Windows Server 2003/IIS 6.0 まで Web アプリケーション経由でユーザーのパスワードの有効期限切れ事前通知機能、および、パスワード変更機能として IISADMPWD を提供していました。しかし、IISADMPWD は Windows Server 2008/IIS 7.0 以降のバージョンの IIS ではインストールされません。今回は Windows Server 2008/IIS 7.0 以降のバージョンのIIS における Web アプリケーション経由でユーザーのパスワードの有効期限切れ事前通知、パスワード変更確認機能、および、パスワード変更機能に関する情報を紹介します。

Windows Server 2008/IIS 7.0 以後における IISADMPWD について

Windows Server 2008/IIS 7.0 以後のバージョンの IIS では、IISADMPWD はサポートしておらず、動作しません。

 IISADMPWD には、IIS 6.0 のメタベースに登録された PasswordExpirePreNotifyDaysプロパティ、PasswordChangeFlagsプロパティなどの値に基づいて動作する以下の主要な 3 つの機能があります。

  1. パスワードの有効期限切れ事前通知機能
    基本認証や NTLM 認証 (※) などの認証を要求する Web アプリケーションにユーザーがアクセスした際、そのユーザーのパスワード有効期限日が、PasswordExpirePreNotifyDays メタベース プロパティ値に設定した日より短くなると、IISADMPWD のパスワード変更期限が近づいているためにパスワード変更を実行するかどうかを確認するページ (anot.asp または anot3.aso) を表示します。
    ※Windows Server 2003/IIS 6.0 での統合 Windows 認証には、NTLM 認証と Kerberos 認証があります。1. の機能は Kerberos 認証の認証の特性上、利用できません。
  2. パスワード変更確認機能
    基本認証や統合 Windows 認証を要求する Web アプリケーションにユーザーがアクセスした際、そのユーザーがパスワード有効期限が切れているために、IIS の認証が通らなかった場合、PasswordChangeFlags プロパティ値に 4 (hex 0x00000004) のビットマスクが設定されていないと、IISADMPWD のパスワード変更ページ (aexp.asp または aexp3.asp) を表示します。
  3. パスワード変更機能
    1. や 2. の機能により、実際にパスワード変更作業を行うためのページ (aexp2.asp、aexp2b.asp、aexp4.asp、または aexp4b.asp) を表示します。このページで、ユーザーは古いパスワード、新しいパスワードを入力し、パスワードを変更します。

 Windows Server 2003/IIS 6.0 までの IIS には、IIS 自体に 1. および 2. の機能が動作するような実装が組み込まれています。具体的には、Windows Server 2003/IIS 6.0 までの IIS には、1. および 2. の機能に必要な PasswordExpirePreNotifyDays プロパティや PasswordChangeFlags プロパティ、これらの機能に基づいて表示する ASP ページを指定するための AuthNotifyPwdExpURL プロパティなどが実装されています。しかし、Windows Server 2008/IIS 7.0以降のバージョンの IIS には、このような機能の実装自体がありません。

 このため、たとえ、Windows Server 2003/IIS 6.0 のIISADMPWD Windows Server 2008/IIS 7.0 以後の IIS にコピーし、 IISADMPWD に含まれる iispwchg.dll をレジストリ登録し、更に、 IISADMPWDに必要なメタベースプロパティ値を登録したとしても、 Windows Server 2008/IIS 7.0 以後の IIS 1. 2. の機能を実現することはできません。メタベースプロパティの設定自体はエラーとはなりませんが、Windows Server 2008/IIS 7.0 以降のバージョンの IIS にはそれらの設定値をハンドルする実装がありません。マイクロソフトでは、Windows Server 2008/IIS 7.0以降のバージョンの IIS において IISADMPWD はサポートしていないのみならず、IISADMPWD の上述のような機能は提供していません。

IISADMPWD の代替案について

IISADMPWD の利点は、ユーザーが IISADMPWD のページに直接アクセスすることなく、つまり、IIS 上で動作する基本認証や統合 Windows 認証を要求する Web アプリケーションにアクセスしたタイミングで、1. や 2. の機能によって自動的にパスワード変更画面にリダイレクトされることです。このような IISADMPWD の機能を Windows Server 2008/IIS 7.0 以後の IIS で実現するためには、ユーザーの認証 “後”、かつ、ユーザーがアクセスした Web アプリケーションの実行 “前” に機能するような ISAPI フィルタや HTTP モジュールの開発が必要です。

これについて、マイクロソフトが提供している既存のサンプル等はありませんが、以下のような HTTP モジュールのサンプルが CodePlex から提供されていますので参考にしてみてください。

IISADMPWD ASP.NET HTTP Module
https://iisadmpwdhttpmodule.codeplex.com/

また、IISADMPWD の 3 つ目の機能であるパスワード変更機能は、iispwchg.dll 内で NetUserChangePassword API にて実現しています。「Web 経由でパスワード変更をする方法」、すなわち、IISADMPWD の 3. の機能だけを利用したいという場合には、IADsUser::ChangePassword メソッドを使うことで容易に実現できます。サポートを提供していない IISADMPWD を利用する代わりに、以下のように IADsUser::ChangePassword メソッドを使ってパスワード変更する Classic ASP の独自実装をご検討ください。以下は、IADsUser::ChangePassword メソッドを使用し、ユーザーのパスワードを変更する Classic ASP のサンプル コードです。パスワードの変更は domain\testuser アカウントで実行し、パスワードの変更対象のユーザーは LDAP の CN に指定している User1 です。

<%@ LANGUAGE="VBSCRIPT" %>
<%
 Dim objDSO,objUser, strUser, strPwd

 'Password 変更の実行権限を持つユーザー
 strUser = "domain\testuser "
 strPass = "testuserpassowd"

 'Password 変更対象者の古いパスワード、新しいパスワード
 oldPass = "oldpassword"
 newPass = "newpassword"

 Set objDSO = GetObject("LDAP:")
 Set objUser = objDSO.OpenDSObject(LDAP://test.contoso.com/CN=User1,OU=UserAccounts,DC=test,DC=contoso,DC=com, strUser, strPass, 1)

 If err.number <> 0 Then
     Response.Write "GetObject is failed: " & err.number & "</BR>"
 End If

 objUser.ChangePassword oldPass, newPass

 If err.number <> 0 Then
     Response.Write "ChangePassword is failed: " & err.number & "</BR>"
 Else
     Response.Write "Password has changed successfully."
 End If
%>

<html>
<title>PASSWORD CHANGE SAMPLE</title>
</html>

CodePlex のサンプル、および、passchange.asp はマイクロソフトでサポートを提供するものではありませんが、IISADMPWD の代替ソリューションを検討する上での参考情報としていただけると幸いです。