Мы не можем установить индивидуальный PasswordFilter в Windows 10 - PullRequest
0 голосов
/ 11 мая 2018

Я создал свой собственный пароль filter.dll, но не могу установить его в системе Windows.

Я добавил его в LSA-> Notificationpackage и скопировал также в c: \ Window \ System32.

В моем фильтре паролей при запуске я создал файл журнала, но он не создает его.

Пожалуйста, дайте мне знать, есть ли еще какие-то шаги, которые мне нужно выполнить, чтобы установить фильтр паролей в Windows 10.

Пожалуйста, найдите этот фрагмент моего фильтра паролей:

#include <regex>
#include <fstream>
#include "Ntsecapi.h"
#define MAX_SIZE 4028

using namespace std;
using namespace std::tr1;

fstream writeLog;

BOOLEAN __stdcall InitializeChangeNotify(void)
{
    wchar_t *pLogFile = L"c:\AmitPasswordFilter.log";
    wchar_t aLogFileExp[64];
    ExpandEnvironmentStrings(pLogFile, aLogFileExp, sizeof(aLogFileExp)/sizeof(wchar_t));

    writeLog.open(aLogFileExp, ios::out|ios::app);
    writeLog<<"InitializeChangeNotify"<<endl;

    return TRUE;
}

BOOLEAN __stdcall PasswordFilter(PUNICODE_STRING AccountName, PUNICODE_STRING FullName, PUNICODE_STRING Password, BOOLEAN SetOperation)
{
    writeLog<<"BabaPasswordFilter"<<endl;
    writeLog<< "PasswordFilterAmit"<<endl;

    wcmatch mr;
    BOOL match = FALSE;
    std::wstring seperator(L")(?=");
    std::wstring regExp(L"(?=");
    const int cathegories=4;
    unsigned int aRegCondition[cathegories]={2,2,2,2};

    for(int i=0;i<cathegories;i++)
    {


        for(int i=0;i<aRegCondition[0];i++)
            regExp+=L".*\\d";
        regExp+=seperator;
        for(int i=0;i<aRegCondition[1];i++)
            regExp+=L".*\\W";
        regExp+=seperator;
        for(int i=0;i<aRegCondition[2];i++)
            regExp+=L".*[A-Z]";
        regExp+=seperator;
        for(int i=0;i<aRegCondition[3];i++)
            regExp+=L".*[a-z]";
        regExp+=L")(?![.\\n]).*$";// check for newline characters and end
        wregex rx(regExp);

        if (Password)
        {
            match = regex_search(Password->Buffer, mr, rx);

            if (match)
            {
                match = TRUE;
                writeLog<<"SumitPassword matches the complexity"<<endl;
            }
            else
            {
                match = FALSE;
                writeLog<<"SumitPassword does not matche the complexity"<<endl;
            }
        }
        else
        {
            writeLog<<"SumitPassword is NULL"<<endl;
        }

        return match;
    }

1 Ответ

0 голосов
/ 24 октября 2018

Включена ли в вашу политику паролей домена функция «Пароли должны отвечать требованиям сложности»? Согласно документации Microsoft о включении настраиваемого фильтра паролей , эта политика должна быть включена для применения фильтра паролей (когда мы внедрили наш фильтр паролей пять или более лет назад, я подтвердил, что политика также требовалась) ,

Если у вас включена политика сложности, запустите сеанс удаленной отладки для LSASS.EXE (в WinDBG вам необходимо закрыть сеанс отладки с помощью 'qd' {quit and detach}, в противном случае lsass.exe неожиданно завершится, и ваш компьютер все испортил, пока не перезагрузится).

Я бы порекомендовал не помещать что-либо под InitializeChangeNotify, если у вас нет тщательной обработки исключений. Исключения, возникающие при этом вызове, могут создавать распространенные проблемы. Мой InitializeChangeNotify - это просто возвращаемое значение true ... которое является точным, поскольку в моем фильтре есть отдельная служба, которая применяет бизнес-логику для проверки правильности пароля - если моя DLL достаточно для ответа на InitializeChangeNotify, то это вверх.

Для справки, моя функция PasswordFilter:

extern "C" __declspec(dllexport) BOOLEAN __stdcall PasswordFilter(PUNICODE_STRING AccountName,
                                                                  PUNICODE_STRING FullName,
                                                                  PUNICODE_STRING Password,
                                                                  BOOLEAN SetOperation) {

    //build the account struct
    PasswordFilterAccount *pfAccount = new PasswordFilterAccount();
    pfAccount->AccountName = AccountName;
    pfAccount->Password = Password;

    //start an asynchronous thread to be able to kill the thread if it exceeds the timout
    HANDLE pfHandle = (HANDLE)_beginthreadex(0, 0, CreateSocket, (LPVOID *)pfAccount, 0, 0);

    // timeout is milliseconds. Is 30 seconds too long?
    DWORD dWaitFor = WaitForSingleObject(pfHandle, 30000); //do not exceed the timeout. 
    if (dWaitFor == WAIT_TIMEOUT) {
        //timeout exceeded
        writeWindowsEventLog("Timeout exceeded", "OPF", "ERROR", 5);
    }
    else if (dWaitFor == WAIT_OBJECT_0) {
        //here is where we want to be
    }
    else {
        //WAIT_ABANDONED
        //WAIT_FAILED
        writeWindowsEventLog("WAIT abandoned or failed", "OPF", "ERROR", 5);
    }

    if (pfHandle != INVALID_HANDLE_VALUE && pfHandle != 0) {
        if (CloseHandle(pfHandle)) {
            pfHandle = INVALID_HANDLE_VALUE;
        }
    }

    return bPasswordOk;
}
...