c# 이기는 하지만,. PowerShell 로도 가능.^^
이벤트로그의 Message 문자열에서 필요한 것만 정규편식으로 파싱.
- Windows 2000
4624 (성공) , 4648(시도)
계정 이름: UpdatusUser
원본 네트워크 주소: xxx.xxx.xxx.xxx
- Windows 2008 / R2
528(성공), 552 (시도)
사용자 이름: yeonpil
원본 네트워크 주소: xxx.xxx.xxx.xxx
로그온 유형: 5
운영체제 종류에 따라서 이벤트 코드가 다르므로 운영체제 구분 코드로 조건절 추가.
Version _ver = Environment.OSVersion.Version; string _osVer = _ver.Major.ToString() + "." + _ver.Minor.ToString(); // 5.2 , 6.1 ManagementObjectSearcher searcher
= new ManagementObjectSearcher("SELECT Message, TimeGenerated FROM Win32_NTLogEvent WHERE Logfile = 'Security' AND(" + _evtCode + ")");
string _Message; string _TimeGenerated; string _Account = ""; string _IpAddress = "";
foreach(ManagementObject obj in searcher.Get()) { _Message = obj["Message"].ToString(); _TimeGenerated = obj["TimeGenerated"].ToString();
Regex regex1 = new Regex(_AccountString + ":(.+)\r"); Regex regex2 = new Regex("원본 네트워크 주소:(.+)\r");
MatchCollection match1 = regex1.Matches(_Message);
if (match1.Count > 0) { _Account = match1[1].Groups[1].Value.Trim(); }
Match match2 = regex2.Match(_Message);
if (match2.Success) { _IpAddress = match2.Groups[1].Value.Trim(); }
Console.WriteLine(_Account + ":" + _IpAddress + "\t" + wmiDateConvert(_TimeGenerated)); }
아래와 같은 코드도 사용 가능 foreach(System.Diagnostics.EventLogEntry entry in _evt.Entries) { string _EventCode = Convert.ToString(entry.InstanceId & 0xFFFF); if (_EventCode == "552") {} }
참 쉽죠잉~~~ ? 헐.
닷넷프레임워크 3.5 / 4.0 인 경우에는 System.Diagnostics.Eventing.Reader 클래스를 이용해서도 가능
참고 http://phejndorf.wordpress.com/2011/03/31/using-c-and-linq-to-read-a-windows-eventlog-file-evtx/