праверыць пінг, а затым час бесперапыннай працы?

Прыведзеныя ніжэй праверкі для бесперабойнай працы. Адным з умоў я не Дзынь з (у цяперашні час, за выключэннем), калі сервер можа быць пінг, АЛЕ НЕ МОЖА АТРЫМАЦЬ UPTIME - Мне патрэбен ніжэй сцэнар памылкі, калі гэта так. Я не магу думаць пра тое, як гэта зрабіць - якія-небудзь ідэі?

КОД:

#clear
$Computers = Get-Content "E:\DATA\PS_Jobs\Patching_Uptime\Saturday_Servers.txt"

Foreach($computer in $Computers) 
{

    if (Test-Connection -ComputerName $computer -Quiet)
    {

    $LastBoot = (Get-WmiObject -Class Win32_OperatingSystem -computername $computer).LastBootUpTime
    $sysuptime = (Get-Date) – [System.Management.ManagementDateTimeconverter]::ToDateTime($LastBoot)

    $days = $sysuptime.Days
    $DaystoHours = ($sysuptime.Days)*24
    $hours = $sysuptime.hours
    $TotalHours = $DaystoHours + $hours

        if($TotalHours -gt '12')
        {
            Write-EventLog -LogName WinLondonUptime -Source Uptime -EntryType Error -EventId 5 -Message "$computer - FAILED - Servers Uptime is GREATER then 12 hours or not contactable - Uptime is $days Days and $hours Hours - This is the Saturday patching run"
        }
        else
        {
            Write-EventLog -LogName WinLondonUptime -Source Uptime -EntryType Information -EventId 4 -Message "$computer - SUCCESS - Servers uptime is less than 12 hours - Uptime is $days Days and $hours Hours - This is the Saturday patching run"
        }
    }
    else
        {
            Write-EventLog -LogName WinLondonUptime -Source Uptime -EntryType Error -EventId 5 -Message "$computer - FAILED - Server is not contactable - This is the Saturday patching run"
        }
}
0
Хоць я не ўпэўнены, ці з'яўляецца оффтоп на SO, я думаю, што ў вас ёсць больш шанцаў атрымаць адказы на Powershell на Super User .
дададзена аўтар Niels Keurentjes, крыніца
думаю, што я спытаў гэта крыху няправільна - шмат вы думаю, я хачу атрымаць UPTIME - гэта няправільна - прыведзены вышэй код робіць атрымаць бездакорную працу. Я спецыяльна пытаўся, калі UPTIME не даступны для канкрэтнага сервера я хачу яго без памылак .... нават калі сервер і Пінга.
дададзена аўтар lara400, крыніца
Вы можаце разлічыць да часу атрымліваць самы доўгі запушчаны працэс або запытваючы падзеі сістэмнага часопіса, каб атрымаць ідэнтыфікатар падзеі 6005.
дададзена аўтар Mad Tom Vane, крыніца

6 адказы

Вы можаце атрымаць таксама атрымаць падчас апошняга пачатковага пуску кампутара з дапамогай WMI:

$wmi = [WMI] ""
$operatingSystem = get-wmiobject Win32_OperatingSystem -computername "."
$wmi.ConvertToDateTime($operatingSystem.LastBootUpTime)

банкнота

1
дададзена
дзякуй за гэта, але думае, што я спытаў гэта крыху няправільна - шмат вы думаю, я хачу атрымаць UPTIME - гэта няправільна - прыведзены вышэй код робіць атрымаць бездакорную працу. Я спецыяльна пытаўся, калі UPTIME не даступны для канкрэтнага сервера я хачу яго без памылак .... нават калі сервер і Пінга.
дададзена аўтар lara400, крыніца

Вы можаце інкапсуляваць код у Try/злавіць і выкарыстоўваць аб'ект TimeSpan. Нешта накшталт гэтага (не правяраў, але гэта дае вам ідэю):

    try
    {
        Test-Connection -ComputerName $computer -Count 1 -ErrorAction Stop

        $wmi = Get-WmiObject Win32_OperatingSystem -computer $computer
        $time = $wmi.ConvertToDateTime($wmi.Lastbootuptime) 
        [TimeSpan] $uptime = New-TimeSpan $time $(get-date)

        if ($uptime.Hours -gt 12)
        {
            Write-EventLog -LogName WinLondonUptime -Source Uptime -EntryType Error -EventId 5 -Message "$computer - FAILED - Servers Uptime is GREATER then 12 hours or not contactable - Uptime is $days Days and $hours Hours - This is the Saturday patching run"
        }
        else
        {
            Write-EventLog -LogName WinLondonUptime -Source Uptime -EntryType Information -EventId 4 -Message "$computer - SUCCESS - Servers uptime is less than 12 hours - Uptime is $($uptime.Days) Days and $($uptime.Hours) Hours - This is the Saturday patching run"
        }
    }

    catch [System.Management.Automation.ActionPreferenceStopException]
    {
        Write-EventLog -LogName WinLondonUptime -Source Uptime -EntryType Error -EventId 5 -Message "$computer - FAILED - Server is not contactable - This is the Saturday patching run"
    }
1
дададзена
дзякуй David - гэта дапамагло мне і думае, што вы ведалі, што я пытаюся!
дададзена аўтар lara400, крыніца

Гэты чалавек накшталт мае тыя ж праблемы з WMI не маючы тайм-аўт функцыя . Тое, што вы маглі б паспрабаваць гэта стварыць заданне для запыту WMI і атрымаць LBUT. Затым проста ўсталяваць таймер на працу. Але калі вы хочаце проста зрабіць некаторыя апрацоўкі памылак вы павінны выкарыстоўваць паспрабаваць {} і засаўка {} блокі.

try{
    $lbut = (Get-WmiObject -Class Win32_OperatingSystem -computername $computer).LastBootUpTime
}
catch{
    "FAILED"
    continue
}

You might want to look at using CIM instead of WMI.

1
дададзена
Я паспрабую на гэта - падобна на тое, што даваў Давід з метадам спроб ўлову.
дададзена аўтар lara400, крыніца

Erroring Out is typically defined as returning a non zero exit code, this can be done by

Exit 1

або

Exit -1

абоwhatever number you prefer.

You can also throw exceptions as well, if you want to send a specific errабоmessage and a really nasty error, there's an answer here.

0
дададзена

Я не магу праверыць гэта тут у дадзены момант, але, магчыма, паспрабаваць ўкладзенасці іншы, калі заява пералічыць поспех або няўдачу выкліку WMI?

if (Test-Connection -ComputerName $computer -Quiet)
    {

    if((Get-WmiObject -Class Win32_OperatingSystem -computername $computer).LastBootUpTime){

        $LastBoot = (Get-WmiObject -Class Win32_OperatingSystem -computername $computer).LastBootUpTime
        $sysuptime = (Get-Date) – [System.Management.ManagementDateTimeconverter]::ToDateTime($LastBoot)
0
дададзена

Маё рашэнне заключаецца ў наступным. Я пінг імя хаста і атрымаць час загрузкі, калі ён не атрымлівае памылку.

[System.Net.Dns]::GetHostAddresses("hostname").ipaddresstostring
if($? -eq $true){
   Get-CimInstance -ClassName win32_operatingsystem | select lastbootuptime
}
0
дададзена