NetValidatePasswordPolicy API を使用して、パスワードの複雑さのルールが満たされているかどうかを評価しようとしています。これについて多くのサンプルを見つけましたが、どれもうまくいきませんでした。
NetValidatePasswordReset
APIをパラメーターで使用するさまざまな方法を試しましNetValidatePasswordChange
たが、結果は常に同じです。
私の問題は、API がパスワードの長さだけをテストすることです。パスワードが短すぎると、エラー 2245 (パスワードが短すぎることを意味します) が表示されますが、複雑さのルールをまったく満たしていない長いパスワードを入力すると、成功コードが返されます (ではなくPasswordNotComplexEnough
)。
この API 関数が動作するようになった人はいますか? ご支援いただきありがとうございます。
以下は動作しないコードです。2つの異なるシステムで試しました。1 つは、Active Directory ドメインに接続された Windows 8 です。もう 1 つは、同じドメインのドメイン サーバーです (Windows Server 2008 R2 で実行されています)。
#pragma once
#include <windows.h>
#include <lm.h>
#include <stdio.h>
#include <vcclr.h>
#pragma comment(lib, "Netapi32.lib")
using namespace System;
using namespace System::Runtime::InteropServices;
namespace PasswordPolicyCheck {
public ref class srPasswordValidator
{
//public : static const int PasswordValidationSuccess = NERR_Success;
//public: static const int PasswordAccountLockedOut = NERR_AccountLockedOut;
//public: static const int PasswordTooRecent = NERR_PasswordTooRecent;
//public: static const int PasswordBadPassword = NERR_BadPassword;
//public: static const int PasswordHistConfilct = NERR_PasswordHistConflict;
//public: static const int PasswordTooShort = NERR_PasswordTooShort;
//public: static const int PasswordTooLong = NERR_PasswordTooLong;
//public: static const int PasswordNotComplexEnough = NERR_PasswordNotComplexEnough;
//public: static const int PasswordFlterError = NERR_PasswordFilterError;
public :int ValidatePassword(String^ userName, String^ password, String^ domainController)
{
LPWSTR wzPwd = static_cast<LPWSTR>(Marshal::StringToBSTR(password).ToPointer());
LPWSTR wzUser = static_cast<LPWSTR>(Marshal::StringToBSTR(userName).ToPointer());
LPWSTR wzServer = static_cast<LPWSTR>(Marshal::StringToBSTR(domainController).ToPointer());
NET_VALIDATE_OUTPUT_ARG* Output = NULL;
NET_VALIDATE_PASSWORD_RESET_INPUT_ARG Input = {0};
//NET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG Input = {0};
Input.ClearLockout = true;
Input.PasswordMustChangeAtNextLogon = false;
Input.UserAccountName = wzUser;
Input.ClearPassword = wzPwd;
//Input.PasswordMatch = TRUE;
/*NET_VALIDATE_PASSWORD_HASH PasswordHistory;
size_t lLength = wcslen(wPassword);
PasswordHistory.Length = lLength;
PasswordHistory.Hash = new BYTE[lLength];
memcpy(PasswordHistory.Hash, wPassword, lLength);
Input.HashedPassword = PasswordHistory;
Input.InputPersistedFields.PresentFields = NET_VALIDATE_PASSWORD_HISTORY | NET_VALIDATE_PASSWORD_HISTORY_LENGTH;*/
DWORD dwErr = NetValidatePasswordPolicy (wzServer, NULL, _NET_VALIDATE_PASSWORD_TYPE::NetValidatePasswordReset, &Input, (void **) &Output);
int ReturnValue = Output->ValidationStatus;
NetValidatePasswordPolicyFree ((void **) &Output);
return ReturnValue;
}
};
}