Win7:从事件源注销事件日志

本文关键字:事件 日志 注销 事件源 Win7 | 更新日期: 2023-09-27 18:22:12

不久前,我学习了MSDN中关于如何编写windows服务的示例。它包括以下代码:

    public Monitor_Processes()
    {
        InitializeComponent();
        if (!System.Diagnostics.EventLog.SourceExists("Monitor_Processes"))
        {
            System.Diagnostics.EventLog.CreateEventSource("Monitor_Processes", "Monitor_Processes_Log");
        }
        eventLog1.Source = "Monitor_Processes";
        eventLog1.Log = "Monitor_Processes_Log";
    }

它安装得还可以,但我在启动服务时遇到了一个错误。当我检查事件日志时,它说:"源‘Monitor_Processes’没有在日志‘Monitor_Processes_log’中注册。(它在日志‘Application’中注册了。)"

从那以后,我把代码改成了这样:

    public Monitor_Processes()
    {
        InitializeComponent();
        if (!System.Diagnostics.EventLog.SourceExists("Monitor_Processes"))
        {
            System.Diagnostics.EventLog.CreateEventSource("Monitor_Processes", "");
        }
        eventLog1.Source = "Monitor_Processes";
    }

但现在,即使在卸载和重新启动后,我在尝试启动服务时仍然会遇到同样的错误(错误消息仍然指向"Monitor_Processes_Log")。

如何重新启动并将我的源注册到应用程序日志中(假设届时我的服务将成功启动)?

Win7:从事件源注销事件日志

您应该删除源

System.Diagnostics.EventLog.DeleteEventSource("Monitor_Processes");

顺便说一句,我建议您不要在执行服务期间尝试检查源是否存在并创建它。EventLog.SourceExists()方法在Windows 7和Windows Server 2008 R2上需要管理权限,因为它试图检查安全日志。您应该在ServiceInstaller类中添加这些检查/创建语句。

如果可能的话,不要让你的Windows服务需要本地管理员。

编辑:要手动创建事件日志源,也可以使用PowerShell。

param (
    $logName = "Application",
    $source = $(Read-Host -prompt "Enter EventLog source"),
    $machineName = ".",
    [switch]$verbose
)
function createEventSource() {
    if (![System.Diagnostics.EventLog]::SourceExists($source, $machineName)) {
        [System.Diagnostics.EventLog]::CreateEventSource($source, $logName, $machineName)  
         Write-VerboseHost "Created source $source in log $logName."
    } else {
         Write-VerboseHost "Source $source in log $logName already exists."
    }
}
function help() {
    "Usage: Create-EventSource -source string [-machineName string] [-verbose]"
    exit
}
function Write-VerboseHost($message) {
    if ($verbose) {
        Write-Host $message
    }
}
if (!$source) { help }