我有一个脚本来读取应用程序和系统事件日志的最后30个条目,目前这些脚本只能在我的机器上运行,只输出部分消息(例如,见下文)。
411905 May 05 15:05信息Microsoft-Windows ... 1501已成功处理用户的组策略设置。自上次succ以来没有检测到任何变化...
任何人都可以告诉我如何完成以下工作
到目前为止我的脚本是这样的
Get-EventLog -LogName Application -Newest 30 -ComputerName MYCOMPUTER | Out-File -FilePath "D:\Test\Application Event Logs.txt"
Get-EventLog -LogName System -Newest 30 -ComputerName MYCOMPUTER | Out-File -FilePath "D:\Test\System Event Logs.txt"
我是脚本新手,并认为这可能是一个有用的脚本,但我无法让它工作。
答案 0 :(得分:3)
如果您指的是其他域中的计算机,那么我认为您不能单独使用该cmdlet。
相反,您可以使用PowerShell远程处理来运行远程计算机上存在的任何powershell命令。但是您必须在远程计算机上设置远程计算机,并使用SSL或可信主机,并使用显式凭据来确保允许连接:
$credential = Get-Credential # enter credentials for remote machine
$session = New-PSSession -ComputerName REMOTECOMPUTER -Credential $credential
Invoke-Command -Session $session -ScriptBlock {
Get-EventLog # parameters
}
重要的是要注意Get-WinEvent
返回的内容是一个复杂的对象。您在屏幕上显示的内容只是一个视图。将其直接写入文件也只是一个视图。相反,明确地弄清楚你想要什么,构建一个字符串,然后将其写入文件。
首先将cmdlet的结果分配给变量,以便您可以检查它:
$events = Get-WinEvent #params
现在你可以查看结果:
$events | Get-Member # see what properties are available
那么你可以看到Message
是一个属性。
要获取该消息,您可以使用Select-Object
,因为您希望将其作为字符串而不是属性,所以-ExpandProperty
:
$events | Select-Object -ExpandProperty Message | Out-File #etc
这会写出所有消息(但没有其他信息)。
实际上,您可能希望对返回的每个日志条目进行操作,并构建字符串以写入文件:
$events | ForEach-Object {
# $_ represents the current object
$msg = $_.Message
$id = $_.Id
$timeCreated = $_.TimeCreated
"A log entry with ID $id was created at $timeCreated, and it says:`r`n`r`n$msg`r`n---------`r`n"
} | Out-File #params
假设您事先知道要检查的计算机名称,请将其放入变量中,然后将其嵌入文件名中:
$computer = 'MYCOMPUTER'
Get-WinEvent -ComputerName $computer | ForEach-Object {
# do stuff like above
} | Out-File -Path "D:\Whatever\$computer Application Log"