【问题标题】:script to backup, compress and clear eventlogs returns negative filesize value用于备份、压缩和清除事件日志的脚本返回负文件大小值
【发布时间】:2016-04-09 09:27:13
【问题描述】:

在工作中,我们收到越来越多的关于事件日志高使用率的警报(主要在安全日志中)。 为了解决这个问题,我们编写了一个脚本来自动复制、压缩和清除事件日志,并将其添加为计划任务。

到目前为止一切都很好,并且在许多服务器上运行良好。

但是,当日志最大文件大小设置为 2097152 kB 或更大时,该函数会返回一个负值(很可能是因为它超出范围,因为它以字节形式返回)。

提取失败的代码如下:

Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate, (Backup, Security)}!\\" & strServer & "\root\cimv2")
For Each Item in oWMI.ExecQuery("SELECT * FROM Win32_NTEventLogFile WHERE LogFileName='Security'")
    Report = Report & vbNewLine & " " & Item.LogFileName & " log" & vbNewLine & _
             "  Maximum size: " & (Item.MaxFileSize/1024) & " KB" & vbNewLine & _
             "  Current size: " & (Item.FileSize/1024) & " KB" & vbNewLine & _
             "  Usage percentage: " & _
             Round(((Item.FileSize * 100) / Item.MaxFileSize),2) & vbewLine

是否有任何解决方法或任何方法来编辑代码以使其支持 2097152 kB 及以上的日志最大文件大小,还是 GetObject() 函数的限制?

【问题讨论】:

  • 你为什么要把FileSize乘以100?我的建议是将文件大小以 KB 为单位保存在一个变量中,然后对此进行各种计算。最后一个词也有错字(vbewLine)。
  • 获取使用百分比,无论如何这不是问题,因为它有效。问题是 Item.FileSize 以字节为单位,当事件日志设置为 2097152 或更高时,它会得到一个负值。这就是一切都失败的地方
  • 这就是为什么您应该转换为 KB 并对其进行计算,因为数字会更小。

标签: windows vbscript automation event-log windows-server


【解决方案1】:

由于documented MaxFileSize 属性是一个无符号的 32 位整数值:

最大文件大小

数据类型:uint32
访问类型:读/写

但是,VBScript 无法识别无符号数据类型,因此该值会被误解。您需要自己更正它,例如像这样:

Function FixUInt32(val)
  If val >= 0 Then
    FixUInt32 = val
  Else
    FixUInt32 = 4294967296 + val
  End If
End Function

请注意,再次记录,有这么大的日志是可能的,但不推荐:

虽然事件日志的大小可以达到 4 GB,但实际上它们应该限制在不超过 300 MB。大于该值的事件日志可能难以分析,因为日志中包含的事件数量以及事件日志未针对数据检索进行优化。

【讨论】:

  • 感谢 Ansgar 提供的信息!
猜你喜欢
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多