나는 액세스, 읽기, 쓰기, 삭제를 위해 파일을 감시해야하는 응용 프로그램을 빌드 중입니다.특정 항목에 대한 이벤트 로그를 실시간으로보고 XML 데이터도 얻는 방법은 무엇입니까?
Windows 7 Pro에서 기본 제공되는 감사 시스템을 사용하고 있습니다. gpedit.msc에서이 파일을 실행 한 다음 감시 할 파일에 대한 감사 플래그를 설정하면 보안 로그에 항목이 표시됩니다. 내가 이렇게 할 실시간으로 보안 로그를보고 수행 할 작업을
는 :
static EventLog securityLog = new EventLog("Security", System.Environment.MachineName);
securityLog.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten);
securityLog.EnableRaisingEvents = true;
이 작동하고 내 OnEntryWritten
α- 함수를 호출합니다.
public static void OnEntryWritten(object source, EntryWrittenEventArgs entry)
entry.Entry
내게는 추가 정보가 포함 beecause 내가 필요로하는 항목의 XML-속성에 대한 액세스 권한을 부여하지 않는 것 EntryWrittenEventArgs.Entry
속성입니다. 나는 내가 EventLogReader
에서 얻을 이벤트의 eventInstance.RecordId
해야 entry.Entry.Index
를 얻을 수 있기 때문에
은 내가 나중에 할 노력하고있어, 다른 EventLogReader
를 통해 이벤트 로그를 조회하는 것입니다. 직접 이벤트 로그에 XPath 쿼리로
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">">*[System[(EventRecordID=181616)]]</Select>
</Query>
</QueryList>
작품, 그것은 단지 하나 개의 항목을 다시 제공합니다.
string query = "*[System[(EventRecordID=" + entry.Entry.Index + ")]]";
// Create Event Log Query and Reader
EventLogQuery eventsQuery = new EventLogQuery("Security",
PathType.LogName,
query);
EventLogReader logReader = new EventLogReader(eventsQuery);
// For each event returned from the query
for (EventRecord eventInstance = logReader.ReadEvent(); eventInstance != null; eventInstance = logReader.ReadEvent())
{
if (eventInstance.RecordId == entry.Entry.Index) //RecordId and Index are the same thing: the identifier of the record/entry.
{
XDocument xml;
try
{
xml = XDocument.Parse(logReader.ReadEvent().ToXml());
}
catch (Exception e)
{
//logger.Write(e.Message.ToString());
break; //We seem to have a newline character in the logReader.ReadEvent() sometimes, but nothing else, so we can safely break here or completely ignore it.
}
XML을 가져 오려고하면이 작업이 실패합니다. 그 이유는 무엇입니까?
"개체 참조가 개체의 인스턴스로 설정되지 않았습니다." System.NullReferenceException
입니다. 이 오류가 실제로 어떻게 발생할 수 있는지 잘 모르겠습니다.
나는 그것이 문제없이 작동이
EventLogQuery eventsQuery = new EventLogQuery("Security",
PathType.LogName,
"*[EventData[Data[@Name='ObjectType'] and (Data='File')]] ");
같은 로그를 조회합니다.
어쨌든이 작업을 수행하는 가장 좋은 방법은 무엇입니까?
덕분에, 나는 좀 더 세부 내 질문에 편집. 나는 처음에는 xml을 얻지 않지만 지루한'System.NullReferenceException'을 얻었지만 쿼리를 변경하면 작동합니다. 이벤트 로그 FileSystemWatcher를 사용해야하고 다른 것들은 의문의 여지가 있습니다. – HansM