logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

윈도우에서 패스워드 입력 실패로 잠금 상태인지 확인 하는 방법

by lizard2019 posted Nov 05, 2024
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

먼저 로컬 보안 정책에서 계정 잠금 기간 값을 가져온다.

 

#include <windows.h>

#include <LM.h>

#include <iostream>

 

#pragma comment(lib, "netapi32.lib")

 

int main() {

    USER_MODALS_INFO_3* userModalsInfo;

    NET_API_STATUS status = NetUserModalsGet(NULL, 3, (LPBYTE*)&userModalsInfo);

 

    if (status == NERR_Success) {

        std::wcout << L"잠금 시간: " << userModalsInfo->usrmod3_lockout_duration / 60 << L"분" << std::endl;

        NetApiBufferFree(userModalsInfo);

    } else {

        std::cerr << "Error: " << status << std::endl;

    }

 

    return 0;

}

 
 
아래 코드로 윈도우 시스템 이벤트에서 잠금 이벤트 ID 4740을 검색한다.
 
#include <iostream>
#include <Windows.h>
#include <winevt.h>
 
#pragma comment(lib, "wevtapi.lib")
 
void QueryEventLog()
{
    // 열려는 로그의 이름 (Security 로그)
    LPCWSTR logName = L"Security";
    // 검색할 쿼리 - Event ID 4740
    LPCWSTR query = L"*[System[(EventID=4740)]]";
 
    EVT_HANDLE hResults = EvtQuery(nullptr, logName, query, EvtQueryReverseDirection | EvtQueryTolerateQueryErrors);
    if (!hResults) {
        std::cerr << "EvtQuery failed with error code: " << GetLastError() << std::endl;
        return;
    }
 
    EVT_HANDLE hEvent;
    DWORD dwReturned = 0;
    while (EvtNext(hResults, 1, &hEvent, INFINITE, 0, &dwReturned)) {
        DWORD dwBufferSize = 0;
        DWORD dwBufferUsed = 0;
        DWORD dwPropertyCount = 0;
        
        // 이벤트 텍스트 데이터를 읽기 위해 필요한 버퍼 크기를 확인
        EvtRender(nullptr, hEvent, EvtRenderEventXml, dwBufferSize, nullptr, &dwBufferUsed, &dwPropertyCount);
        
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
            std::wstring buffer(dwBufferUsed / sizeof(wchar_t), L'\0');
            if (EvtRender(nullptr, hEvent, EvtRenderEventXml, dwBufferUsed, &buffer[0], &dwBufferUsed, &dwPropertyCount)) {
                // 이벤트 XML 출력
                std::wcout << L"Event: " << buffer << std::endl;
            }
        }
        
        EvtClose(hEvent);
    }
 
    if (GetLastError() != ERROR_NO_MORE_ITEMS) {
        std::cerr << "EvtNext failed with error code: " << GetLastError() << std::endl;
    }
 
    EvtClose(hResults);
}
 
int main()
{
    QueryEventLog();
    return 0;
}
 
검색후 마지막 이벤트 XML값에서 이벤트 시점과  잠금 기간을 더한 값을 현재 시간과 비교해서 이전이면 잠금 상태라고 판단한다.
물론 이벤트가 없으면 잠금 상태가 아니다.
 

List of Articles
No. Subject Author Date Views
113 프로세스 능력 성숙도 모델(CMMI)의 적용 digipine 2017.10.28 1204
112 프로그래밍 언어 순위 2023년 file digipine 2023.10.30 692
111 포렌식을 활용한 정보보호 digipine 2017.11.02 927
110 초고속망 통신사 DNS 서버 주소 모음 - DNS 설정 digipine 2017.11.03 3152
109 임베디드SW 개발자센터 이용안내(성남시 분당구, 개발공간 무료제공) digipine 2017.11.02 1143
108 이벤트 텍소노미(Event Taxonomy)란 무엇인가요? digipine 2023.08.11 753
107 유닉스/리눅스 명령어 레퍼런스 digipine 2017.11.03 1342
106 윈도우즈 도스 커멘드(Command) 네트워크 관련 명령어 lizard2019 2019.02.07 2205
» 윈도우에서 패스워드 입력 실패로 잠금 상태인지 확인 하는 방법 lizard2019 2024.11.05 352
104 윈도우 한영 전환 쉬프트 스페이스로 변경 digipine 2017.11.03 897
103 우분투 Nabi 한글 입력기 Tray(트레이) 상단 메뉴바로 옮기기 digipine 2017.11.03 2267
102 우분투 18.04 MongoDB 설치 및 구성 lizard2019 2021.02.26 1171
101 언어 IDE 별로 git ignore 파일을 자동으로 만들어 주는 사이트 엉뚱도마뱀 2018.12.17 126983
100 악성코드 종류 구분 digipine 2017.11.13 1418
99 수학적 구조물 모델링 만들기 소개 비디오 엉뚱도마뱀 2018.09.24 1580
98 소프트웨어 테스팅 전문가들을 위한 사이트 digipine 2017.11.02 1179
97 비밀번호 해쉬에 Salt(소금) 첨가하기 file 엉뚱도마뱀 2017.11.23 5004
96 리눅스 커널의 Swap Memory에 대해서 digipine 2017.11.02 1397
95 리눅스 /dev/random을 이용한 랜덤값 생성 엉뚱도마뱀 2017.11.22 2257
94 대칭키 암호화관련 개념 정리 digipine 2017.11.09 2259
Board Pagination Prev 1 2 3 4 5 6 Next
/ 6