Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Дата последнего обновления серверов (http://forum.oszone.net/showthread.php?t=309353)

pogo 18-12-2015 12:56 2586122

Дата последнего обновления серверов
 
Добрый день!

Подскажите, как можно получить дату последнего обновления списка серверов?
Есть такой вариант:

Код:

cls
$ScriptBlock = {
  $hash=@{}
  $Session = New-Object -ComObject Microsoft.Update.Session
  $Searcher = $Session.CreateUpdateSearcher()
  $hash[$env:Computername] = $Searcher.QueryHistory(1,1) | select -ExpandProperty Date
  $hash
}

$server_list = cat d:\server_list.txt

foreach ($server in $server_list) {
  Invoke-Command -ComputerName $server -ScriptBlock $ScriptBlock
}

Но этот вариант не на всех серверах работает. На некоторых возвращается ошибка, о недоступности RPC...

Цитата:

[host-1234] Connecting to remote server host-1234 failed with the following error message : WinRM cannot complete the operation. Verify that the specified computer name is valid, that the computer is accessible over the network, and that a firewall exception for the WinRM service is enabled and allows access from this computer. By default,
the WinRM firewall exception for public profiles limits access to remote computers within the same local subnet. For more information, see the about_Remote_Troubleshooting Help topic.
+ CategoryInfo : OpenError: (host-1234:String) [], PSRemotingTransportException
+ FullyQualifiedErrorId : WinRMOperationTimeout,PSSessionStateBroken
Альтернативный вариант, получать по wmi, но с ним тоже проблемы, он возвращается неправильные даты.

Код:

$server = "host-1234"
Get-HotFix -computername $server | where {$_.InstalledOn} | sort InstalledOn -desc | select InstalledOn -First 1

Вероятно это связано с региональными настройками. Например, последнее обновление было 18.12.2015, а выводит 12.10.2015. Даже если прикинуть, что он выводит в формате MM/dd/YYYY. Дата всё равно не верная...

Kazun 19-12-2015 12:18 2586386

Код:

$server = $env:ComputerName
$key = "SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\Results\Install"
$keytype = [Microsoft.Win32.RegistryHive]::LocalMachine
$RemoteBase = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($keytype,$server)
$regKey = $RemoteBase.OpenSubKey($key)
$regkey.GetValue("LastSuccessTime")


pogo 21-12-2015 09:11 2586948

Kazun,
Большое спасибо за ответ!
Такой вариант рассматривался, но в win10 и win serv 2016 такого пути - SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\Results\Install нет((

Kazun 21-12-2015 09:42 2586952

Код:

Get-WinEvent -FilterHashtable @{LogName="System";ID=19} -MaxEvents 1

pogo 21-12-2015 13:27 2587023

Подскажите, а есть возможность через wmi корректное время получать?
Пример выше шикарен, но на удалённых хостах не работает, очень много где RPC выключен.

Kazun 21-12-2015 13:51 2587032

Код:

Get-WmiObject Win32_NTLogEvent -filter "LogFile='System' and EventCode=19" | Select -First 1 |  Foreach {$_.ConvertToDateTime($_.TimeWritten).ToString("dd:MM:yyyy HH:mm:ss")}

pogo 29-12-2015 16:06 2589550

Так это будет выглядеть на PS, может кому пригодиться:

Код:

cls
$log = "C:\temp\log.txt" #путь до лога
$ou = "OU=Servers,DC=test,DC=domain,DC=ru" #путь до OU, где будет происходить поиск серверов
$server_list = Get-ADComputer -Filter * -SearchBase $ou | Sort-Object #получаем список компьютеров и упорядочиваем их по алфавиту

foreach ($server in $server_list.Name) {
  try {
    $last_update = Get-WmiObject Win32_NTLogEvent -ComputerName $server -filter "LogFile='System' and EventCode=19" -ErrorAction Stop | Select -First 1 | Foreach {$_.ConvertToDateTime($_.TimeWritten).ToString("dd:MM:yyyy HH:mm:ss")} #через wmi запрос обращаемся к журналу сервера и ищем событие обновлений
    #Write-Host $server ": " $last_update -ForegroundColor Green #вывод информации в консоль
    $server + ": " + $last_update | Out-File -FilePath C:\temp\log.txt -Append #запись информация в лог
  }
  catch {
    $ex = $Error[0].Exception.Message #записываем ошибку в переменную
    #Write-Host $server ": " $ex -ForegroundColor Red #вывод информации в консоль
    $server + ": " + $ex | Out-File -FilePath C:\temp\log.txt -Append #запись ошибку в лог
  }
}



Время: 10:16.

Время: 10:16.
© OSzone.net 2001-