我正在尝试编写一个PowerShell脚本,该脚本将查询Active Directory中的所有服务器,并查看应用Windows Update的最后日期。
我遇到了一些麻烦,所以为了完成它,我创建了两个脚本,一个在Powershell中获取服务器,另一个在VBScript中查询最后一个日期。我找到了一个允许我查询上次安装日期的Powershell module,但它非常慢,特别是在远程服务器上。
这是PS代码:
Get-ADComputer -Filter 'OperatingSystem -like "*Server*"' -Properties * |
Select-Object Name | Sort-Object Name |
ForEach-Object {
Get-WUHistory -ComputerName $_.Name | Sort-Object Date,ComputerName -Descending |
Select-Object -First 1
}
它太慢了,几乎无法使用。
我有一些VBScript,我拼凑了很多很多。见下文:
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile ("servers.csv", 1)
server = ""
Do Until file.AtEndOfStream
line = file.Readline
server = line
'wscript.echo server
Set objSession = CreateObject("Microsoft.Update.Session", server)
If Err.Number <> 0 Then
'WScript.Echo server & " Error: " & Err.Number & " Error (Hex): " & Hex(Err.Number) & " Source: " & Err.Source & " Description: " & Err.Description
WScript.Echo server & " Communications Error"
Err.Clear
Else
Set objSearcher = objSession.CreateUpdateSearcher
Set colHistory = objSearcher.QueryHistory(1, 1)
For Each objEntry in colHistory
Wscript.Echo server & " " & objEntry.Date
Next
End If
Loop
file.Close
有没有一种简单的方法可以将VBScript的速度提升到Powershell代码中?
以下是有效的Powershell代码(再次修改):
$ErrorActionPreference= 'silentlycontinue'
Get-ADComputer -Filter 'OperatingSystem -like "*Server*"' -Properties * | Select-Object Name |
ForEach-Object {
If (Test-Connection $_.Name -Count 1){
Get-HotFix -ComputerName $_.Name | Sort-Object InstalledOn -Descending | Select-Object -First 1
}
else {
Write-host $_.Name " Connection Error"
}
} |
Sort-Object InstalledOn
答案 0 :(得分:9)
$ScriptBlock = {
$hash=@{}
$Session = New-Object -ComObject Microsoft.Update.Session
$Searcher = $Session.CreateUpdateSearcher()
$hash[$env:Computername] = $Searcher.QueryHistory(1,1) | select -ExpandProperty Date
$hash
}
Invoke-Command -ComputerName $serverlist -ScriptBlock $ScriptBlock
这会让你感觉像是
Name Value
---- -----
Server1 5/16/2014 2:11:42 PM
Server2 4/14/2014 1:55:03 PM
Server3 5/6/2014 5:36:51 PM
答案 1 :(得分:6)
Get-HotFix
满足您的需求吗?
Get-HotFix -ComputerName $_.Name | Measure-Object InstalledOn -Maximum
您的效果问题可能来自Get-ADComputer
。我会做一些故障排除,看看哪个部分会给你带来问题。
答案 2 :(得分:0)
(get-hotfix -computername SERVERNAME | sort installedon)[-1] >> c:\file.txt
这将为您提供上次安装的日期。在您针对所有服务器名称运行输出后,我只使用一些excel工作来清理输出。
从“get-help get-hotfix -full”获得该命令