如何使用PHP读取XML Microsoft事件日志

时间:2015-05-28 21:36:55

标签: children

这是我在php中使用XML的第一次尝试。我想要做的是找到编码来读取从Windows事件查看器导出的XML日志。我认为我与儿童部分有问题,并学习如何阅读2个部门。现在我正在使用从php网站上找到的代码,并且仍在测试它。

我可以从系统部分读取信息,但不能从下一个子EventData读取信息。

提前感谢您的所有帮助

<?php
$xml = simplexml_load_file("admin/xml/events.xml") or die("Error: Cannot create object");
if(!$xml){
    echo "No Go!";
    br();
}
else{
    echo "Good To Go!";
    br();
}

foreach ($xml->children() as $second_gen) {

    foreach ($second_gen->children() as $third_gen) {
        echo ' who begot a ' . $third_gen->EventID . ';';br();


   }
   foreach ($second_gen->children() as $fourth_gen->EventData) {
            echo ' and that ' . $fourth_gen->EventID .
                ' begot a ' . $fourth_gen->Data['SubjectUserSid'];br();
        }
}
?>

这是我的XML

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Events>
    <Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
        <System>
            <Provider Name='Microsoft-Windows-Security-Auditing' Guid='{54849625-5478-4994-a5ba-3e3b0328c30d}'/>
            <EventID>4656</EventID>
            <Version>0</Version>
            <Level>0</Level>
            <Task>12804</Task>
            <Opcode>0</Opcode>
            <Keywords>0x8020000000000000</Keywords>
            <TimeCreated SystemTime='2015-04-06T19:54:07.248Z'/>
            <EventRecordID>6426</EventRecordID>
            <Correlation/>
            <Execution ProcessID='4' ThreadID='88'/>
            <Channel>Security</Channel>
            <Computer>CCS03.clearcreek.local</Computer>
            <Security/>
        </System>
        <EventData>
            <Data Name='SubjectUserSid'>S-1-5-18</Data>
            <Data Name='SubjectUserName'>CCS03$</Data>
            <Data Name='SubjectDomainName'>CLEARCREEK0</Data>
            <Data Name='SubjectLogonId'>0x3e7</Data>
            <Data Name='ObjectServer'>PlugPlayManager</Data>
            <Data Name='ObjectType'>Security</Data>
            <Data Name='ObjectName'>PlugPlaySecurityObject</Data>
            <Data Name='HandleId'>0x0</Data>
            <Data Name='TransactionId'>{00000000-0000-0000-0000-000000000000}</Data>
            <Data Name='AccessList'>%%1553</Data>
            <Data Name='AccessMask'>0x2</Data>
            <Data Name='PrivilegeList'>-</Data>
            <Data Name='RestrictedSidCount'>0</Data>
            <Data Name='ProcessId'>0x394</Data>
            <Data Name='ProcessName'>C:\Windows\System32\svchost.exe</Data>
        </EventData>
    </Event>
</Events>

4 个答案:

答案 0 :(得分:0)

你的循环不正确:

foreach ($second_gen->children() as $third_gen) {
          ^^^^^^
foreach ($second_gen->children() as $fourth_gen->EventData) {
          ^^^^^^

第二个循环不应该是$third_gen吗?

答案 1 :(得分:0)

我没有理由从PHP读取事件查看器,因为PHP是一种主要用于Web开发的语言,而事件Wiever则用于监视和收集有关服务器中发生的事情的详细信息。 ; te男性意识一起工作,将事件查看器信息暴露给PHP可以让某人读取您的服务器事件,这对您的服务器安全性来说是非常危险的。

当然,您的目标可以从不同的角度实现,具有更好的安全性,您可以解释您的要求和范围,会有更好的方法,我不建议发送或阅读Evwnt来自服务器外部的查看器没有强大的安全性。我也很乐意帮助你。

答案 2 :(得分:0)

如果您可以发布导出日志,它会有所帮助,虽然我建议在“带事件的系统”服务器中实现一个应用程序,读取xml并导出相关数据并将后处理事件数据发送到“apache server” 。导出的数据不应该是系统中发生的非常详细的事件,我假设Apache Server是您要查看事件的位置,此访问应该在login / password下。希望这可以帮助。请注意,此方法是将详细信息从服务器a发送到服务器b,而不是通过php读取事件详细信息。

答案 3 :(得分:0)

如果您仍在考虑推送数据,我认为您发布的代码中的问题是迭代,您应该像现有的那样迭代事件列表,但在内部您可以直接访问系统和数据$ second_gen-&gt ; System和$ second_gen-&gt; EventData,请参阅velos和示例:

foreach ($xml->children() as $second_gen) {
// access to variable $second_gen->System and its properties
echo 'system: ' + $second_gen->System->EventID

// also you can access to data section 
echo 'data: ' + $second_gen->EventData->ProcessID

}