Я пытаюсь оценить, соблюдаются ли правила сложности пароля с помощью 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;
}
};
}
Задача ещё не решена.
Других решений пока нет …