Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
こんにちは。
日本マイクロソフト、デベロッパー サポート 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 つの機能があります。
- パスワードの有効期限切れ事前通知機能
基本認証や NTLM 認証 (※) などの認証を要求する Web アプリケーションにユーザーがアクセスした際、そのユーザーのパスワード有効期限日が、PasswordExpirePreNotifyDays メタベース プロパティ値に設定した日より短くなると、IISADMPWD のパスワード変更期限が近づいているためにパスワード変更を実行するかどうかを確認するページ (anot.asp または anot3.aso) を表示します。
※Windows Server 2003/IIS 6.0 での統合 Windows 認証には、NTLM 認証と Kerberos 認証があります。1. の機能は Kerberos 認証の認証の特性上、利用できません。 - パスワード変更確認機能
基本認証や統合 Windows 認証を要求する Web アプリケーションにユーザーがアクセスした際、そのユーザーがパスワード有効期限が切れているために、IIS の認証が通らなかった場合、PasswordChangeFlags プロパティ値に 4 (hex 0x00000004) のビットマスクが設定されていないと、IISADMPWD のパスワード変更ページ (aexp.asp または aexp3.asp) を表示します。 - パスワード変更機能
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 の代替ソリューションを検討する上での参考情報としていただけると幸いです。