NetValidatePasswordPolicy не оценивает правила сложности пароля, а только длину

Я пытаюсь оценить, соблюдаются ли правила сложности пароля с помощью API-интерфейса NetValidatePasswordPolicy.
Я нашел много образцов для этого, но ни один из них не работает для меня.

Я пробовал разные способы использования API с NetValidatePasswordReset а также NetValidatePasswordChange Параметр, но результат всегда один и тот же.

Моя проблема в том, что API только проверяет длину пароля. Если пароль слишком короткий, я получаю сообщение об ошибке 2245 (что означает, что пароль короткий), но когда я ввожу более длинный пароль, который вообще не соответствует правилам сложности, я получаю код успеха (вместо PasswordNotComplexEnough).

Кто-нибудь получил эту функцию API работать? Пожалуйста, помогите и спасибо за вашу поддержку.

Ниже приведен код, который не работает. Я попробовал это на двух разных системах. Одним из них является Windows 8, подключенная к домену Active Directory. Другой — это сервер домена того же домена (работает с 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;
}
};

}

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]