Zapisywanie do logu systemowego Windows

0

Witam,

Potrzebuje, aby moja aplikacja zapisywala zdarzenia do logu systemowego z Win XP (chodzi o ten log w narzedziach administracyjnych, gdzie zapisywane sa rozne zdarzenia systemowe).

Jak to zrobic z poziomu zwyklego C/C++ (czyli Winapi)? Znalazlem kilka przykladow ale wszystkie dotyczyly managed C++ albo C#, czyli pod NET a mi chodzi o rozwiazanie natywne.

0

Ok to jest to - pozostaje jeszcze sprawa odczytu, ale tutaj chyba najlepsze bedzie WMI i WQL

0

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\Mój Program
EventMessageFile = "path do pliku z MESSAGETABLE resource"
TypesSupported = 0x00000004 // EVENTLOG_INFORMATION_TYPE

EventMessageFile może wskazywać na plik winlogon.exe ponieważ ma on uniwersalny wpis w zasobie MESSAGETABLE: %s, a jego id = 1073742825.

Zasób MESSAGETABLE tworzy się kompilując poniższy skrypt (plik .mc) programem \Visual Studio\Common7\Tools\Bin\mc.exe

MessageIdTypedef=DWORD
LanguageNames=(English=0x409:MSG00409)

SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS
    Informational=0x1:STATUS_SEVERITY_INFORMATIONAL
    Warning=0x2:STATUS_SEVERITY_WARNING
    Error=0x3:STATUS_SEVERITY_ERROR
)

FacilityNames=(System=0x0:FACILITY_SYSTEM
    Runtime=0x2:FACILITY_RUNTIME
    Stubs=0x3:FACILITY_STUBS
    Io=0x4:FACILITY_IO_ERROR_CODE
)
; // The following are message definitions.

MessageId=1    // to jest MSGSTRINGID dla ReportEvent()
Severity=Success
Facility=System
SymbolicName=MSG_BAD_COMMAND
Language=English
%1     // a to jest stringiem formatującym parametry LPCTSTR psz1[]
.

kompilacja: mc -d nazwa.mc
Zobacz też Message Compiler
Powstały plik .bin (tu: MSG00409.bin) dołączasz do pliku .rc jako1 MESSAGETABLE "MSG00409.bin"

Gdybyś chciał użyć pasywnie winlogona, to napisz tak (w logu będzie widoczny jako winlogon)

#include <windows.h>

int main()
{
	// parameters for format-string located in winlogon.exe MESSAGETABLE
	#define PARAMCOUNT 1
	LPCTSTR psz1[PARAMCOUNT] = {TEXT("4programmers.net/Forum")};

	HANDLE h = RegisterEventSource(0, TEXT("winlogon")); // winlogon jako źródło w eventlogu

	#define LOGTYPE  EVENTLOG_INFORMATION_TYPE
	#define CATEGORY 0
	#define DATALEN  0
	#define DATAPTR  0
	#define MSGSTRINGID 1073742825 // %s
	#define USERSID     0
	ReportEvent(h, LOGTYPE, CATEGORY, MSGSTRINGID, USERSID, PARAMCOUNT, DATALEN, psz1, DATAPTR);
	DeregisterEventSource(h);
}

Gdybyś chciał użyć swojego zasobu, to zmień string w RegisterEventSource na "Mój Program" i MSGSTRINGID (tu: na 1)

0

Dzieki, mam juz to rozpracowane, tutaj tez jest dobry artykul o tym http://www.codeproject.com/KB/system/mctutorial.aspx

Zastanawia mnie jeszcze jedna rzecz - czy da sie dodac swoja kategorie - mowa o tym po lewej stronie okna, to jest chyba FacilityNames? W przytoczonym przeze mnie tutorialu w ogole nie ma wpisu do tego.

Czemu podajesz to akurat tak?

FacilityNames=(System=0x0:FACILITY_SYSTEM
    Runtime=0x2:FACILITY_RUNTIME
    Stubs=0x3:FACILITY_STUBS
    Io=0x4:FACILITY_IO_ERROR_CODE
)

Dodanie wlasnej kategorii byloby co prawda niekonieczne ale bardzo pożądane. Klient do czytania logów i tak bedzie to filtrowal przez WQL, ale wolalbym zeby byly oddzielne wpisy dla mojego programu...

0

Czemu? Bo tak było w jakimś samplu z PSDK. Trochę z niego powycinałem i widać co zostało.

Kategorie dodajesz podobnie jak powyżej, z tym że mogą one być w osobnym pliku mc, lub w jednym pliku mc, byle jako pierwsze:

;// categories

MessageId       = 1
SymbolicName    = CATEGORY_ONE
Severity        = Success
Language        = English
Program error
.

MessageId       = 2
SymbolicName    = CATEGORY_TWO
Severity        = Success
Language        = English
Pointer error
.

;// The following are message definitions.

MessageId=3
Severity=Success
Facility=System
SymbolicName=MSG_UNIVERSAL
Language=English
%s
.

W rejestrze dopisujesz
CategoryMessageFile = "path do pliku z zasoobem z kategoriami"
CategoryCount = 0x00000002

Dla przytoczonego (mojego) przykładu zmieniasz CATEGORY na 1 lub 2, a MSGSTRINGID na conajmiej 3 (dla MSG_UNIVERSAL).

"Program error" i "Pointer error" będą wyświetlane w kolumnie kategorii.

0

Nie no to akurat wiem. Chodzi mi o dadanie wpisu do drzewa po lewej stronie okna - w XP tam jest Aplikacja, Zabezpieczenia, System, Internet Explorer.

Chce dodac tam swoj wpis i wszystkie logi wrzucac tam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1