Determinando o tempo de inatividade da maquina usando Powershell

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.

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
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:

001
[PoSH.Idle.UserInput]

Pressionando a tecla TAB para autocomplete, podemos listar as propriedades que desejamos visualizar, por exemplo:

001
[PoSH.Idle.UserInput]::IdleTime

image

Em um exemplo Prático de aplicação podemos utilizar o seguinte snippet:

001
002
003
004
005
006
007
008
009
010
011
012

$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’.

image

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!

Anúncios
Esse post foi publicado em Powershell e marcado , , , . Guardar link permanente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s