1

如何在不使用 try catch 的情况下验证事件日志写入权限?我已阅读以下问题:Checking Event Log writing Permissions without writing an entry,但答案建议使用EventLogPermissionAttribute. 据我所知,我不能使用它来验证权限,它只是Exception在没有请求的权限时抛出一个。

我的代码现在看起来像这样:

public void WriteMessage(string message)
{
    try {
        var trace = new TraceSource("MySource");
        trace.TraceEvent(TraceEventType.Information, 1000, message);
    } catch() {
        var log = LogManager.GetLogger<MyClass>();
        log.Info(message);
    }
} 

但我想要这样的东西:

public void WriteMessage(string message)
{
    if(EventLogPermission("MySource"))
    {
        var trace = new TraceSource("MySource");
        trace.TraceEvent(TraceEventType.Information, 1000, message);
    } else {
        var log = LogManager.GetLogger<MyClass>();
        log.Info(message);
    }
}

当然,最后它并没有太大的区别,但是使用 try catch 进行逻辑只是感觉很脏。

4

2 回答 2

1
    [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
    public static extern int RegOpenKeyEx(
      UIntPtr hKey,
      string subKey,
      int ulOptions,
      int samDesired,
      out UIntPtr hkResult);

    public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);
    public static int KEY_WRITE = 0x20006;

    /// <summary>
    /// This method checks write permissions to HKLM\SYSTEM\CurrentControlSet\Services\EventLog which is necessary to create event log source
    /// </summary>
    /// <returns>True if permission to create Event log source is granted, false if not</returns>
    public bool HasCurrentUserEventLogWritePermissions()
    {
        UIntPtr x;
        long err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, @"SYSTEM\CurrentControlSet\Services\EventLog", 0, KEY_WRITE, out x);
        return err == 0;
    }
于 2014-07-23T19:47:48.713 回答
0

好的。我放弃了,这只是为了告诉你失败的尝试。我搜索了一下,反映了一点,答案令人失望:你不能按照你喜欢的方式做这件事。

我试图找到一种方法来检查EventLogPermission(一般的安全权限)而不会出现异常:FAILED。

尝试打开 RegKey 而不出现异常:失败。

实际上有一些非托管 API可能有用,但我认为如果您的应用程序缺少甚至EventLogPermission谁会提供它SecurityUnmngdCodeAccess

于 2014-07-24T11:53:12.247 回答