13. [pywin32] NotifyChangeEventLog() 함수

pywin32/win32evtlog|2020. 7. 25. 23:24

NotifyChangeEventLog(handle, handle)

 

이벤트 로그가 쓰여지면 알려주는 함수입니다.

 

인자로는 handle : int, handle : int 가 있습니다.

 

handle 은 OpenEventLog 함수의 리턴값으로 감시할 이벤트 로그의 핸들값입니다.

 

2번째 handle은 win32 event 핸들값으로 이벤트 로그에 로그가 쓰여지면 이 handle이 가리키는 이벤트 핸들에서 알람을 감지할 수 있습니다.

import win32evtlog
import win32event
import win32api
import win32con

pHandle = win32evtlog.OpenEventLog(None, "Application")
# Application 로그 오픈
cHandle = win32event.CreateEvent(None, win32con.TRUE, win32con.FALSE, None)
# 새로운 이벤트를 생성
win32evtlog.NotifyChangeEventLog(pHandle, cHandle)

while True:
    x = win32event.WaitForSingleObject(cHandle, win32event.INFINITE) # 대기
    if x == win32event.WAIT_OBJECT_0:	# 로그가 쓰여지는 걸 감지
        print(f"signaled!")
        break


win32api.CloseHandle(cHandle)
win32evtlog.CloseEventLog(pHandle)
# 핸들 값 반환

위 코드를 실행하면 무한 대기할 것입니다.

 

다른 파이썬 쉘을 키고, ReportEvent 함수를 실행해봅시다. (ReportEvent 코드 참조)

 

이벤트 로그가 쓰여졌으니 이를 감지하고 signaled!를 출력하였습니다.

win32event.WaitForSingleObject 에 대해서는 win32event에서 설명하겠습니다~

 

[pywin32/win32event] - 3. [pywin32] WaitForSingleObject 함수

 

3. [pywin32] WaitForSingleObject 함수

int = WaitForSingleObject(hHandle, milliseconds ) 이벤트 하나를 등록시켜놓고 이벤트가 셋트 되면 이를 알려주는 함수입니다. 인자로는 hHandle : PyHANDLE, milliseconds : int 가 있습니다. hHandle: 대기상..

ssjune.tistory.com

 

반응형

댓글()

12. [pywin32] OpenBackupEventLog() 함수

pywin32/win32evtlog|2020. 7. 25. 13:58

PyEVTLOG_HANDLE = OpenBackupEventLog(serverName, fileName )

 

OpenEventLog 함수와 비슷합니다. 차이가 있다면, 이 함수는 기존에 백업된 이벤트 로그 파일에 대한 핸들값을 리턴합니다.

 

인자는 serverName : PyUnicode, fileName : PyUnicode 가 있습니다.

 

serverName은 이벤트 로그가 있는 원격 서버의 이름입니다. None으로 설정 시 로컬 컴퓨터를 뜻합니다.

 

fileName은 백업된 이벤트 로그 파일의 상대경로 혹은 절대경로입니다.

 

OpenBackupEventLog 함수의 리턴값은 PyEVTLOG_HANDLE 형식이며, 이벤트 로그를 다룰 떄 사용합니다.

그러나 OpenEventLog 함수와는 달리 몇몇 이벤트 로그 함수만 사용할 수 있으며, BackupEventLog 함수로 다시 백업하거나 ReadEventLog 함수로 백업된 로그 내용을 읽어오는 정도만이 가능한 것 같습니다.

import win32evtlog

pHandle = win32evtlog.OpenBackupEventLog(None, "C:\\test\BackupEventTestFile.evtx")

# win32evtlog.ClearEventLog(pHandle, "C:\\test\BackupEventTestFile2.evtx")
# 안됨

# win32evtlog.ClearEventLog(pHandle, None)
# 안됨

# win32evtlog.BackupEventLog(pHandle, "BackupEventTestFile2.evtx")
# 됨

'''
flag = win32evtlog.EVENTLOG_SEQUENTIAL_READ | win32evtlog.EVENTLOG_BACKWARDS_READ

num = win32evtlog.GetNumberOfEventLogRecords(pHandle)
print(f"{num}")

for i in range(num):
    x = win32evtlog.ReadEventLog(pHandle, flag, 0)

    for j in x:
        print(f"{j.TimeGenerated}")
'''
# 됨
        
win32evtlog.CloseEventLog(pHandle)

주석을 해제하면서 실행해보시면, 결과를 아실 수 있습니다.ㅎㅎ

반응형

댓글()

11. [pywin32] ClearEventLog() 함수

pywin32/win32evtlog|2020. 7. 25. 13:47

ClearEventLog(handle, eventLogName)

 

이벤트 로그의 내용을 모두 지우는 함수입니다. 지울때 백업을 할 지 정할 수 있습니다.

 

인자로는 handle : int, eventLogName : PyUnicode 가 있습니다.

 

handle은 클리어할 이벤트 로그의 핸들로 OpenEventLog 함수의 리턴값입니다.

 

eventLogName은 이벤트 로그를 지우기전에 백업할 경우 작성하는 곳입니다.

BackupEventLog 함수의 eventLogName 인자와 사용법이 같습니다.(BackupEventLog 함수 참조)

만약, 백업을 하지 않겠다면 None으로 설정하시면 됩니다.

import win32evtlog

pHandle = win32evtlog.OpenEventLog(None, "Application")

win32evtlog.ClearEventLog(pHandle, "C:\\test\BackupEventTestFile.evtx")
# 백업하고 clear

win32evtlog.ClearEventLog(pHandle, None)
# 그냥 clear

win32evtlog.CloseEventLog(pHandle)

위 코드의 실행 결과 test폴더에 백업 파일이 생기고 이벤트로그가 다 지워졌습니다.

반응형

댓글()

10. [pywin32] BackupEventLog() 함수

pywin32/win32evtlog|2020. 7. 25. 13:38

BackupEventLog(handle, eventLogName)

 

이벤트 로그를 백업하는 함수입니다.

 

인자로는 handle : int, eventLogName : PyUnicode가 있습니다.

 

handle은 백업할 이벤트 로그의 핸들값으로 OpenEventLog 함수의 리턴값입니다.

 

eventLogName은 이벤트 로그를 어디에 무슨 이름으로 백업할지 정합니다.

상대경로와 절대경로를 사용할 수 있습니다.

 

import win32evtlog

pHandle = win32evtlog.OpenEventLog(None, "Application")

win32evtlog.BackupEventLog(pHandle, "BackupEventTestFile.evtx")
win32evtlog.BackupEventLog(pHandle, "C:\\test\BackupEventTestFile.evtx")

win32evtlog.CloseEventLog(pHandle)

위 코드의 실행 결과 위코드를 실행시킨 폴더와 C드라이브의 test 폴더내에 백업파일이 생겼을 겁니다.(test폴더는 사전에 미리 만들어야 합니다.)

반응형

댓글()

9. [pywin32] ReadEventLog() 함수

pywin32/win32evtlog|2020. 7. 25. 00:25

[object,...] = ReadEventLog(Handle, Flags , Offset , Size )

 

OpenEventLog로 열었던 이벤트 로그의 내용을 읽어오는 함수입니다.

 

인자로는 Handle : PyHANDLE, Flags : int, Offset : int, Size=4096 : int가 있습니다.

 

Handle 은 OpenEventLog의 리턴값인 PyEVTLOG_HANDLE 값이 들어갈 수 있습니다

PyEVTLOG_HANDLE이 PyHANDLE을 상속했기 때문에 가능합니다.

 

Flags는 로그를 어떤식으로 읽을지 정하는 값입니다.

의미
win32evtlog.EVENTLOG_SEEK_READ 로그를 Offset 부터 읽는다.
* 현재 이 값은 오류로 인해 잘 되지 않는 듯 합니다.
support.microsoft.com/ko-kr/help/177199/bug-readeventlog-fails-with-error-87
win32evtlog.EVENTLOG_SEQUENTIAL_READ 로그를 순서대로 읽는다.
의미
win32evtlog.EVENTLOG_FORWARDS_READ 로그를 옛날 거부터 읽는다.(old to new)
win32evtlog.EVENTLOG_BACKWARDS_READ 로그를 최신 거 부터 읽는다.(new to old)

Flag 값은 위의 값을 조합해서 설정하니다.

 

Offset은 win32evtlog.EVENTLOG_SEEK_READ이 설정될 때 의미있는 값입니다. 로그를 Offset부터 읽습니다.

 

Size=4096은 리턴값의 사이즈인데, 4096의 기본값을 사용하면 될 듯 합니다.

 

ReadEventLog 함수의 리턴값은 PyEventLogRecord Object를 갖는 리스트 형식인 듯 합니다.

PyEventLogRecord 의 속성 : timgolden.me.uk/pywin32-docs/PyEventLogRecord.html

import win32evtlog

pHandle = win32evtlog.OpenEventLog(None, "Application")
# Application 로그를 오픈

flag = win32evtlog.EVENTLOG_SE | win32evtlog.EVENTLOG_BACKWARDS_READ

num = win32evtlog.GetNumberOfEventLogRecords(pHandle)
# Application 로그의 현재 갯수 출력
print(f"{num}")

for i in range(num): # 로그의 현재 갯수 만큼 호출
    x = win32evtlog.ReadEventLog(pHandle, flag, 0)
    # 로그 Read    

    for j in x:
        print(f"{j.TimeGenerated}")
        # 편의상 시간 정보만 출

win32evtlog.CloseEventLog(pHandle)
# 로그 핸들 반환

예제를 실행한 결과로 227개의 로그를 최신거 부터 순서대로 시간 정보만을 출력한 결과입니다.

반응형

댓글()

8. [pywin32] GetOldestEventLogRecord() 함수

pywin32/win32evtlog|2020. 7. 24. 23:53

int = GetOldestEventLogRecord(handle)

 

OpenEventLog 함수로 열었던 이벤트 로그에 지금까지 몇개의 로그가 쌓였는지 알려주는 함수입니다.

 

GetNumberOfEventLogRecords 함수가 현재의 로그 갯수를 알려준다면, GetOldestEventLogRecord 함수는 지금까지 쌓인 총 로그 갯수를 알려줍니다.

 

인자로는 handle : int 가 있습니다.

 

handle은 OpenEventLog 함수의 리턴값인 PyEVTLOG_HANDLE 값이 들어갈 수 있습니다.

 

import win32evtlog

pHandle = win32evtlog.OpenEventLog(None, "Application")
# Application 로그를 오픈
num = win32evtlog.GetOldestEventLogRecord(pHandle)
print(f"{num}")
# Application 로그의 총 갯수 출력
win32evtlog.CloseEventLog(pHandle)
# 로그 핸들 반환

실행 결과 Application 로그가 지금까지 209885 개 쌓였다고 하는군요ㅎㅎ

이것도 GetNumberOfEventLogRecords 처럼 이벤트 뷰어에서 확인해보고 싶지만 알 수가 없네요.

실행 결과를 믿어야겠습니다.ㅎㅎ

반응형

댓글()

7. [pywin32] GetNumberOfEventLogRecords() 함수

pywin32/win32evtlog|2020. 7. 24. 23:47

int = GetNumberOfEventLogRecords(handle)

 

OpenEventLog 함수로 열었던 이벤트 로그에 몇개의 로그가 쌓였는지 알려주는 함수입니다.

 

인자로는 handle : int 가 있습니다.

 

handle은 OpenEventLog 함수의 리턴값인 PyEVTLOG_HANDLE 값이 들어갈 수 있습니다.

 

 

import win32evtlog

pHandle = win32evtlog.OpenEventLog(None, "Application")
# Application 로그를 오픈
num = win32evtlog.GetNumberOfEventLogRecords(pHandle)
print(f"{num}")
# Application 로그 갯수 출력
win32evtlog.CloseEventLog(pHandle)
# 로그 핸들 반환

실행 결과 저는 227개의 로그가 있다고 합니다.

실제 이벤트 뷰어를 확인해보겠습니다.

여기서도 227개가 있다고 하는군요ㅎㅎ

반응형

댓글()

6. [pywin32] CloseEventLog() 함수

pywin32/win32evtlog|2020. 7. 24. 23:35

CloseEventLog(handle)

 

OpenEventLog 함수로 열었던 이벤트 로그 핸들값을 반환하는 함수입니다.

 

인자로는 handle : int 가 있습니다.

 

handle은 OpenEventLog 함수의 리턴값인 PyEVTLOG_HANDLE 값이 들어갈 수 있습니다.

 

 

import win32evtlog
pHandle = win32evtlog.OpenEventLog(None, "Application")

win32evtlog.CloseEventLog(pHandle)

기존에 있던 Applicaton 로그를 열었다가 닫아주는 예제입니다.

반응형

댓글()

5. [pywin32] OpenEventLog() 함수

pywin32/win32evtlog|2020. 7. 24. 23:30

PyEVTLOG_HANDLE = OpenEventLog(serverName, sourceName )

 

OpenEventLog 함수는 이벤트 로그에 대한 핸들값을 획득하는 함수입니다.

 

인자로는 serverName : PyUnicode, sourceName : PyUnicode 가 있습니다.

 

PyEVTLOG_HANDLE은 이벤트 로그에 대한 핸들값을 위한 형식입니다.

 

serverName은 이벤트 로그가 있는 원격 서버의 이름입니다. None으로 설정 시 로컬 컴퓨터를 뜻합니다.

 

sourceName은 이벤트 로그의 이름입니다. 이벤트 로그에서 원본 이라고 표기되는 항목입니다.

sourceName은 반드시 다음의 레지스트리 경로에 사전 등록이 되있어야 합니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\sourceName(있어야 함)

 

OpenEventLog 함수의 리턴값은 PyEVTLOG_HANDLE 값이며, 이는 추후 로그를 다룰 때 사용합니다.

 

 

import win32evtlog
pHandle = win32evtlog.OpenEventLog(None, "Application")

win32evtlog.CloseEventLog(pHandle)

 

기존에 있던 Applicaton 로그를 열었다가 닫아주는 예제입니다.

 

CloseEventLog에 대해서는 다음장에서 설명하겠습니다.

반응형

댓글()

4. [pywin32] ReportEvent() 함수

pywin32/win32evtlog|2020. 7. 19. 19:44

ReportEvent(EventLog, Type, Category, EventID, UserSid, Strings, RawData)

 

ReportEvent 함수는 실제로 이벤트 로그를 만드는 함수입니다.

 

인자로는 EventLog : PyHANDLE, Type : int, Category : int, EventID : int, rUserSid : PySID, Strings : sequence, RawData : str 가 있습니다.

 

PyHANDLE 은 pywin32에서 정의한 타입으로 핸들값을 위한 형식입니다.

 

PySID 는 pywin32에서 정의한 타입으로 SID를 위한 형식입니다.

 

EventLog는 이벤트 로그에 대한 핸들 값으로 RegisterEventSource 함수의 리턴값인 핸들 값을 넣어주면 됩니다.

 

Type은 로그 타입으로 win32con.EVENTLOG_* 값 중 6가지를 사용합니다.

 * win32con에 대한 설명은 win32con 페이지 참조

 

의미
win32con.EVENTLOG_AUDIT_SUCCESS 감사 성공 이벤트
win32con.EVENTLOG_AUDIT_FAILURE 감사 실패 이벤트
win32con.EVENTLOG_ERROR_TYPE 오류 수준 이벤트
win32con.EVENTLOG_INFORMATION_TYPE 정보 수준 이벤트
win32con.EVENTLOG_SUCCESS 성공 이벤트
win32con.EVENTLOG_WARNING_TYPE 경고 수준 이벤트

Category는 이벤트 로그를 어느 카테고리에 포함 시킬지 정하는 값인데 이건 이벤트 로그에 대응되는 message text file에서 정의해야 합니다. 이것에 대해서는 추후 설명하겠습니다. 일단 여기서는 1로 하겠습니다.

 

EventID는 이벤트 로그의 이벤트 ID를 설정하는 값인데 이것도 message text fil과 관계가 있습니다. 일단 여기서는 1로 하겠습니다.

 

UserSid는 사용자의 SID를 설정하는 값인데, win32api를 이용해서 SID를 추출할 수 있습니다. 이것도 추후 설명하겠습니다. 일단 여기서는 None으로 하겠습니다.

 

Strings 는 이벤트 로그의 이벤트 데이터에 포함시킬 값입니다.

 

RawData 는 이벤트 로그의 이벤트 데이터에 포함시킬 바이너리 값입니다.

 

 

import win32evtlog
import win32con


evHandle = win32evtlog.RegisterEventSource(None, "Application")
# 로그 이벤트 소스 등록
# 레지스트리에 있어야함

win32evtlog.ReportEvent(evHandle, win32con.EVENTLOG_AUDIT_SUCCESS,
                        1, 1, None, "test", b"rawdata")

win32evtlog.ReportEvent(evHandle, win32con.EVENTLOG_AUDIT_FAILURE,
                        1, 1, None, "test", b"rawdata")

win32evtlog.ReportEvent(evHandle, win32con.EVENTLOG_ERROR_TYPE,
                        1, 1, None, "test", b"rawdata")

win32evtlog.ReportEvent(evHandle, win32con.EVENTLOG_INFORMATION_TYPE,
                        1, 1, None, "test", b"rawdata")

win32evtlog.ReportEvent(evHandle, win32con.EVENTLOG_SUCCESS,
                        1, 1, None, "test", b"rawdata")

win32evtlog.ReportEvent(evHandle, win32con.EVENTLOG_WARNING_TYPE,
                        1, 1, None, "test", b"rawdata")

# 이벤트 로그 추가

win32evtlog.DeregisterEventSource(evHandle)
# 등록한 이벤트 소스 해제

앞에서 설명한 RegisterEventSource 함수와 DeregisterEventSource 함수 사이에 추가하였습니다.

그 결과를 이벤트 뷰어의 응용 프로그램 로그에서 확인할 수 있습니다.

반응형

댓글()

3. [pywin32] DeregisterEventSource() 함수

pywin32/win32evtlog|2020. 7. 19. 18:20

DeregisterEventSource(handle)

 

 

RegisterEventSource 함수로 등록한 이벤트 소스를 해제하는 함수입니다.

 

인자로는 handle:int가 있으며, RegisterEventSource 함수에서의 리턴값이 들어가게 됩니다.

(RegisterEventSource 함수에 대해서는 RegisterEventSource 함수 설명 참조)

 

import win32evtlog 

evHandle = win32evtlog.RegisterEventSource(None, "Application")
# 로그 이벤트 소스 등록
# 레지스트리에 있어야함

win32evtlog.DeregisterEventSource(evHandle)
# 등록한 이벤트 소스 해제

위 코드의 실행 결과는 아무것도 띄우지 않지만 에러가 나오지 않았다면 제대로 등록이 되고 해제되었을 겁니다.

반응형

'pywin32 > win32evtlog' 카테고리의 다른 글

6. [pywin32] CloseEventLog() 함수  (0) 2020.07.24
5. [pywin32] OpenEventLog() 함수  (2) 2020.07.24
4. [pywin32] ReportEvent() 함수  (0) 2020.07.19
2. [pywin32] RegisterEventSource() 함수  (0) 2020.07.19
1. [pywin32] win32evtlog 소개  (0) 2020.07.19

댓글()

2. [pywin32] RegisterEventSource() 함수

pywin32/win32evtlog|2020. 7. 19. 18:14

int = RegisterEventSource(serverName, sourceName )

 

이벤트 로그를 어떤 이름으로 남길 것인지 등록하는 함수입니다.

 

인자로는 serverName:PyUnicode 와 sourceName:PyUnicode 이 있습니다.

 

PyUnicode는 pywin32에서 정의한 타입으로 string과 같다고 생각하시면 됩니다.

 

serverName은 로그를 남길 원격 서버명입니다. None으로 하시면 현재 작업하는 로컬 컴퓨터에 이벤트 로그가 쌓입니다.

 

sourceName은 로그를 어떤 이름으로 남길 지 정하는 것으로 event source, 이벤트 로그에서 원본 이라고 표기되는 항목입니다.

sourceName은 반드시 다음의 레지스트리 경로에 사전 등록이 되있어야 합니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\sourceName(있어야 함)

 

RegisterEventSource() 함수의 리턴값은 int 형식의 handle 값이며, 이는 추후 등록된 이벤트 소스를 해제할 때 사용합니다.

 

자신만의 이벤트 소스 명을 만들 수 있지만 이번에는 기존에 있는 걸로 해보겠습니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\Application 의 이름으로 이벤트 소스를 등록해보겠습니다.

 

import win32evtlog

evHandle = win32evtlog.RegisterEventSource(None, "Application")
# 로그 이벤트 소스 등록
# 레지스트리에 있어야함
"""
HKEY_LOCAL_MACHINE
   SYSTEM
      CurrentControlSet
         Services
            EventLog
               Application
                  AppName(여기에 있어야 함)
"""

win32evtlog.DeregisterEventSource(evHandle)
# 등록한 이벤트 소스 해제

위 코드의 실행 결과는 아무것도 띄우지 않지만 에러가 나오지 않았다면 제대로 등록이 되고 해제되었을 겁니다.

 

DeregisterEventSource() 함수에 대해서는 다음에 설명하겠습니다ㅎㅎ

반응형

댓글()

1. [pywin32] win32evtlog 소개

pywin32/win32evtlog|2020. 7. 19. 17:58

win32evtlog는 windows의 이벤트 로그와 관련된 api를 다루는 모듈입니다.

 

윈도우 비스타 이후 버전에서 사용할 수 있으며, xp에서 사용하려면 에러가 날 거라고 합니다.

 

저희는 windows 7이기 때문에 문제없이 동작할 거 같습니다.ㅎㅎ

 

다음의 12개 함수를 제공합니다.

 

  1. RegisterEventSource
  2. DeregisterEventSource
  3. ReportEvent
  4. OpenEventLog
  5. CloseEventLog
  6. GetNumberOfEventLogRecords
  7. GetOldestEventLogRecord
  8. ReadEventLog
  9. BackupEventLog
  10. ClearEventLog
  11. OpenBackupEventLog
  12. NotifyChangeEventLog

 

[pywin32/win32evtlog] - 2. [pywin32] RegisterEventSource() 함수

 

2. [pywin32] RegisterEventSource() 함수

int = RegisterEventSource(serverName, sourceName ) 이벤트 로그를 어떤 이름으로 남길 것인지 등록하는 함수입니다. 인자로는 serverName:PyUnicode 와 sourceName:PyUnicode 이 있습니다. PyUnicode는 pywin32..

ssjune.tistory.com

[pywin32/win32evtlog] - 3. [pywin32] DeregisterEventSource() 함수

 

3. [pywin32] DeregisterEventSource() 함수

DeregisterEventSource(handle) RegisterEventSource 함수로 등록한 이벤트 소스를 해제하는 함수입니다. 인자로는 handle:int가 있으며, RegisterEventSource 함수에서의 리턴값이 들어가게 됩니다. (RegisterEve..

ssjune.tistory.com

[pywin32/win32evtlog] - 4. [pywin32] ReportEvent() 함수

 

4. [pywin32] ReportEvent() 함수

ReportEvent(EventLog, Type, Category, EventID, UserSid, Strings, RawData) ReportEvent 함수는 실제로 이벤트 로그를 만드는 함수입니다. 인자로는 EventLog : PyHANDLE, Type : int, Category : int, EventID..

ssjune.tistory.com

[pywin32/win32evtlog] - 5. [pywin32] OpenEventLog() 함수

 

5. [pywin32] OpenEventLog() 함수

PyEVTLOG_HANDLE = OpenEventLog(serverName, sourceName ) OpenEventLog 함수는 이벤트 로그에 대한 핸들값을 획득하는 함수입니다. 인자로는 serverName : PyUnicode, sourceName : PyUnicode 가 있습니다. PyEV..

ssjune.tistory.com

[pywin32/win32evtlog] - 6. [pywin32] CloseEventLog() 함수

 

6. [pywin32] CloseEventLog() 함수

CloseEventLog(handle) OpenEventLog 함수로 열었던 이벤트 로그 핸들값을 반환하는 함수입니다. 인자로는 handle : int 가 있습니다. handle은 OpenEventLog 함수의 리턴값인 PyEVTLOG_HANDLE 값이 들어갈 수 있..

ssjune.tistory.com

[pywin32/win32evtlog] - 7. [pywin32] GetNumberOfEventLogRecords() 함수

 

7. [pywin32] GetNumberOfEventLogRecords() 함수

int = GetNumberOfEventLogRecords(handle) OpenEventLog 함수로 열었던 이벤트 로그에 몇개의 로그가 쌓였는지 알려주는 함수입니다. 인자로는 handle : int 가 있습니다. handle은 OpenEventLog 함수의 리턴값인..

ssjune.tistory.com

[pywin32/win32evtlog] - 8. [pywin32] GetOldestEventLogRecord() 함수

 

8. [pywin32] GetOldestEventLogRecord() 함수

int = GetOldestEventLogRecord(handle) OpenEventLog 함수로 열었던 이벤트 로그에 지금까지 몇개의 로그가 쌓였는지 알려주는 함수입니다. GetNumberOfEventLogRecords 함수가 현재의 로그 갯수를 알려준다면, G..

ssjune.tistory.com

[pywin32/win32evtlog] - 9. [pywin32] ReadEventLog() 함수

 

9. [pywin32] ReadEventLog() 함수

[object,...] = ReadEventLog(Handle, Flags , Offset , Size ) OpenEventLog로 열었던 이벤트 로그의 내용을 읽어오는 함수입니다. 인자로는 Handle : PyHANDLE, Flags : int, Offset : int, Size=4096 : int가..

ssjune.tistory.com

[pywin32/win32evtlog] - 10. [pywin32] BackupEventLog() 함수

 

10. [pywin32] BackupEventLog() 함수

BackupEventLog(handle, eventLogName) 이벤트 로그를 백업하는 함수입니다. 인자로는 handle : int, eventLogName : PyUnicode가 있습니다. handle은 백업할 이벤트 로그의 핸들값으로 OpenEventLog 함수의 리턴..

ssjune.tistory.com

[pywin32/win32evtlog] - 11. [pywin32] ClearEventLog() 함수

 

11. [pywin32] ClearEventLog() 함수

ClearEventLog(handle, eventLogName) 이벤트 로그의 내용을 모두 지우는 함수입니다. 지울때 백업을 할 지 정할 수 있습니다. 인자로는 handle : int, eventLogName : PyUnicode 가 있습니다. handle은 클리어할..

ssjune.tistory.com

[pywin32/win32evtlog] - 12. [pywin32] OpenBackupEventLog() 함수

 

12. [pywin32] OpenBackupEventLog() 함수

PyEVTLOG_HANDLE = OpenBackupEventLog(serverName, fileName ) OpenEventLog 함수와 비슷합니다. 차이가 있다면, 이 함수는 기존에 백업된 이벤트 로그 파일에 대한 핸들값을 리턴합니다. 인자는 serverName : Py..

ssjune.tistory.com

[pywin32/win32evtlog] - 13. [pywin32] NotifyChangeEventLog() 함수

 

13. [pywin32] NotifyChangeEventLog() 함수

NotifyChangeEventLog(handle, handle) 이벤트 로그가 쓰여지면 알려주는 함수입니다. 인자로는 handle : int, handle : int 가 있습니다. handle 은 OpenEventLog 함수의 리턴값으로 감시할 이벤트 로그의 핸들값..

ssjune.tistory.com

 

반응형

댓글()

3. [Seafile] Raspberry pi에 Seafile 설치하기-3

Seafile|2019. 3. 9. 22:11

2부에 이어서 계속 하겠습니다~

 

1. [Seafile] Raspberry pi에 Seafile 설치하기-1

2. [Seafile] Raspberry pi에 Seafile 설치하기-2

 

3부에서는 2부에서 만든 tar.gz 압축을 풀고 실제로 구동시키기 위한 작업을 합니다.

 

참고 사이트 : https://manual.seafile.com/deploy/using_sqlite.html

 

 

[압축 해제]

 

홈 디렉토리에서 시작합니다.

 

mkdir haiwen mv ~/seafile-server-pkgs/seafile-server_6.0.1_pi.tar.gz haiwen cd haiwen tar -xzf seafile-server_6.0.1_pi.tar.gz mkdir installed mv seafile-server_6.0.1_pi.tar.gz installed

 

[패키지 설치]

 

서버 구동 시 필요한 패키지를 설치합니다.

 

sudo apt-get install python-ldap python-urllib3 sqlite3 python-requests

저는 python 2.7과 python-setuptools는 있기 때문에 설치 명령에 넣지는 않았습니다. 아마 여러분들도 저와 같을 것이라고 생각합니다.

 

 

[서버 설치]

 

마지막으로 서버를 설치하는 작업입니다.

이 과정에서 Seafile 서버의 이름과 서버 아이피 주소, 데이터 저장 폴더, 포트, 관리자 메일, 패스워드 등을 설정하게 됩니다. 

 

관리자 메일은 Seafile 서버에 접속할 아이디라고 보시면 됩니다. 

실제 메일 주소를 써야 하는지는 저도 잘 모르겠습니다...

아마 Seafile 사용자들이 이런저런 요청을 하게 될텐더 이런 요청들이 관리자가 설정한 관리자 메일 주소로 가지 않을까 추측만 하고 있습니다.

 

나머지 설정은 서버의 이름과 아이피 주소(라즈베리파이 아이피 주소)만 신경쓰시고 나머지는 그냥 디폴트로 설정하시면 될 듯 합니다.

 

cd seafile-server-* ./setup-seafile.sh  #run the setup script & answer prompted questions

 

[서버 구동]

 

이제 실제로 시작해봅시다.

 

./seafile.sh start # Start Seafile service ./seahub.sh start # Start Seahub website, default port is 8000

이제 다른 PC를 이용해 http://라즈베리파이의 아이피 주소:8000 로 접속하시면 Seafile 로그인 화면을 보실 수 있으실 겁니다.

 

 

 

다들 Raspberry pi에 Seafile을 성공적으로 설치하셨기를 바랍니다~

 

 

 

 

 

 

 

반응형

댓글()

2. [Seafile] Raspberry pi에 Seafile 설치하기-2

Seafile|2019. 3. 9. 21:43

1부에서 계속 이어서 하겠습니다~

 

1. [Seafile] Raspberry pi에 Seafile 설치하기-1

 

 

[Seafile 소스코드 준비]

  1. libsearpc
  2. ccnet-server
  3. seafile-server
  4. seahub
  5. seafobj
  6. seafdav
위의 6개의 구성요소를 설치해야 합니다.
 
하지만 그전에 환경변수를 하나 등록해줍니다.
 
export PKG_CONFIG_PATH=/home/pi/dev/seafile/lib:$PKG_CONFIG_PATH export PKG_CONFIG_PATH=/home/pi/dev/libsearpc:$PKG_CONFIG_PATH export PKG_CONFIG_PATH=/home/pi/dev/ccnet-server:$PKG_CONFIG_PATH
공식 사이트에서는 ccnet이라고 되있는데 설치를 하면 ccnet이 ccnet-server가 됩니다. 그래서 환경 변수도 ccnet-server로 변경하였습니다. 설치 중에 ccnet으로 되있는 경우도 전부 ccnet-server로 변경하였습니다.
 
이제 구성요소를 설치하겠습니다.
 

 1. libsearpc 설치

 

cd ~/dev git clone https://github.com/haiwen/libsearpc.git cd libsearpc git reset --hard v3.0-latest ./autogen.sh ./configure make dist

 2. ccnet-server 설치

 

cd ~/dev git clone https://github.com/haiwen/ccnet-server.git cd ccnet-server git reset --hard v6.0.1-server ./autogen.sh ./configure make dist

 3. seafile-server 설치

 

cd ~/dev git clone https://github.com/haiwen/seafile-server.git cd seafile git reset --hard v6.0.1-server ./autogen.sh ./configure make dist

 4. seahub 설치

 

seahub는 그냥 설치하면 아마 django-admin 에러가 발생할 것입니다. 이건 seahub 설치 중에 환경변수 PATH를 참조하는 데 그곳에 django-admin 스크립트가 없어서 발생합니다. 그러나 저희는 django-admin을 설치하였기 때문에 링크파일(바로가기라고 생각하시면 됩니다.)을 만들기만 하면 됩니다.

 

sudo ln -s ~/dev/seahub_thirdpart/django-admin /usr/local/bin/django-admin sudo ln -s ~/dev/seahub_thirdpart/django-admin.py /usr/local/bin/django-admin.py

그리고 아래의 명령을 진행해줍니다.

 

cd ~/dev git clone https://github.com/haiwen/seahub.git cd seahub git reset --hard v6.0.1-server ./tools/gen-tarball.py --version=6.0.1 --branch=HEAD

 5. seafobj 설치

 

cd ~/dev git clone https://github.com/haiwen/seafobj.git cd seafobj git reset --hard v6.0.1-server make dist

 6. seafdav 설치

 

cd ~/dev git clone https://github.com/haiwen/seafdav.git cd seafdav git reset --hard v6.0.1-server make

에러 없이 설치되었다면 이제 소스코드를 한곳에 모아야 합니다.

 

mkdir ~/seafile-sources cp ~/dev/libsearpc/libsearpc-1.2.2-tar.gz ~/seafile-sources cp ~/dev/ccnet/ccnet-6.0.1-tar.gz ~/seafile-sources cp ~/dev/seafile/seafile-6.0.1-tar.gz ~/seafile-sources cp ~/dev/seahub/seahub-6.0.1-tar.gz ~/seafile-sources  cp ~/dev/seafobj/seafobj.tar.gz ~/seafile-sources cp ~/dev/seafdav/seafdav.tar.gz ~/seafile-sources

명령어 중 버전이 적혀있는 곳은 공통된 작업을 했기 때문에 다 맞을 것 입니다.

 

 

[서버 스크립트 생성]

 

이제 서버를 실제로 구동하는 스크립트를 생성해봅시다

 

mkdir ~/seafile-server-pkgs ~/dev/seafile-server/scripts/build/build-server.py --libsearpc_version=1.2.2 --ccnet_version=6.0.1 --seafile_version=6.0.1 --thirdpartdir=/home/pi/dev/seahub_thirdpart --srcdir=/home/pi/seafile-sources --outputdir=/home/pi/seafile-server-pkgs --version=6.0.1

서버 스크립트 생성 시 다른 라이브러리가 없어서 에러가 나올 수 있습니다.

저는 LDAP 와 onigposix.h 를 찾을 수 없다는 에러가 나왔습니다. 

아마 다른 분들도 처음 라즈비안 OS를 설치한 직후 포스팅을 따라 왔다면 저와 같은 에러가 나올 것입니다.

 

 1. LDAP 에러

 

LDAP 라이브러리가 없어서 생긴 에러니 설치해줍니다.

 

sudo apt-get install libldap2-dev

 

 2. onigposix.h 에러

 

Oniguruma 라는 라이브러리가 없어서 생긴 에러니 설치해줍니다.

 

sudo apt-get install libonig-dev

 

위의 조치를 취한 후 다시 명령을 해봅시다.

 

~/dev/seafile-server/scripts/build/build-server.py --libsearpc_version=1.2.2 --ccnet_version=6.0.1 --seafile_version=6.0.1 --thirdpartdir=/home/pi/dev/seahub_thirdpart --srcdir=/home/pi/seafile-sources --outputdir=/home/pi/seafile-server-pkgs --version=6.0.1

 

에러 없이 seafile-server_6.0.1_pi.tar.gz 파일이 ~/seafile-server-pkgs 아래에 생겼다면 서버 구동의 준비가 거의 다되었습니다.

 

 

이제 마지막 과정이 남았으며 3부에서 계속하겠습니다~

반응형

댓글()

1. [Seafile] Raspberry pi에 Seafile 설치하기-1

Seafile|2019. 3. 9. 21:18

Seafile이란 파일 동기화 및 공유 플랫폼입니다.

 

서버에 Seafile 서비스를 설치하면 연결된 PC 간 파일들의 동기화를 지원해줍니다.

 

Windows, MAC, Linux 사이의 동기화 및 파일 공유를 가능하게 해줍니다.

 

공식 사이트 : https://www.seafile.com/en/home/

 

 

[준비 과정]

 

저는 Raspberry pi에 Seafile을 설치해보려 합니다.

 

먼저 Raspberry pi가 있어야겠죠? ㅎㅎ

 

저는 예전에 사놓았던 Raspberry pi 3 model B 를 사용하려 합니다.

 

운영체제로는 공식 OS인 Raspbian 을 설치하였습니다.

 

Raspbian OS : https://www.raspberrypi.org/downloads/raspbian/

 

2019년 3월 9일 현재 가장 최신의 OS인 Raspbian Stretch 를 설치하였으며, 용량이 적은 LITE 버전을 설치하였습니다.

 

자세한 설치 과정 및 네트워크 설정, 초기 설정까지 여기서 다루지는 않으려고 합니다.ㅎㅎ

 

 

Seafile 설치 안내 사이트 : https://manual.seafile.com/build_seafile/rpi.html

 

Raspberry pi에 Seafile을 설치하는 방법은 위의 공식 사이트를 참조하였으며, 중간에 에러가 좀 있기 때문에 제가 포스팅 하는 것과는 라이브러리 설치가 좀 다를 수 있습니다.

 

[Seafile 빌드 환경 구성]

 

1. 먼저 다음의 명령어로 패키지 서버를 업데이트를 해줍니다.

 

복사&붙여넣기로 사용할 수 있습니다.

sudo apt-get update
sudo apt-get upgrade

 

2. Seafile 설치 시 필요한 패키지를 다운로드 합니다.

 

sudo apt-get install build-essential sudo apt-get install libevent-dev libssl1.0-dev libglib2.0-dev uuid-dev intltool libsqlite3-dev default-libmysqlclient-dev libarchive-dev libtool libjansson-dev valac libfuse-dev re2c flex python-setuptools cmake

3. http 서버 라이브러리를 설치합니다.

 

git clone https://www.github.com/haiwen/libevhtp.git cd libevhtp cmake -DEVHTP_DISABLE_SSL=ON -DEVHTP_BUILD_SHARED=OFF . make sudo make install

4. 설치 후 시스템 라이브러리 캐시를 업데이트합니다.

 

sudo ldconfig

 

[Python 라이브러리 설치]

 

1. Python 라이브러리를 위한 폴더를 생성합니다.

 

mkdir -p ~/dev/seahub_thirdpart

2. /tmp/ 로 이동한 Python 라이브러리 압축 파일을 다운로드합니다. 

 

sudo wget https://pypi.python.org/packages/source/p/pytz/pytz-2016.1.tar.gz sudo wget https://www.djangoproject.com/m/releases/1.8/Django-1.8.18.tar.gz sudo wget https://pypi.python.org/packages/source/d/django-statici18n/django-statici18n-1.1.3.tar.gz sudo wget https://pypi.python.org/packages/source/d/djangorestframework/djangorestframework-3.3.2.tar.gz sudo wget https://pypi.python.org/packages/source/d/django_compressor/django_compressor-1.4.tar.gz sudo wget https://pypi.python.org/packages/source/j/jsonfield/jsonfield-1.0.3.tar.gz sudo wget https://pypi.python.org/packages/source/d/django-post_office/django-post_office-2.0.6.tar.gz sudo wget http://pypi.python.org/packages/source/g/gunicorn/gunicorn-19.4.5.tar.gz sudo wget http://pypi.python.org/packages/source/f/flup/flup-1.0.2.tar.gz sudo wget https://pypi.python.org/packages/source/c/chardet/chardet-2.3.0.tar.gz sudo wget https://labix.org/download/python-dateutil/python-dateutil-1.5.tar.gz sudo wget https://pypi.python.org/packages/source/s/six/six-1.9.0.tar.gz sudo wget https://pypi.python.org/packages/source/d/django-picklefield/django-picklefield-0.3.2.tar.gz sudo wget -O /tmp/django_constance.zip https://github.com/haiwen/django-constance/archive/bde7f7c.zip sudo wget https://pypi.python.org/packages/source/j/jdcal/jdcal-1.2.tar.gz sudo wget https://pypi.python.org/packages/source/e/et_xmlfile/et_xmlfile-1.0.1.tar.gz sudo wget https://pypi.python.org/packages/source/o/openpyxl/openpyxl-2.3.0.tar.gz sudo wget https://pypi.python.org/packages/cc/26/b61e3a4eb50653e8a7339d84eeaa46d1e93b92951978873c220ae64d0733/futures-3.1.1.tar.gz sudo wget https://pypi.python.org/packages/a8/07/947dfe63dff1f2be5f84eb7f0ff5f712bb1dc730a6499b0aa0be5c8f194e/django-formtools-2.0.tar.gz sudo wget https://pypi.python.org/packages/87/16/99038537dc58c87b136779c0e06d46887ff5104eb8c64989aac1ec8cba81/qrcode-5.3.tar.gz

3. /home/pi/dev/seahub_thirdpart  에 압축된 Python 라이브러리를 압축해제하고, 환경변수에 경로를 등록해줍니다.

 

cd ~/dev/seahub_thirdpart export PYTHONPATH=. easy_install -d . /tmp/pytz-2016.1.tar.gz easy_install -d . /tmp/Django-1.8.18.tar.gz easy_install -d . /tmp/django-statici18n-1.1.3.tar.gz easy_install -d . /tmp/djangorestframework-3.3.2.tar.gz easy_install -d . /tmp/django_compressor-1.4.tar.gz easy_install -d . /tmp/jsonfield-1.0.3.tar.gz easy_install -d . /tmp/django-post_office-2.0.6.tar.gz easy_install -d . /tmp/gunicorn-19.4.5.tar.gz easy_install -d . /tmp/flup-1.0.2.tar.gz easy_install -d . /tmp/chardet-2.3.0.tar.gz easy_install -d . /tmp/python-dateutil-1.5.tar.gz easy_install -d . /tmp/six-1.9.0.tar.gz easy_install -d . /tmp/django-picklefield-0.3.2.tar.gz easy_install -d . /tmp/django_constance.zip easy_install -d . /tmp/jdcal-1.2.tar.gz easy_install -d . /tmp/et_xmlfile-1.0.1.tar.gz easy_install -d . /tmp/openpyxl-2.3.0.tar.gz

포스팅이 길어질 듯 하니 다음 과정은 2부에 적겠습니다~

 

반응형

댓글()

2. [pywin32] GetEapUserIdentity() 함수

pywin32/win2kras|2018. 11. 4. 00:28
??? = GetEapUserIdentity(PhoneBook, Entry, Flags)

일단 이 함수는 웹 페이지에 제대로 된 소개가 없어서 제가 MSDN 페이지를 참조해서 만들었습니다.


이 함수는 현재 사용자에 대한 ID 정보를 검색합니다. 이 정보를 사용하여 EAP (Extensible Authentication Protocol)가 필요한 전화 번

호부 항목으로 RasDial을 호출합니다.

라고는 되어있는데 pywin32 에 RasDial 함수가 없으니...



인자로는 PhonBook:string, Entry:string, Flags: int 3개를 사용하는 듯 합니다.

PhoneBook:string 은 pbk라는 확장자를 사용하는 전화번호부 파일의 경로입니다.

Entry 는 전화번호부에서 사용하는 서비스 이름? 구별 이름? 같습니다.

Flags 는 플래그이며 win2kras.RASEAPF_Logon, win2kras.RASEAPF_NonInteractive, win2kras.RASEAPF_Preview 3가지가 있습니다.

간단히 설명하면 

win2kras.RASEAPF_NonInteractive : GUI 를 가져오지 않도록 설정한다. 

win2kras.RASEAPF_Logon : Winlogon에서 사용자 데이터를 가져오도록 한다.

win2kras.RASEAPF_Preview : 전화를 걸기 전에 ID 정보를 묻는 메시지를 표시하도록 지정합니다.



사용해 봤지만 결과가 잘 안나오더군요... 제가 놓친게 있는지...


반응형

'pywin32 > win2kras' 카테고리의 다른 글

1. [pywin32] win2kras 소개  (0) 2018.11.04

댓글()

1. [pywin32] win2kras 소개

pywin32/win2kras|2018. 11. 4. 00:28

win2kras 모듈은 Remote Access Service (RAS) api 에 대한 Windows 2000 확장을 캡슐화 하는 모듈이라고 합니다.

그런데 있는 함수는 하나밖에 없고 웹 페이지에 제대로 된 소개가 없네요...

 

  1. GetEapUserIdentity

 

[pywin32/win2kras] - 2. [pywin32] GetEapUserIdentity() 함수

 

2. [pywin32] GetEapUserIdentity() 함수

??? = GetEapUserIdentity(PhoneBook, Entry, Flags) 일단 이 함수는 웹 페이지에 제대로 된 소개가 없어서 제가 MSDN 페이지를 참조해서 만들었습니다. 이 함수는 현재 사용자에 대한 ID 정보를 검색합니다. 이.

ssjune.tistory.com

 

반응형

'pywin32 > win2kras' 카테고리의 다른 글

2. [pywin32] GetEapUserIdentity() 함수  (0) 2018.11.04

댓글()

1. [pywin32] 설치

안녕하세요~

pywin32를 사용하는 방법에 대해서 포스트 하고자 합니다.

 

먼저 pywin32는 python으로 winapi를 사용할 수 있게 해주는 라이브러리입니다.

 

제 블로그에서는 windows7 64bit환경에서 python 3.6.5pywin32 224버전을 사용합니다.

 

* 21년 10월 부터 Windows 10 64bit 환경에서 진행됩니다. 기존 코드 동작 시 문제가 발생한다면 댓글 부탁드립니다~

 

 

먼저 python3.6.5를 설치해보겠습니다.

 

1. https://www.python.org/downloads/ 에 접속한 후 원하는 파이썬 버전을 선택합니다.

 


 

2. 그 후 자신의 운영체제에 맞춰 설치 파일을 선택합니다. windows 64비트를 사용하신다면 빨간 네모 친 것을 선택하시면 됩니다.

 

 

3. 그 다음에는 설치 파일을 실행 시켜서 설치를 진행하시면 됩니다.ㅎㅎ

 

 

다음으로 pywin32를 설치해보겠습니다.

 

 

python을 설치하는 과정에서 pip라는 것이 설치 되어있을 겁니다.

 

 

설치한 파이썬 경로의 Scripts 폴더로 들어갑니다. 저의 경우에는

(C:\Users\Admin\AppData\Local\Programs\Python\Python36\Scripts)

 

 

인데요. 여기서 cmd 창을 열고 pip install pywin32 를 치시면 알아서 설치가 진행됩니다.ㅎㅎ

 

 

IDLE 창으로 설치가 제대로 됐는지 확인해 보겠습니다.

 

import win32api

 

를 입력해서 에러가 없다면 제대로 설치가 된것입니다.~

 

 

함수에 대한 설명 및 예제는 다음의 포스트를 참조해주시기 바랍니다~

 

[pywin32/pywin32 설치] - 2. [pywin32] 함수 설명 및 예제 정리

반응형

'pywin32 > pywin32 설치 및 사용법' 카테고리의 다른 글

2. [pywin32] 함수 설명 및 예제 정리  (0) 2020.07.25

댓글()