我需要一些方法来显示IP地址和主机名,基于下面的Win-Event查询:
脚本:
$date = Get-date -Format "dd-MM_hh_mm"
$FilePath = ([Environment]::GetFolderPath("Desktop") + "\DCOMErrors_$date.txt")
Clear-Host
Write-Host "`r`nGathering DCOM ID:10028 errors from $env:computername system"
$DCOM = Get-WinEvent System | Where-Object { ($_.ProviderName -like "Microsoft-Windows-DistributedCOM") -and ($_.ID -like "10028") }
Write-Host "`r`nProcessing DCOM messages"
$DCOMHash = New-Object "System.Collections.Generic.List[System.Object]"
$DCOM | ForEach-Object -Process {
$DCOMfr = $DCOMline.Message.IndexOf("computer", 1)
$DCOMto = $DCOMline.message.IndexOf("using")
$DCOMip = ""
$DCOMip = $DCOMline.message.substring($DCOMfr + 9, $DCOMto - $DCOMfr - 9)
$DCOMhostname = If ([System.Net.Dns]::GetHostEntry($DCOMip)) { [System.Net.Dns]::GetHostEntry($DCOMip) } else { try { [System.Net.Dns]::GetHostEntry($DCOMip) } catch { $_.Exception.Message } }
$DCOMhash += $DCOMip -replace '\.$'
}
Out-File -filepath
"Total DCOM Error Count: " + $DCOMhash.count | Export-Csv -FilePath $FilePath -Append
$DCOMhash | Group-Object | Sort-Object Count -Descending | Format-Table -Property Name, Count | Out-File -FilePath $FilePath -Append
Write-Host "Result of the script to gather the IPs with DCOM errors associated with them `r`n There is now a text file on the desktop with the output, Opening txt file in"
ii $FilePath上面的尝试不会产生有意义的结果,如下面的结果示例所示。
当前产出:
Total DCOM Error Count: 1000
Name Count
---- -----
1000预期结果:
> Total DCOM Error Count: 1000
> Name Hostname Count
> ---- -------- -----
> 1.1.1.1 AD01 400
> 1.1.2.2 AD02 300
> 2.2.2.2 N/A 500如果需要,以下是事件ID 10028的示例:
Log Name: System
Source: Microsoft-Windows-DistributedCOM
Date: 27/10/2020 12:57:25 PM
Event ID: 10028
Task Category: None
Level: Error
Keywords: Classic
User: SYSTEM
Computer: MON01.server-farm.com
Description:
DCOM was unable to communicate with the computer 1.1.1.1 using any of the configured protocols; requested by PID 61a0 (C:\Program Files (x86)\Common Files\SolarWinds\JobEngine.v2\SWJobEngineWorker2x64.exe).
> Event Xml: <Event
> xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
> <System>
> <Provider Name="Microsoft-Windows-DistributedCOM" Guid="{1B562E86-B7AA-4131-BADC-B6F3A001407E}" EventSourceName="DCOM"
> />
> <EventID Qualifiers="0">10028</EventID>
> <Version>0</Version>
> <Level>2</Level>
> <Task>0</Task>
> <Opcode>0</Opcode>
> <Keywords>0x8080000000000000</Keywords>
> <TimeCreated SystemTime="2020-10-27T01:57:25.776635700Z" />
> <EventRecordID>72256491</EventRecordID>
> <Correlation />
> <Execution ProcessID="976" ThreadID="9500" />
> <Channel>System</Channel>
> <Computer>MON01.server-farm.com</Computer>
> <Security UserID="S-1-5-18" /> </System> <EventData>
> <Data Name="param1">10.10.5.165</Data>
> <Data Name="param2"> 61a0</Data>
> <Data Name="param3">C:\Program Files (x86)\Common Files\SolarWinds\JobEngine.v2\SWJobEngineWorker2x64.exe</Data>
> <Binary>12934761728346172846987569874562345ABCDEF</Binary> </EventData> </Event>发布于 2020-10-27 08:03:38
在这个脚本中有几个问题。
首先,您要拉出所有的系统日志,然后过滤,这将是缓慢的。任何过滤器选项(filterhashtable、filterxpath、filterxml)都会大大加快速度。
第二,您正在运行一个Foreach-Object循环,但是当您应该引用$_时,您正在引用一些随机变量名$_。
第三,DCOMhostname正在尝试被填充,但是它再也没有被使用过。整个部分似乎被误导了。如果成功或失败,GetHostEntry将按“名称”运行两次。此外,还发现$DCOMip在最后有一个额外的空间,导致GetHostEntry为所有用户失败。
第四,随机Out-File -filepath
第五,文本“总量DCOM错误计数:”+ $DCOMhash.count正试图作为CSV导出。似乎您想在那里使用Set/Add内容。
第六,Format-Table只应用于控制台输出,而不是用于管道或写入文件。
第七,当这似乎是导出CSV的合适位置时,使用Out-File。
第八,您似乎试图按名称分组,但也希望在输出中获得主机名。您也可以将其添加到组对象-property中,但是如果每个名称有许多不同的主机名,则只会列出其中一个主机名。
尽管如此,这将使您获得名称(ip)和计数,以及$DCOMash变量中的名称和主机名。
$date = Get-date -Format "dd-MM_hh_mm"
$FilePath = ([Environment]::GetFolderPath("Desktop") + "\DCOMErrors_$date.txt")
Clear-Host
Write-Host "`r`nGathering DCOM ID:10028 errors from $env:computername system"
$DCOM = Get-WinEvent -FilterHashtable @{
LogName = 'System'
ProviderName = "Microsoft-Windows-DistributedCOM"
ID = "10028"
}
Write-Host "`r`nProcessing DCOM messages"
$DCOMHash = New-Object "System.Collections.Generic.List[System.Object]"
$DCOM | ForEach-Object -Process {
$DCOMfr = $_.Message.IndexOf("computer", 1)
$DCOMto = $_.message.IndexOf("using")
$DCOMip = ""
$DCOMip = $_.message.substring($DCOMfr + 9, $DCOMto - $DCOMfr - 9).trim()
try
{
$DCOMhostname = [System.Net.Dns]::GetHostEntry($DCOMip).hostname -replace '\.$'
}
catch
{
$DCOMhostname = "N/A"
}
$DCOMhash.Add([PSCustomObject]@{
Name = $DCOMip
HostName = $DCOMhostname
})
}
$DCOMhash | Group-Object -Property name | select name,count | Sort-Object Count -Descendinghttps://stackoverflow.com/questions/64549638
复制相似问题