2013-04-06 12 views
16

Czy istnieje sposób na uzyskanie czasu bezczynności maszyny, tak jak w czasie, w którym urządzenie nie było używane, w minutach/godzinach przy użyciu funkcji Powershell lub pliku wsadowego?Uzyskaj czas przestoju maszyny

+0

Zdefiniuj "nie był używany". Od kiedy został wylogowany? Jak długo włączony był wygaszacz ekranu? Co dokładnie? –

+1

Nie mogę zrobić niczego dobrze na tej stronie ... Tak się składa, że ​​poniższa odpowiedź była dokładnie tym, czego szukałem - czasem bezczynności od momentu, w którym użytkownik przestał poruszać myszą lub naciskał przyciski na klawiaturze. – StrattonL

+1

Nie wiem, dlaczego ktoś cię głosował, być może pytanie było trochę niejasne lub nie pokazuje, czy próbowałeś czegoś ... Pamiętaj, aby sprawdzić [jak zapytać] (http://stackoverflow.com/ pytania/how-to-ask) –

Odpowiedz

17

Oto rozwiązanie PowerShell, które wykorzystuje interfejs API Win32 GetLastInputInfo.

Add-Type @' 
using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 

namespace PInvoke.Win32 { 

    public static class UserInput { 

     [DllImport("user32.dll", SetLastError=false)] 
     private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 

     [StructLayout(LayoutKind.Sequential)] 
     private struct LASTINPUTINFO { 
      public uint cbSize; 
      public int dwTime; 
     } 

     public static DateTime LastInput { 
      get { 
       DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount); 
       DateTime lastInput = bootTime.AddMilliseconds(LastInputTicks); 
       return lastInput; 
      } 
     } 

     public static TimeSpan IdleTime { 
      get { 
       return DateTime.UtcNow.Subtract(LastInput); 
      } 
     } 

     public static int LastInputTicks { 
      get { 
       LASTINPUTINFO lii = new LASTINPUTINFO(); 
       lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO)); 
       GetLastInputInfo(ref lii); 
       return lii.dwTime; 
      } 
     } 
    } 
} 
'@ 

i wykorzystanie przykład:

for ($i = 0; $i -lt 10; $i++) { 
    Write-Host ("Last input " + [PInvoke.Win32.UserInput]::LastInput) 
    Write-Host ("Idle for " + [PInvoke.Win32.UserInput]::IdleTime) 
    Start-Sleep -Seconds (Get-Random -Minimum 1 -Maximum 5) 
} 
+0

Wielkie dzięki! Dokładnie to, czego szukam. Jak mogę sformatować dane wyjściowe, aby były bardziej czytelne - tj. 4 godziny, 15 minut, 21 sekund? Dzięki jeszcze raz! – StrattonL

+1

Użyj [formatowania daty] (http://technet.microsoft.com/en-us/library/ee692801.aspx) –

+1

Zaktualizowałem przykład, aby pokazać więcej jego możliwości. –

0
$Last = [PInvoke.Win32.UserInput]::LastInput 
$Idle = [PInvoke.Win32.UserInput]::IdleTime 
$LastStr = $Last.ToLocalTime().ToString("MM/dd/yyyy hh:mm tt") 
Write-Host ("Last user keyboard/mouse input: " + $LastStr) 
Write-Host ("Idle for " + $Idle.Days + " days, " + $Idle.Hours + " hours, " + $Idle.Minutes + " minutes, " + $Idle.Seconds + " seconds.") 

Spróbuj tego - choć działa zdalnie może być uruchomiony na innej sesji, a więc inny czas bezczynności?