gpt4 book ai didi

c# - 在应用程序和设置日志下的子目录中创建事件日志

转载 作者:行者123 更新时间:2023-12-04 18:06:06 24 4
gpt4 key购买 nike

我一直在寻找一种方法来在 Applications and Services Logs 的子目录下创建多个单独的事件日志。 , 以同样的方式有一个子目录 Microsoft然后它有一个子目录Windows然后使用应用程序登录的各种其他目录。

  • 应用程序和服务\Microsoft\Windows\All-User-Install-Agents
  • 应用程序和服务\Microsoft\Windows\AppHost
  • ...

  • 我想创建如下内容
  • 应用程序和服务\我的公司\应用程序 1
  • 应用程序和服务\我的公司\应用程序 2
  • 应用程序和服务\我的公司\应用程序 3

  • 我遇到的所有样本都只允许你直接在 Applications and Services下创建日志目录而不是创建子目录。
    谢谢

    最佳答案

    如果仍然需要,我为我找到了一个很好的工作解决方案,尽管它使用的是 Powershell 而不是 C#。
    你需要2个步骤:

  • 创建日志本身
  • 创建(如果需要)事件源

  • 这是我用于创建位于 Custom EventLog 的子文件夹的代码:
    function New-WindowsCustomLog
    {
    <#
    .SYNOPSIS
    Create a custom Eventlog

    .DESCRIPTION
    This function will create a new eventlog located under 'Application and Serviceprotocolls' using a company subfolder and if needed additional functional subfolder.

    .PARAMETER PrimaryKey
    Mostly used for the company name.

    .PARAMETER ApplicationName
    Application name.

    .PARAMETER ApplicationFunction
    Optional: If you need to create another subfolder for functions.

    .PARAMETER LogName
    The name of the Log itself.

    .PARAMETER ProviderGUID
    Provider/Publisher GUID, if you don't have one, create by using New-GUID enter without {} around.

    .EXAMPLE
    New-WindowsCustomLog -PrimaryKey 'My Company' -ApplicationName 'My Cool Tool' -LogName 'Operational' -ProviderGUID '{49ab7419-7113-40d1-8910-8be1c3f96d21}'

    .EXAMPLE
    New-WindowsCustomLog -PrimaryKey 'My Company' -ApplicationName 'My Cool Tool' -ApplicationFunction 'Incoming' -LogName 'Requests' -ProviderGUID '{49ab7419-7113-40d1-8910-8be1c3f96d21}'
    New-WindowsCustomLog -PrimaryKey 'My Company' -ApplicationName 'My Cool Tool' -ApplicationFunction 'Outgoing' -LogName 'Requests' -ProviderGUID '{49ab7419-7113-40d1-8910-8be1c3f96d21}'

    #>
    [CmdletBinding()]
    param
    (
    [Parameter(Mandatory = $true,
    Position = 0)]
    [string]$PrimaryKey,
    [Parameter(Mandatory = $true,
    Position = 1)]
    [string]$ApplicationName,
    [Parameter(Position = 2)]
    [string]$ApplicationFunction,
    [Parameter(Mandatory = $true,
    Position = 3)]
    [string]$LogName,
    [Parameter(Mandatory = $true,
    Position = 4)]
    [String]$ProviderGUID
    )
    $publisherGuid = "{$($ProviderGUID)}"
    $primaryLocation = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\WINEVT\Channels'
    $secondaryLocation = 'HKLM:\SYSTEM\CurrentControlSet\Services\EventLog\Application'
    #$thirdLocation = 'HKLM:\SYSTEM\CurrentControlSet\Services\EventLog\System' # needed for driver purposes
    $publisher = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers'

    if (-not ([string]::IsNullOrEmpty($ApplicationFunction)))
    {
    $primaryLogName = $PrimaryKey + '-' + $ApplicationName + '-' + $ApplicationFunction + '§' + $LogName
    $secondaryLogName = $PrimaryKey + '-' + $ApplicationName + '-' + $ApplicationFunction
    }
    else
    {
    $primaryLogName = $PrimaryKey + '-' + $ApplicationName + '-' + '§' + $LogName
    $primaryLogNameSlash = $primaryLogName.Replace("§", "/")
    $secondaryLogName = $PrimaryKey + '-' + $ApplicationName
    }
    $evtxFilePath = "%SystemRoot%\System32\Winevt\Logs\$($secondaryLogName)%4$($LogName).evtx"
    $primaryEventRoot = Join-Path -Path $primaryLocation -ChildPath $primaryLogName
    $secondaryEventRoot = Join-Path -Path $secondaryLocation -ChildPath $secondaryLogName
    #$thirdEventRoot = Join-Path -Path $thirdLocation -ChildPath $secondaryLogName # needed for driver purposes
    $publisherEventRoot = Join-Path -Path $publisher -ChildPath $publisherGuid
    if (-not (Test-Path $primaryLogNameSlash)) #$primaryEventRoot.Replace("§", "/")))
    {
    &reg add $primaryLogNameSlash.Replace(":", "") # used because I wasn't able to write a real / to registry key name by CMDLET
    New-ItemProperty -Path $primaryLogNameSlash -Name 'Enabled' -PropertyType DWord -Value 1
    New-ItemProperty -Path $primaryLogNameSlash -Name 'Type' -PropertyType DWord -Value 1
    New-ItemProperty -Path $primaryLogNameSlash -Name 'Isolation' -PropertyType DWord -Value 0
    New-ItemProperty -Path $primaryLogNameSlash -Name 'RestrictGuestAccess' -PropertyType String -Value "1"
    New-ItemProperty -Path $primaryLogNameSlash -Name 'OwningPublisher' -PropertyType String -Value $publisherGuid
    }
    if (-not (Test-Path $secondaryEventRoot))
    {
    New-Item -Path $secondaryEventRoot
    New-ItemProperty -Path $secondaryEventRoot -Name 'ProviderGuid' -PropertyType String -Value $publisherGuid
    New-ItemProperty -Path $secondaryEventRoot -Name 'File' -PropertyType ExpandString -Value $evtxFilePath
    }
    <# needed for driver purposes
    if (-not (Test-Path $thirdEventRoot))
    {
    New-Item -Path $thirdEventRoot
    New-ItemProperty -Path $thirdEventRoot -Name 'ProviderGuid' -PropertyType String -Value $publisherGuid
    #New-ItemProperty -Path $thirdEventRoot -Name 'EventMessageFile' -PropertyType ExpandString -Value $evtMessageFile
    }
    #>
    if (-not (Test-Path $publisherEventRoot))
    {
    New-Item -Path $publisherEventRoot -Value $secondaryLogName
    New-ItemProperty -Path $publisherEventRoot -Name 'Enabled' -PropertyType DWord -Value 1
    $channelReference = Join-Path -Path $publisherEventRoot -ChildPath "ChannelReference"
    New-Item -Path $channelReference
    New-ItemProperty -Path $channelReference -Name 'Count' -PropertyType DWord -Value 1
    $reference0 = Join-Path -Path $channelReference -ChildPath "0"
    New-Item -Path $reference0 -Value $primaryLogName.Replace("§", "/")
    New-ItemProperty -Path $reference0 -Name 'Flags' -PropertyType DWord -Value 0
    New-ItemProperty -Path $reference0 -Name 'Id' -PropertyType DWord -Value 16
    }
    return $primaryLogNameSlash
    }

    接下来是创建事件源的简单函数(如果日志可用且源尚未注册):
    function New-WindowsEventSource
    {
    [CmdletBinding()]
    param
    (
    [Parameter(Mandatory = $true,
    Position = 0)]
    [ValidateScript({ [System.Diagnostics.EventLog]::Exists($_) })]
    [string]$EventLogName,
    [Parameter(Mandatory = $true,
    Position = 1)]
    [ValidateScript({ (-not ([System.Diagnostics.EventLog]::SourceExists($_))) })]
    [string]$EventSourceName
    )
    [System.Diagnostics.EventLog]::CreateEventSource($EventSourceName, $EventLogName)
    }

    这是创建源/填充 EventLog 的方法:
    New-WindowsEventSource -EventLogName "My Company-My Cool Tool-Incoming/Requests" -EventSourceName "webbrowser"

    Write-EventLog -LogName "My Company-My Cool Tool-Incoming/Requests" -Source "webbrowser" -EntryType Information -EventId 100 -Message "New request received."

    亲切的问候和快乐的编码

    关于c# - 在应用程序和设置日志下的子目录中创建事件日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26335960/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com