3

NetValidatePasswordPolicy API を使用して、パスワードの複雑さのルールが満たされているかどうかを評価しようとしています。これについて多くのサンプルを見つけましたが、どれもうまくいきませんでした。

NetValidatePasswordResetAPIをパラメーターで使用するさまざまな方法を試しまし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;
        } 
    }; 

}
4

0 に答える 0