2

我正在尝试将一些消息写入 Windows 事件日志。

调用函数“SourceExists()”时将抛出(安全)异常。

private bool CheckIfEventLogSourceExits()
    {
        try
        {
            if (!EventLog.SourceExists(this.BaseEventLog))
            {
                return false;
            }
            return true;
        }
        catch (System.Security.SecurityException)
        {
            return false;
        }
    }

这个问题的所有答案都在解释如何手动解决问题。像这里:Stackoverflow 线程。解决方案是更改一些注册表项

但是您不能期望使用您的应用程序的每个人都知道这些更改。

所以我的问题是,我们如何以编程方式解决这个问题?

在我的代码下面:

 try
            {
                string sLog = "Application";
                if (CheckIfEventLogSourceExits())
                {
                    EventLog.CreateEventSource(this.BaseEventLog, sLog);
                }

                EventLog.WriteEntry(this.BaseEventLog, message, eventLogEntryType);
            }
            catch (Exception ex)
            {
                ex.Source = "WriteToEventLog";
                throw ex;
            }
4

1 回答 1

-2

我知道发布此帖子为时已晚,但我从类似的经验中找到的答案是,您运行的服务没有机器的管理权限,因此无法写入日志。

很容易确定应用程序是否在管理员权限下运行。您可以在代码中添加类似这样的内容,并带有一个建议用户运行“admin”的消息框。

private void GetServicePermissionLevel()
{
bool bAdmin = false;
try {
    SecurityIdentifier sidAdmin = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
    AppDomain myDomain = Thread.GetDomain();
    myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
    WindowsPrincipal myPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
    if (myPrincipal.IsInRole(sidAdmin)) {
        bAdmin = true;
    } else {
        bAdmin = false;
    }
} catch (Exception ex) {
    throw new Exception("Error in GetServicePermissionlevel(): " + ex.Message + " - " + ex.StackTrace);
} finally {
    _ServiceRunAsAdmin = bAdmin;
}
}
于 2014-02-14T15:13:24.380 回答