JNA的使⽤及读取windows系统⽇志⽂件(EVTX⽂件)
(⼀)
近⽇客户提出需求,需要调研如何使⽤Java来读取Windows⽇志⽂件(类型:应⽤程序,安全,Setup,系统)。
⼀番调研以后,在仅使⽤java的基础上读取系统⽇志⽂件不太可能(就个⼈调研结果来看),原因如下:
1)系统⽇志⽂件(.evtx)是以机器码形式存储的,使⽤C++等语⾔(直接与机器打交道),可以直接读取且解析其内容。⽽使⽤
Java(JVM的存在,字节码级别的编译),意味这我们需要知道⽂件机器码的具体转化规则⽅可解析(微软没有提供相关的内容)
1 是否可以使⽤Java来调⽤C++⽅法?
JNA(Java Native Access)是可以让Java调⽤C++⽣成的DLL(动态链接库),将C++中的⽅法,以Java接⼝的⽅式来实现。与JNI不同的是,JNA可以直接调⽤本地的⼀些现有的库,⽽JNI则必须⾃⼰⼿动创建且⽣成动态链接库再进⾏调⽤。但是也有不⾜之处,JNA只能做到Java调⽤C++的代码,⽽JNI还允许C++调⽤Java的代码。具体的选择就看具体需求了。
2 JNA源码下载
两个jar包都需要下载,并且导⼊到⾃⼰的项⽬之中。
3 编写测试⽅法
项⽬⽬录:
测试⽅法:
@Test
public void testReadEventLogEntries2() {
Advapi32Util.EventLogIterator iter = new Advapi32Util.EventLogIterator("Application");
while (iter.hasNext()) {
Advapi32Util.EventLogRecord record = ();
StringBuffer data = new StringBuffer();
String[] str = Strings();
if (str == null) {
//若任务描述为空
} else {
for (String s : str) {
data.append(s);
}
}
WinNT.EVENTLOGRECORD record1 = Record();
//get event generated time
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String generatedTime = simpleDateFormat.format(new Date(record1.TimeGenerated.longValue() * 1000));
System.out.RecordNumber()
+ " Event ID: " + (short) EventId()
+ ", Event Type: " + Type()
+ ", Event Time: " + generatedTime
+ ": Event Category: " + String()
java jna
+ ", Event Source: " + Source()
+ ", Event Description: " + String());
}
}
结果:
4 实现原理
⾸先查看类Advapi32.java
可以看到该实例加载了⼀个本地动态链接库(Advapi32.dll),这个⽂件是Windows系统下⾃带的(没有的话还请⾃⾏下载)。
可以看到,这个接⼝实现了该链接库对应的OpenEventLog⽅法,第⼀个参数ServerName(⼀般置null),第⼆个参数代表⽇志类型(Application:应⽤程序;Security:安全;Setup;System:系统),其中安全⽇志需要将IDEA以管理员⾝份运⾏⽅可成功。
这就是利⽤JNA读取系统⽇志⽂件的核⼼部分。
不⾜的是,该⽅法仅能读取本机的⽇志⽂件,对于从别的电脑导出的⽇志⽂件的读取,暂时还⽆法实现(指定⽂件绝对路径来读取或是以⽂件类型做参数来读取),且需要⼈为指定系统⽇志的类型(Set
up类型还⽆法读取),后续将继续完善

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。