O desligamento do computador é bastante fácil - como outros notaram, você pode usar o comando shutdown
para isso. Se você configurou os firewalls locais de suas máquinas para permitir SMB e RPC de hosts de gerenciamento (por exemplo, habilitando exceções de administração remota em políticas de grupo), você poderia disparar os desligamentos centralmente para todas as máquinas em seu domínio usando o parâmetro /m \computername
para seu desligamento ligar:
shutdown /s /f /t 30 /m \pcXXX /c "Automatic shutdown"
Uma versão mais flexível do comando de desligamento é oferecida pela SysInternals como psshutdown
. Entre outras coisas, permite a interação do usuário (ou seja, um usuário teria a oportunidade de interromper um pedido de desligamento, se desejado)
Agora, para determinar se um usuário está conectado a uma máquina, você teria que testar cada um deles, por exemplo, usando o comando quser
. A saída típica ficaria assim:
C:\Users\denis>quser
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>denis console 1 Active none 22.04.2014 15:11
Você pode filtrar por uma string como "Ativo" para determinar se pode desligar com segurança. Uma versão em lote pode ter esta aparência:
shutdownunused.bat
ping %1
if errorlevel 1 ( echo %1 seems offline && exit 1)
quser /SERVER:%1 | find "Active"
if %errorlevel% == 1 shutdown /s /f /t 30 /M \%1 /c "Automatic shutdown"
chamando shutdownunused.bat pc1234
testaria e desligaria o pc1234 se ele fosse a) pingável eb) não tivesse nenhum usuário logado ativamente (ele desligaria um host se o usuário estivesse logado, mas estivesse desconectado ou tivesse sua máquina bloqueada) . Isso pode ser feito por script do seu agrado - usando uma versão somente local como uma tarefa agendada ou acionado centralmente de um host de gerenciamento por meio da enumeração de todas as estações em seu domínio. A vantagem da última abordagem é que seria mais fácil manter registros e criar estatísticas.