Olá a todos, no post de hoje irei explicar como podemos determinar o tempo de inatividade da maquina pelo LastUserInput usando C# e powershell.
Muitas vezes para a execução de determinada rotina nos vemos em um cenário em que o script só pode ser executado caso, a maquina esteja idle por mais de x minutos. Para isso podemos utilizar a seguinte dica.
Iremos adicionar um namespace renomeado para Posh.idle, que no caso nao foi escrito por mim, mas também nao consegui localizar o autor.
Utilizaremos o comando Add-type para carregar o codigo em memória.
Add-Type @'
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;namespace PoSH.Idle {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;
}
}
}
}
'@
Após a execução do código o resultado em sí é bem simples e facilmente utilizado.
Chamando o NameSpace diretamente entre colchetes podemos verificar os resultados:
[PoSH.Idle.UserInput]
Pressionando a tecla TAB para autocomplete, podemos listar as propriedades que desejamos visualizar, por exemplo:
[PoSH.Idle.UserInput]::IdleTime
Em um exemplo Prático de aplicação podemos utilizar o seguinte snippet:
$time = ([PoSH.Idle.UserInput]::IdleTime).Milliseconds
if($time -ge '15'){
Write-host 'Greater then 15 Milliseconds'
}
Else{
Write-host 'Less then 15 Milliseconds'
}
No exemplo acima, será salvo o número de mili segundos de inatividade do computador/usuário, e se for superior a 15 irá exibir a mensagem ‘Greater then 15 Milliseconds’ senão, irá exibir ‘Less than 15 Milliseconds’.
Este é um exemplo bem simplista da aplicação deste código, porém pode ser utilizado das mais diversas formas.
Dúvidas? Sugestões? Comente!
Até a próxima!

3 Comments
Opa boa tarde que bom que voce se dedica ao powershell
eu tambem dou umas pinceladas no Powershell só pra passar tempo
abraços
Obrigado por acompanhar!
up