Captura de telas ligando / desligando e executando scripts ou programas quando isso acontece

4

Estou tentando automatizar as luzes ao redor da caverna man, idealmente eu gostaria de ter as luzes acesas enquanto as telas dos computadores estiverem ligadas e as luzes se apagarem quando o protetor de tela entrar em ação, sem usar nenhum software residente adicional .

Até agora eu consegui capturar eventos 4802 (início screensaver) e 4803 (stop screensaver) e usando o agendador de tarefas e script curl para disparar solicitação http para a máquina que lida com as luzes, e funciona, até certo ponto.

O problema é que sempre que a máquina entra no estado de baixa energia, o protetor de tela é eliminado e o 4803 é registrado, e não consigo diferenciar entre o protetor de tela morto pela entrada do usuário ou pelas janelas que entram no estado de baixa energia.

Basicamente eu preciso pegar alguns eventos que acontecem quando as telas desligam e ligam. Existe alguma coisa (na instalação do Win7 genérico) que eu poderia pegar a tarefa?

Obrigado.

EDITAR:

Peço desculpas a pessoas que já responderam a esta pergunta, a minha pergunta não foi formulada com clareza suficiente. A máquina em questão não entra realmente no estado de suspensão, portanto, não há eventos 42 (kernel-power) ou evento 1 (power-troubleshooter) gerados em logs de eventos, a máquina só entra em algum estado de baixa energia onde consome cerca de 53W, em vez do habitual 180W, enquanto eu poderia usar isso para rastrear o estado de energia desta máquina específica, eu não seria capaz de usar o mesmo método de detecção para os outros 3 computadores na sala, uma vez que eles não têm o hardware necessário (UPS) conectado a eles.

O que estou procurando são eventos que ocorrem sempre que os monitores do computador são desligados e ligados novamente pelo Windows (não por seus respectivos botões de energia) como resultado do gerenciamento de energia do Windows. Basicamente qualquer coisa que me permita sincronizar as luzes na caverna com o estado dos monitores e permitir que o agendador de tarefas dispare scripts que manipulem as luzes.

    
por Dingo 16.12.2015 / 18:03

1 resposta

2

Espero que você já tenha encontrado outra solução para essa tarefa, de qualquer maneira, esse foi um problema interessante que eu queria resolver, e talvez alguém se beneficie. Em vez de tentar monitorar estados do protetor de tela, minha solução usa as opções de monitoramento "ociosidade" no agendador de tarefas. Enquanto isso foi construído no Windows 10, acredito que as funções usadas devem ser as mesmas no W7.

Visão geral

  • A tarefa agendada de janelas "Inativas" aciona o script "Ocioso" e usa as opções ociosas integradas na guia Condições para aguardar até que o computador esteja ocioso para iniciar e, em seguida, pare se / quando o computador deixar de estar ocioso.
  • O script "Idle" aciona o script "Watcher", realiza a ação escolhida (luzes fracas) e continua a executar esperando no explorer.exe para sair, o que (nunca deveria) acontecer.
  • O script "Watcher" encontra o processo para o script "Inativo" e aguarda que ele saia antes de concluir sua ação (acenda as luzes novamente).

Caminho básico dos eventos

  1. A tarefa "Ocioso" tenta ser executada a cada 1 minuto, mas só será executada se o computador ficar ocioso pelo período de tempo escolhido.
  2. A tarefa "Inativa" executa o script "Ocioso". O script aciona o script "Watcher", aciona a ação escolhida (luzes fracas) e, em seguida, usa o cmdlet "wait-process" para aguardar a saída do explorer.exe, o que nunca deve acontecer, supondo que o Windows esteja estável e continue sendo executado contanto que o PC esteja ocioso.
  3. O script "Watcher" é iniciado e vigia o processo do script "Inativo" para sair.
  4. A entrada do usuário faz com que o PC saia do estado ocioso, eliminando a tarefa "Ocioso", portanto, eliminando o processo powershell.exe do script "Ocioso".
  5. O script "Watcher" vê a saída do processo de script "Inativo", acende as luzes e sai.

Configuração

  1. Crie sua pasta de script que conterá os dois scripts.
  2. Copie o executável do powershell para sua nova pasta de pastas:

    "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" >>>> C:\scripts\dimlights\
    
  3. Crie "Idle.ps1" e cole no script. Na primeira linha do script, especifique sua pasta contendo scripts e cópia do powershell.exe:

    $myScriptDir = "C:\scripts\dimlights\"
    #============= Variables ==================
    $logfile = join-path $myScriptDir log.txt
    $nid = (Get-Process explorer).Id
    $mydate = Get-date
    
    #============= Code ==================
    start-process powershell.exe -argumentlist "-NonInteractive –ExecutionPolicy Bypass -file $myScriptDir\watcher.ps1"
    echo "$mydate - PID: $nid - Idle start action" | out-file -Append $logfile
    #----------------Insert chosen action code here----------------
    Wait-Process $nid
    

    $ mydate = Data de obtenção echo "$ mydate - PID: $ nid - Última linha no Idle, não deveria ter sido atingido." | out-file -Append $ logfile

  4. Crie "Watcher.ps1" na mesma pasta e cole no script, especificando novamente a pasta:

    $myScriptDir = "C:\scripts\dimlights\"
    #============= Variables ==================
    $myPSPath = join-path $myScriptDir powershell.exe
    $logfile = join-path $myScriptDir log.txt
    $nid = (Get-Process powershell | Where-Object {$_.path -eq $myPSPath}).id
    $mydate = Get-date
    
    #============= Code ==================
    echo "$mydate - PID: $nid - Watcher started" | out-file -Append $logfile
    if ($nid -ne $null){
    Wait-Process -id $nid
    $mydate = Get-date
    echo "$mydate - PID: $nid - Watcher end action" | out-file -Append $logfile
    #---------------- Insert chosen wake up action code here ----------------
    }
    else {
    echo "$mydate - PID: $nid - No such process, exiting watcher." | out-file -Append $logfile
    

    }

  5. Abra o agendador de tarefas como administrador e crie a tarefa "Ocioso";

    • Na guia geral, escolha "alterar usuário ou grupo" em que a tarefa é executada como.
    • Na janela "Selecionar usuário ou grupo", clique no botão avançado e, em seguida, em "Localizar agora".
    • Desça até encontrar a conta "SISTEMA", clique uma vez para destacar e clique em OK.
    • Clique novamente em OK.
    • Mude para a guia "Acionadores" e crie um acionador de uma vez por alguns minutos no futuro.
    • Em configurações avançadas, marque a caixa para "Repetir tarefa a cada:" e digite na caixa "1 minuto" e altere "por uma duração de" para indefinidamente.
    • Mude para o separador acções e adicione uma nova acção;
    • A caixa "program / script" deve conter o caminho para o seu powershell.exe que você copiou para a pasta de scripts anteriormente.
    • Adicione os seguintes argumentos, substituindo o caminho do arquivo pelo seu:

      -ExecutionPolicy Bypass -file "C: \ scripts \ idle.ps1"

    • Vá para a guia Condições e marque a caixa para iniciar apenas se estiver ociosa, definindo o tempo ocioso para o tempo limite escolhido.

    • Verifique as outras duas caixas sob a seção ociosa "Parar se o computador parar de ficar ocioso" e "Reiniciar se o estado ocioso for retomado".
    • Clique em "OK" para salvar e fechar a tarefa agendada.

Espero que alguém ache isso útil!

Tim

    
por 15.02.2017 / 02:16