2013-04-06 16 views
16

C'è un modo per ottenere il tempo di inattività della macchina, come nel tempo in cui la macchina non è stata utilizzata, in minuti/ore usando Powershell o un file batch?Tempo di inattività della macchina

+0

Definire "non utilizzato per" più precisamente. Da quando è stato disconnesso? Quanto è durato lo screen saver? Che cosa esattamente? –

+1

Non riesco a fare nulla di buono su questo sito ... Come succede, la risposta qui sotto era esattamente quello che stavo cercando - il tempo di inattività dal punto in cui l'utente ha smesso di muovere il mouse o di premere i tasti sulla tastiera. – StrattonL

+1

Non so perché qualcuno ti abbia votato, forse la domanda era un po 'vaga, o non mostra se hai provato qualcosa ... Assicurati di dare un'occhiata [come chiedere] (http://stackoverflow.com/ domande/domande) –

risposta

17

Ecco una soluzione PowerShell che utilizza l'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; 
      } 
     } 
    } 
} 
'@ 

E un esempio di utilizzo:

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

Grazie mille! Esattamente quello che sto cercando. Come posso formattare l'output in modo che sia più leggibile, vale a dire 4 ore, 15 minuti, 21 secondi? Grazie ancora! – StrattonL

+1

Utilizzare [formattazione data] (http://technet.microsoft.com/en-us/library/ee692801.aspx) –

+1

Ho aggiornato l'esempio per mettere in mostra più funzionalità. –

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.") 

Prova questa - anche se in esecuzione in remoto potrebbe essere in esecuzione su una sessione diversa e quindi un diverso tempo di inattività?

Problemi correlati