2013-09-04 4 views
0

나는 액세스, 읽기, 쓰기, 삭제를 위해 파일을 감시해야하는 응용 프로그램을 빌드 중입니다.특정 항목에 대한 이벤트 로그를 실시간으로보고 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')]] "); 

같은 로그를 조회합니다.

어쨌든이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

답변

0

XDocument.Parse(logReader.ReadEvent().ToXml())의 출력을 확인 했습니까? ToXml()은 적절한 XDocument (헤더, 루트 요소 ...)를 생성합니까? 그게 문제 일 수 있습니다. 이 솔루션에 충실하지 않으면

그러나 Microsoft에서 FileSystemWatcher 또는 공식 파일 모니터링 도구를 사용을 시도 할 수 있습니다 : Filemon

+0

덕분에, 나는 좀 더 세부 내 질문에 편집. 나는 처음에는 xml을 얻지 않지만 지루한'System.NullReferenceException'을 얻었지만 쿼리를 변경하면 작동합니다. 이벤트 로그 FileSystemWatcher를 사용해야하고 다른 것들은 의문의 여지가 있습니다. – HansM

1

에서 InstanceID는 인덱스 값과 같은 값을 반환하지 않습니다.

올바른 ID

UInt16 eventid = (UInt16)(entry.Entry.InstanceId) 
0

에게 당신이 다음 이벤트를 검색하는() ReadEvent를 호출 할 때마다 얻을 수있는 다음 코드를 사용해보십시오. 조회는 하나의 이벤트 만 리턴합니다. 라인

xml = XDocument.Parse(logReader.ReadEvent().ToXml()); 

은 범인이다.

코드는 더 같이해야합니다 : 귀하의 답변에 대한

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); 

EventRecord eventInstance = logReader.ReadEvent(); 
if (eventInstance != null) 
{ 
    XDocument xml; 
    try 
    { 
     xml = XDocument.Parse(eventInstance.ToXml()); 
    } 
    catch (Exception e) 
    { 
     //This probably won't happen now. 
     break;  //We seem to have a newline character in the 
    } 
}