こんにちは。日本マイクロソフト、デベロッパー サポート 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 以後のバージョンの IIS では、IISADMPWD はサポートしておらず、動作しません。
IISADMPWD には、IIS 6.0 のメタベースに登録された PasswordExpirePreNotifyDaysプロパティ、PasswordChangeFlagsプロパティなどの値に基づいて動作する以下の主要な 3 つの機能があります。
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 のページに直接アクセスすることなく、つまり、IIS 上で動作する基本認証や統合 Windows 認証を要求する Web アプリケーションにアクセスしたタイミングで、1. や 2. の機能によって自動的にパスワード変更画面にリダイレクトされることです。このような IISADMPWD の機能を Windows Server 2008/IIS 7.0 以後の IIS で実現するためには、ユーザーの認証 “後”、かつ、ユーザーがアクセスした Web アプリケーションの実行 “前” に機能するような ISAPI フィルタや HTTP モジュールの開発が必要です。
これについて、マイクロソフトが提供している既存のサンプル等はありませんが、以下のような HTTP モジュールのサンプルが CodePlex から提供されていますので参考にしてみてください。
IISADMPWD ASP.NET HTTP Modulehttp://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 の代替ソリューションを検討する上での参考情報としていただけると幸いです。