[HOWTO] LDAP を介して Windows 2000 ユーザーのパスワードを変更する

文書翻訳 文書翻訳
文書番号: 269190 - 対象製品
この記事は、以前は次の ID で公開されていました: JP269190
すべて展開する | すべて折りたたむ

概要

特定の制限が与えられた LDAP (Lightweight Directory Access Protocol) を介して Windows 2000 ユーザーのパスワードを設定することができます。この資料では、パスワードの属性を設定または変更する方法を説明します。

詳細

パスワードは Active Directory のユーザー オブジェクトの unicodePwd 属性に格納されています。この属性は制限された条件で書き込むことができますが、読み取ることはできません。属性は変更のみを行うことができ、オブジェクトの作成で追加したり、検索して照会することはできません。この属性を変更するために、クライアントは、サーバーに対して 128 ビット SSL (Secure Socket Layer) 接続を行う必要があります。この接続を行うには、サーバーで 128 ビット RSA 接続のサーバー証明書を保有し、クライアントではサーバーの証明書を作成した証明機関 (CA) が信頼され、さらにクライアントとサーバーの両方で 128 ビット暗号化が行われる必要があります。

unicodePwd 属性の構文はオクテット文字列です。しかし、ディレクトリ サービスでは、オクテット文字列に UNICODE 文字列を想定しています (属性の名前として示します)。これは、LDAP で渡される unicodePwd 属性の値はすべて、オクテット文字列として BER エンコード (Basic Encoding Rules) されている UNICODE 文字列でなければならないことを意味します。さらに、UNICODE 文字列は、引用符で始まりと終わりを囲む必要があり、引用符は要求されるパスワードの一部に含まれません。

unicodePwd 属性を変更するには 2 つの方法があります。1 番目の方法は、通常の "ユーザーがパスワードを変更する" 操作に似ています。このケースでは、変更要求に削除および追加の操作が両方含まれている必要があります。削除操作には引用符で囲まれた現在のパスワードが含まれ、追加操作には引用符で囲まれた新しいパスワードが含まれます。

unicodePwd 属性を変更する 2 番目の方法は、管理者によるユーザーのパスワードの再設定に似ています。これを行うには、別のユーザーのパスワードを変更するのに十分なアクセス許可を持つユーザーとしてクライアントがバインドされる必要があります。この変更要求には、引用符で囲まれた新しいパスワードを置換する操作を 1 回行います。クライアントに十分なアクセス許可があれば、古いパスワードがどのようなものでも、新しいパスワードに変更されます。

次の 2 つの関数で操作の例を示します。
ULONG ChangeUserPassword(WCHAR* pszUserDN, WCHAR* pszOldPassword,WCHAR* pszNewPassword)
{
	ULONG err = 1;
	LDAPMod modNewPassword;
	LDAPMod modOldPassword;
	LDAPMod *modEntry[3];
	BERVAL newPwdBerVal;
	BERVAL oldPwdBerVal;
	BERVAL *newPwd_attr[2];
	BERVAL *oldPwd_attr[2];
	WCHAR pszNewPasswordWithQuotes[1024];
	WCHAR pszOldPasswordWithQuotes[1024];

	// LDAPMod の配列をビルドします。
	// unicodePwd を設定するには、2 つのオプションが必要です。
	modEntry[0] = &modOldPassword;
	modEntry[1] = &modNewPassword;
	modEntry[2] = NULL;

	// unicodePwd の追加に使用する mod 構造体をビルドします。
	modNewPassword.mod_op = LDAP_MOD_ADD | LDAP_MOD_BVALUES;
	modNewPassword.mod_type =	L"unicodePwd";
	modNewPassword.mod_vals.modv_bvals = newPwd_attr;

	// unicodePwd の削除に使用する mod 構造体をビルドします。
	modOldPassword.mod_op = LDAP_MOD_DELETE | LDAP_MOD_BVALUES;
	modOldPassword.mod_type =	L"unicodePwd";
	modOldPassword.mod_vals.modv_bvals = oldPwd_attr;


	// パスワードは単一の値になるため、要素を 1 つだけ取得します。
	newPwd_attr[0] = &newPwdBerVal;
	newPwd_attr[1]= NULL;
	oldPwd_attr[0] = &oldPwdBerVal;
	oldPwd_attr[1]= NULL;


	// 引用符でパスワードを囲みます。
	wsprintf(pszNewPasswordWithQuotes,L"\"%s\"",pszNewPassword);
	wsprintf(pszOldPasswordWithQuotes,L"\"%s\"",pszOldPassword);

	// 引用符で囲まれた UNICODE パスワードの BER 構造体をビルドします。
	newPwdBerVal.bv_len = wcslen(pszNewPasswordWithQuotes) * sizeof(WCHAR);
	newPwdBerVal.bv_val = (char*)pszNewPasswordWithQuotes;
	oldPwdBerVal.bv_len = wcslen(pszOldPasswordWithQuotes) * sizeof(WCHAR);
	oldPwdBerVal.bv_val = (char*)pszOldPasswordWithQuotes;


	// 変更を 1 回実行します。
	err = ldap_modify_s(ldapConnection,
				pszUserDN,
				modEntry
				);

	if (err == LDAP_SUCCESS )
		wprintf(L"\nPassword succesfully changed!\n");
	else
		wprintf(L"\nPassword change failed!\n");

	return err;
}

ULONG SetUserPassword(WCHAR* pszUserDN, WCHAR* pszPassword)
{
	ULONG err = 1;
	LDAPMod modPassword;
	LDAPMod *modEntry[2];
	BERVAL pwdBerVal;
	BERVAL *pwd_attr[2];
	WCHAR pszPasswordWithQuotes[1024];

	// LDAPMod の配列をビルドします。
	// unicodePwd を設定するには、2 つのオプションが必要です。
	modEntry[0] = &modPassword;
	modEntry[1] = NULL;

	// unicodePwd に使用する mod 構造体をビルドします。
	modPassword.mod_op = LDAP_MOD_REPLACE | LDAP_MOD_BVALUES;
	modPassword.mod_type =	L"unicodePwd";
	modPassword.mod_vals.modv_bvals = pwd_attr;

	// パスワードは単一の値になるため、要素を 1 つだけ取得します。
	pwd_attr[0] = &pwdBerVal;
	pwd_attr[1]= NULL;

	// 引用符でパスワードを囲みます。
	wsprintf(pszPasswordWithQuotes,L"\"%s\"",pszPassword);

	// 引用符で囲まれた UNICODE パスワードの BER 構造体をビルドします。
	pwdBerVal.bv_len = wcslen(pszPasswordWithQuotes) * sizeof(WCHAR);
	pwdBerVal.bv_val = (char*)pszPasswordWithQuotes;


	// 変更を 1 回実行します。
	err = ldap_modify_s(ldapConnection,
				pszUserDN,
				modEntry
				);

	if (err == LDAP_SUCCESS )
		wprintf(L"\nPassword succesfully set!\n");
	else
		wprintf(L"\nPassword set failed!\n");

	return err;
}

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 269190 (最終更新日 2002-05-08) をもとに作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。

プロパティ

文書番号: 269190 - 最終更新日: 2004年5月11日 - リビジョン: 3.0
この資料は以下の製品について記述したものです。
  • Microsoft Windows 2000 Professional
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Datacenter Server
キーワード:?
kbhowto kboswin2000 kbmsg kbgrpdsmsg kbvc KB269190
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com