首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EventSource未在Windows上记录事件

EventSource未在Windows上记录事件
EN

Stack Overflow用户
提问于 2015-08-07 15:50:11
回答 1查看 1.2K关注 0票数 2

我在Nuget上使用微软的EventSource Libary 1.1.25编写了一个ETW EventSource。EventSource的目的是将事件发送到我们维护的安全应用程序的自定义事件日志中。代码在本地工作,但我们无法将事件写入服务器上的事件日志。

EventSource被命名为(类似的) Company-Security,并将事件发送到Admin。在我的开发机器上,我可以用wevtutil注册事件源清单,并在Windows事件查看器中查看带有Admin日志的Company-Security文件夹。当我运行应用程序时,事件记录在事件日志中。

但是,当我将应用程序部署到测试服务器(运行Windows server 2012)时,事件日志记录无法工作。在我用wevtutil注册清单之后,日志将在事件查看器中创建并可见,尽管名称略有不同。使用一个名为Company-Security/Admin的日志创建一个名为Company-Security/Admin的文件夹。我还可以在服务器上运行perfview并查看创建的事件。但是,没有任何东西被写入事件日志。我还在EventSource代码中放置了一些调试语句,并且可以看到EventSource IsEnabled()正在返回true。

下面是我编写的事件源的基类和实现类的代码片段。

对于为什么事件日志记录在服务器上不工作,而在开发机器上工作,我已经研究过了,但是找不到任何解释。我想我错过了什么,但不确定是什么。

摘要基类:

代码语言:javascript
复制
    public abstract class SecurityEventsBase : EventSource {
    protected unsafe void WriteEvent(int eventId, long arg1, string arg2, string arg3) {
        if (IsEnabled()) {
            if (arg2 == null) {
                arg2 = "[not provided]";
            }
            if (arg3 == null) {
                arg3 = "[not provided]"; ;
            }
            fixed (char* arg2Ptr = arg2) {
                fixed (char* arg3Ptr = arg3) {

                    EventSource.EventData* dataDesc = stackalloc EventSource.EventData[3];
                    dataDesc[0].DataPointer = (IntPtr)(&arg1);
                    dataDesc[0].Size = 8;
                    dataDesc[1].DataPointer = (IntPtr)arg2Ptr;
                    dataDesc[1].Size = (arg2.Length + 1) * 2;
                    dataDesc[2].DataPointer = (IntPtr)arg3Ptr;
                    dataDesc[2].Size = (arg3.Length + 1) * 2;

                    WriteEventCore(eventId, 3, dataDesc);
                }
            }
        }
    }

EventSource类:

代码语言:javascript
复制
  [EventSource(Name="Company-Security",LocalizationResources="Events.Properties.Resources")]
public sealed class AuthorizationEvents : SecurityEventsBase {

    public static AuthorizationEvents Log = new AuthorizationEvents();

    [Event(2000,Level=EventLevel.Informational,Channel=EventChannel.Admin,Message="User '{1}' ({0}) logged in successfully from IP Address {2}")]
    public void Login(long UserId, string UserName, string IPAddress) {
        if (IsEnabled()) {
            WriteEvent(2000, UserId, UserName, IPAddress);
        }
    }
    ** additional events would follow here**
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-07 17:48:27

我终于解决了这个问题。它与存储在清单和二进制清单资源文件中的文件夹的权限有关。

我找到了这个StackOverflow答案,它帮助我解决了这个问题:https://stackoverflow.com/a/13090615/5202678

我必须将对文件夹的读取和执行权限授予本地用户组,授予存储清单文件的文件夹。一旦我这样做,事件立即开始记录在事件日志中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31881874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档