forçar script de logoff do usuário para o Windows 7

5

Existe alguma maneira de forçar outro usuário a fazer logoff via linha de comando no Windows 7 Home Premium?

Minha política de VPN de trabalho exige que haja apenas um usuário logado, para desconectar os outros usuários. Tenho que executar o prompt de comando como administrador, executar o gerenciador de tarefas e clicar com o botão direito do mouse e fazer logoff. Isso é um pouco chato. Idealmente, gostaria que fosse executado um script executável ou de lote que fizesse tudo em uma etapa rápida. Eu encontrei alguns tópicos falando sobre como desconectar usuários depois de um tempo limite definido, e isso pode funcionar bem também (supondo que haja algum que funcione ... minhas descobertas são que não existem) - mas eu ainda gostaria saber como fazer isso em um passo, se possível.

Existe alguma maneira de fazer o que estou perguntando?

Eu não me oponho a escrever um aplicativo .net se eu tiver que fazê-lo também.

    
por javamonkey79 27.10.2011 / 01:24

4 respostas

4

Você pode automatizar o comando de logoff, usando algo como esse arquivo em lote (adaptado de aqui ):

@echo off
query session > c:\temp\session.txt
for /f "skip=2 tokens=2,3,4" %%i in (c:\temp\session.txt) DO if not "%%i"=="Geoff" logoff %%j
del c:\temp\session.txt
pause

Isso usa o comando sessão de consulta para obter uma lista de sessões e, em seguida, o para que o comando analise a saída, e finalmente, o comando logoff para registrar fora de outros usuários. Você desejará executar o comando query session para verificar a saída em sua máquina.

Na minha máquina, recebo:

C:\Users\Geoff\Desktop>query session
 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           Geoff                     1  Active

as primeiras duas linhas são lixo, então a parte skip 2 as ignora. O nome de usuário, ID e Estado são colocados nas variáveis i, jek respectivamente. Você vai querer testá-lo e, se ele não for executado como um usuário não administrador, você pode clicar com o botão direito do mouse no arquivo em sua área de trabalho e em "Executar como administrador" ou pode criar um atalho para o arquivo em lotes e selecione Propriedades | Atalho | Avançado | Executar como administrador. De qualquer maneira, você receberá um prompt do UAC. Finalmente, se você deseja executar o arquivo em lote sem o prompt do UAC, você pode ir para a rota mais obscura do agendador de tarefas: veja esta postagem .

    
por 27.10.2011 / 03:35
2

Confira PSShutdown do MS. Você pode usá-lo com a opção -o para fazer logoff do usuário do console e criar um arquivo em lotes que possa ser executado com um clique (ou um clique com o botão direito em > executar como administrador).

PsShutdown is a command-line utility similar to the shutdown utility from the Windows 2000 Resource Kit, but with the ability to do much more. In addition to supporting the same options for shutting down or rebooting the local or a remote computer, PsShutdown can logoff the console user or lock the console (locking requires Windows 2000 or higher).

Além disso, talvez confira esta pergunta: Tempo limite de uma conta de usuário?

    
por 27.10.2011 / 01:30
1

Como alternativa à minha outra outra resposta (essa pergunta me fez pensar!), você também pode considerar usar uma combinação de duas coisas:

  1. Configure uma tarefa agendada em cada estação de trabalho para executar um script de logoff. O acionador seria uma entrada de registro de eventos específica.
  2. Use um script .vbs em sua própria área de trabalho para postar a entrada do acionador no log de eventos.

Por sua vez:

Tarefa agendada

Você precisa fazer login como usuário, e adicionar uma nova tarefa com um acionador personalizado: Triggers | Novo | 'Em um evento' | Personalizado | Novo filtro de eventos | XML | 'Editar manualmente'. Em seguida, use algo como o seguinte para o XML:

<QueryList>
  <Query Id="0" Path="Application">
    <Select Path="Application">*[System[(Level=4 or Level=0) and (EventID=4)]] and *[EventData[Data[1]='EVERYBODY_OFF']]</Select>
  </Query>
</QueryList>

Isso irá procurar por eventos de informações no log do Aplicativo com o EventID de 4 (informações) e o corpo de dados de 'EVERYBODY_OFF'. Você pode ler mais sobre os acionadores de eventos aqui .

A ação deve ser tão simples quanto shutdown -l , o que deve desencadear um logoff (você vai querer testá-lo).

Script de acionador

O seguinte script .vbs registrará o evento 'EVERYBODY_OFF' por demanda:

const EVENTLOG_INFORMATION = 4
strMessage = "EVERYBODY_OFF"
set objShell = CreateObject("WScript.Shell")
objShell.LogEvent EVENTLOG_INFORMATION, strMessage

Coisas para testar

As partes das quais não tenho certeza, e quais testes serão necessários:

  • Essa é a mensagem de evento publicada globalmente na máquina? Ou seja, todos os usuários verão a tarefa?
  • O comando de desligamento será executado corretamente no contexto do usuário de destino?
por 27.10.2011 / 22:59
1

Aqui está um artigo interessante de The Scripting Guys descrevendo logoff forçado acionado por evento:

link

Suponha que você possa usar o logon ou o explorer.exe iniciado pelo usuário A como evento de disparo para efetuar logout do usuário B.

    
por 12.12.2012 / 21:52