Включена ли в вашу политику паролей домена функция «Пароли должны отвечать требованиям сложности»? Согласно документации 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;
}