查看Windows安全事件日志的最小F#示例

查看Windows安全事件日志的最小F#示例,f#,event-log,F#,Event Log,这不会将任何事件打印到控制台(在“侦听新的安全事件…”之后),但当我启动事件查看器应用程序时,它会显示即将到来的安全事件。想想我可能做错了什么 open System open System.Diagnostics open System.Security.Principal open System.Threading let logName = "security" let DumpEventLog desc = use log = new System.Diagn

这不会将任何事件打印到控制台(在“侦听新的安全事件…”之后),但当我启动事件查看器应用程序时,它会显示即将到来的安全事件。想想我可能做错了什么

open System
open System.Diagnostics
open System.Security.Principal
open System.Threading

let logName = "security"

let DumpEventLog desc =
  use log = new System.Diagnostics.EventLog (logName, desc)
  log.EnableRaisingEvents <- true;
  printfn "listening for new security events...";
  log.EntryWritten.Add (fun ent ->
    let ent = ent.Entry in
    printfn "entry written: %d %s %s" ent.InstanceId (ent.TimeGenerated.ToString())
      ent.Message);
  
[<EntryPoint>]
let main _argv =
  let isAdministrator =
    let id = WindowsIdentity.GetCurrent () in
    let p = WindowsPrincipal id in
    p.IsInRole WindowsBuiltInRole.Administrator
  in
  let () =
    if not isAdministrator
    then printfn "need admin privs to run!"
    else DumpEventLog "."
  in
  while true do
    Thread.Sleep 5000
  done;
  0
开放系统
开放系统诊断
开放系统.Security.Principal
开放系统。线程
让logName=“安全性”
让DumpEventLog描述=
使用日志=new System.Diagnostics.EventLog(日志名,desc)
log.EnableRaisingEvents
让ent=ent.Entry输入
printfn“写入的条目:%d%s%s”ent.InstanceId(ent.TimeGenerated.ToString())
(信息);
[]
让main_argv=
让我来做行政官=
让id=WindowsIdentity.GetCurrent()进入
让p=WindowsPrincipal id进入
p、 IsInRole WindowsBuiltInRole.Administrator
在里面
让()=
如果不是我的管理者
然后打印fn“需要管理员权限才能运行!”
else DumpEventLog“
在里面
尽管如此
线程。睡眠5000
完成;
0

我认为这与程序的编写方式有关。例如,当DumpEventLog()退出时,日志被释放,但程序会休眠五秒钟。我看不出在那种状态下它怎么能捕捉到事件

这对我很有用:

open System.Diagnostics
open System.Threading

[<EntryPoint>]
let main _argv =
    use log = new EventLog ("security", ".")
    log.EnableRaisingEvents <- true
    printfn "listening for new security events..."

    log.EntryWritten.Add (fun e -> 
        printfn "Entry written: %d %O %s" e.Entry.InstanceId e.Entry.TimeGenerated e.Entry.Message)

    Thread.Sleep Timeout.Infinite
    
    0
开放式系统诊断
开放系统。线程
[]
让main_argv=
使用日志=新事件日志(“安全性”、“安全性”)
log.EnableRaisingEvents
printfn“写入的条目:%d%O%s”e.Entry.InstanceId e.Entry.TimeGenerated e.Entry.Message)
线程。睡眠超时。无限
0