Os arquivos da área de trabalhoPsTools Primer

Wes Miller

Faça download do código deste artigo: MillerTheDesktopFiles2007_03.exe (150KB)

Até o ano passado, eu trabalhava na Winternals Software, que foi adquirida pela Microsoft em julho de 2006. A Winternals vendia softwares comerciais, mas os fundadores da empresa, Mark Russinovich e Bryce Cogswell, também tinham uma empresa separada chamada Sysinternals que distribuía muitas ferramentas como freeware. Alguns desses aplicativos de freeware tinham

até mesmo se tornado componentes do Winternals Administrator's Pak. Mark e Bryce também licenciavam essas ferramentas para empresas que procuram usá-las fora dos termos de licença típicos de freeware.

Uma das minhas ferramentas favoritas da biblioteca Sysinternals (na verdade várias ferramentas) é o conjunto PsTools, agora disponível em microsoft.com/technet/sysinternals/utilities/pstools.mspx. Mark nomeou as ferramentas após o utilitário de listagem do processo UNIX, ps. Conforme mencionado no site de download das ferramentas, há utilitários Windows® internos da linha de comando que podem realizar algumas funções iguais às dessas ferramentas. No entanto, além da exclusiva funcionalidade significativa, uma grande diferença é o fato de o conjunto PsTools poder ser usado de forma local ou remota (obviamente, se os sistemas remotos foram configurados de modo correto). Melhor ainda, o processo de execução remota é quase tão simples quanto o de execução local.

O conjunto PsTools inclui vários aplicativos individuais, listados na Figura 1. Assim como os demais detalhes da Sysinternals, não há instalador, apenas aplicativos. Basta colocá-los em uma pasta do caminho e pronto!

Figure 1 Utilitários do PsTools

Ferramenta Descrição
PsExec Permite executar processos em qualquer contexto de usuário.
PsFile Mostra os arquivos abertos remotamente em um sistema.
PsGetSid Exibe o SID (Identificador de segurança do Windows) de um computador ou usuário.
PsInfo Lista informações sobre um sistema Windows.
PsKill Interrompe processos por nome ou ID.
PsList Lista informações detalhadas sobre a execução de processos.
PsLoggedOn Mostra todos os usuários conectados localmente e todos os usuários de compartilhamento de recursos remoto.
PsLogList Despeja registros de log de eventos do Windows.
PsPasswd Altera senhas de contas de usuário.
PsService Exibe e controla serviços do Windows.
PsShutdown Encerra, reinicia ou coloca o computador no modo de suspensão ou hibernação.
PsSuspend Suspende os processos em execução.

Você pode perceber que alguma dessas funcionalidades (especialmente a PsLogList) pode ser realizada através da WMI (Instrumentação de gerenciamento do Windows) e de alguns scripts complexos. Mas o importante é que cada utilitário do conjunto PsTools foi desenvolvido para realizar uma tarefa específica de modo simples e fácil.

Vou falar sobre cada ferramenta e dar um exemplo simples do porquê e como é possível utilizá-la. Primeiramente, farei uma breve introdução do funcionamento das ferramentas propriamente ditas e do tipo de pré-requisitos necessários para seu funcionamento.

Como as ferramentas funcionam?

Geralmente, todas as ferramentas funcionam do mesmo modo. No sistema host, inicie o PsTool desejado. Embora muitas possam ser executadas localmente, essas ferramentas fornecem a funcionalidade máxima quando executadas em um sistema remoto ou em vários sistemas de uma vez. (PsExec é uma exceção específica que vem à mente, como você verá em meu exemplo abaixo.) Utilizando o argumento da linha de comando fornecido, o utilitário se copia no compartilhamento administrativo do sistema remoto, que é igual a %SystemRoot% (diretório do Windows) no sistema remoto.

Após ser copiado no diretório remoto, o aplicativo se inicia e instala um serviço do Windows. Esse serviço do Windows realiza a tarefa solicitada, usando as credenciais fornecidas no momento da inicialização. Se uma interface de usuário final do sistema cliente for exigida por uma ferramenta específica, esse serviço inicia um binário adicional no contexto do usuário. (Lembre-se de que os serviços não podem lançar UIs interativas diretas.) O serviço retransmite as informações necessárias para o console iniciado. E, finalmente, o serviço se desinstala.

Como vocês podem perceber, as ferramentas são poderosas e autônomas. Embora elas envolvam vários binários e vários processos, você como usuário não precisa se preocupar com isso, basta executar a ferramenta desejada e ela funciona.

Para usar as ferramentas, há os seguintes pré-requisitos: Windows NT®, Windows 2000, Windows XP ou Windows Server® 2003 (as versões x86 ou x64 do Windows são suportadas, mas as versões do Itanium não são); o compartilhamento padrão da rede administrativa ativado no sistema remoto no qual as ferramentas estão sendo executadas (admin$); e as portas do compartilhamento de arquivos e de impressora abertas no sistema remoto (se estiver utilizando o Windows Firewall, o firewall de conexão com a Internet ou outro produto de firewall).

PsExec

PsExec é minha ferramenta favorita (e provavelmente não pelo motivo que vocês talvez imaginem). Durante a melhor parte de dois anos, estive executando como “não administrador” em meus sistemas, executo como usuário, não como administrador. Em vez disso, tenho um script curto chamado run.vbs que uso para executar aplicativos como administrador local (é possível executá-los tão facilmente quanto qualquer usuário). A Figura 2 mostra o conteúdo do script, que também está disponível no site da TechNet Magazine em technetmagazine.com/code07.aspx. O script supõe que o PsTools está na variável Path do sistema.

Figure 2 Run.vbs

SET WshShell = WScript.CreateObject("WScript.Shell")
SET WshSysEnv = WshShell.Environment("SYSTEM")
SET FSO = CreateObject("Scripting.FileSystemObject")
IF WScript.Arguments.Count <> 0 Then
    FOR EACH arg IN WScript.Arguments
        iArgCount = iArgCount + 1
        strCmdArg = (arg)
        strCmdArray = Split(strCmdArg, " ", 2, 1)
        IF iArgCount = 1 THEN
        strExe = strCmdArray(0)
        ELSEIF iArgCount = 2 THEN
        strRun = strCmdArray(0)
        ELSE
        strParams = strParams&" "&strCmdArray(0)
        END IF
    NEXT
END IF
'/t:0A && title ***** Admin ***** 
        strExt = LCase(Right(strExe, 3))

IF strExt <> "exe" AND strExt <> "bat" AND strExt <> "cmd" THEN
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD  cmd /c start "&strExe&"
    "&strRun&" "&strParams, 0, FALSE
ELSE
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD "&strExe&" "&strRun&"
    "&strParams, 0, FALSE
END IF

    SET WshShell = NOTHING
    SET WshSysEnv = NOTHING
    SET FSO = NOTHING

Esse script simples é um exemplo de uso do PsExec com a funcionalidade adicionada por Mark enquanto trabalhávamos em nosso produto Protection Manager na Winternals: a capacidade de um usuário limitado fornecer mais credenciais com privilégio para iniciar o PsExec localmente. Obviamente, o uso mais comum de PsExec é executá-lo de forma remota (por exemplo, para executar um utilitário que não fornece sua própria estrutura remota, de script ou de automação). Alguns recursos principais do PsExec incluem a capacidade de copiar um binário em sistemas remotos que serão executados, bem como a capacidade de ditar a afinidade do processador. Outro recursos útil do PsExec é a capacidade de criar scripts em muitos computadores ao mesmo tempo fornecendo um arquivo de script.

Veja o uso simplificado do PsExec:

PsExec \\computer -u username -p password command

É possível expandir isso usando os comutadores usados na Figura 3.

Figure 3 Comutadores do PsExec

Comutador Descrição
-a Especifica a afinidade do processador.
-c Indica se o aplicativo deve ser copiado no sistema remoto.
-d Especifica que não é necessário aguardar a finalização do processo antes de sair (não aguarda mensagens de êxito ou falha).
-e Carrega usando o perfil da conta especificada.
-f Copia o aplicativo mesmo que já exista um no sistema remoto. Verifique se a versão atual (ou uma específica) está sendo executada.
-i Executa o aplicativo de modo interativo no sistema remoto (necessário se desejar que o usuário final veja qualquer interface do aplicativo).
-l Executa o aplicativo como um usuário limitado. Remove o token do grupo Administradores e distribui privilégios de processo no nível em que estariam para um membro do grupo Usuários. Útil para executar aplicativos da Internet de alto risco com privilégios mínimos.
-n Especifica o tempo limite que deve ser aguardado antes da falha de conexão nos computadores remotos.
-priority Executa o processo na prioridade especificada. Isto é, especifica como o Windows deve definir a prioridade do processo para uma determinada tarefa (-low, -belownormal, -abovenormal, -high ou -realtime ).
-s Executa o processo usando a conta System (útil para executar o Regedit e acessar chaves de registro com privilégios).
-v Copia o aplicativo apenas se o que está sendo copiado for mais recente.
-x Exibe a interface do usuário na área de trabalho segura do Winlogon, funciona apenas no sistema local.
@file Executa o comando em todos os computadores especificados no arquivo de texto.

PsFile

PsFile é uma ferramenta com um foco menor do que PsExec. Especificamente, essa ferramenta é usada para verificar quais arquivos foram abertos, e por quem, no sistema remoto. Isso pode ser útil se desejar rastrear quais arquivos estão abertos antes de reiniciar um servidor. Se você precisar descobrir qual usuário bloqueou o arquivo, talvez impedindo sua edição ou exclusão, é possível notificá-lo manualmente ou fechá-lo com o PsFile. O uso do PsFile está ilustrado abaixo:

PsFile \\computer -u username -p password 

Isso simplesmente retoma uma lista das manipulações de arquivo abertas no sistema remoto. Além do uso padrão, também é possível adicionar um parâmetro Id à instrução, especificando o nome do arquivo sobre o qual deseja obter informações ou fechar. Também é possível incluir o comutador -c, que fecha o arquivo identificado com o parâmetro Id.

PsGetSid

PsGetSid também é uma ferramenta muito focada. Ela informa o SID (Identificador de segurança) de um computador, usuário ou grupo. Isso pode ser útil se desejar assegurar que os sistemas do domínio não tenham SIDs duplicados ou se simplesmente desejar verificar os SIDs de todos os usuários ou grupos de um sistema. O uso do PsGetSid está ilustrado abaixo:

PsGetSid \\computer -u username -p password account

Observe que a conta pode especificar um usuário, computador ou grupo. Embora a sintaxe do PSGetSid seja simples, alguns parâmetros adicionais também estão disponíveis. O parâmetro SID especifica a conta (grupo ou computador) de um SID específico e @file executa o comando em todos os computadores listados no arquivo de texto especificado.

PsInfo

PsInfo é usado para fornecer informações detalhadas do sistema. Isso obviamente seria mais útil para os scripts criados em vários sistemas remotos, com a saída enviada para um arquivo (como um arquivo CSV em Excel® compatível com o banco de dados). Observe que esse utilitário é operado por um conceito importante que é diferente da maioria das outras ferramentas: por padrão, se um nome de computador não for fornecido, PsInfo tentará consultar todos os computadores do domínio. O uso do PsInfo está ilustrado abaixo:

PsInfo  \\computer -u username -p password 

Embora a sintaxe seja simples, comutadores e parâmetros adicionais também estão disponíveis, como mostra a Figura 4.

Figure 4 Comutadores do PsInfo

Comutador Descrição
-h Mostra todas as atualizações do Windows.
-s Mostra todos os aplicativos instalados no sistema.
-d Mostra informações do disco/volume do sistema.
-c Mostra os resultados em formato CSV.
-t Especifica outro delimitador para o arquivo CSV diferente do valor padrão \t.
Filter Mostra apenas os dados que coincidem com um filtro específico.
@file Executa o comando em todos os computadores listados no arquivo de texto especificado.

PsKill

PsKill é um utilitário excelente para a finalização de processos em sistemas locais ou remotos. O uso é muito simples e permite interromper rapidamente um processo junto com todos os processos filho. O uso do PsKill é muito parecido com o das outras ferramentas já mencionadas:

PsKill -t \\computer -u username -p password process id | process name

É possível especificar a ID ou o nome do processo que deseja interromper.

PsList

Não uso muito o PsList porque sou fã do Process Explorer (consulte microsoft.com/technet/sysinternals/ProcessesAndThreads/ProcessExplorer.mspx para obter mais informações). Mas como não existe uma versão remota do Process Explorer, o PsList se torna um fax razoável para algumas das principais funcionalidades do Process Explorer. Na realidade, o PsList é uma lista remota de um ou mais processos que estão em execução em um sistema remoto.

O uso do PsList é muito simples:

PsList \\computer -u username -p password account

Assim como nas outras ferramentas, o parâmetro account pode especificar um usuário, computador ou grupo. Parâmetros adicionais são mostrados na Figura 5.

Figure 5 Comutadores do PsList

Comutador Descrição
-t Mostra informações no nível de thread.
-m Fornece informações detalhadas da memória para cada processo.
-x Mostra informações de processo, memória e thread.
-t Mostra informações como uma árvore de processos (pense na exibição da árvore do Process Explorer).
-s [n] Executado no modo do gerenciador de tarefas durante o número de segundos especificado. Isso permite a exibição relativamente em tempo real das informações do processo remoto.
-r [n] Especifica a freqüência (em segundos) da atualização durante a execução no modo do gerenciador de tarefas.
name Mostra informações sobre os processos que começam com o nome especificado.
-e Coincide exatamente com o nome do processo.
pid Exibe informações sobre um processo específico.

O PsList é poderoso e fácil de usar e, sem usar a área de trabalho remota, permite visualizar os processos remotos detalhadamente. Com essas informações, é possível passar para o PsKill ou o PsSuspend se, por exemplo, houver algum processo que deva ser interrompido.

PsLoggedOn

A premissa por trás de PsLoggedOn é auto-explicativa. O utilitário mostra quem está conectado no sistema. Podem ser logons locais (interativos) ou logons de compartilhamento de rede. Similar ao PsFile, esse recurso pode ser útil para determinar quem está usando o servidor que você talvez queira realizar a manutenção. O uso é muito simples:

PsLoggedOn \\computer

O PsLoggedOn tem apenas dois parâmetros opcionais: -l mostra apenas os logons locais (não os de rede) e -x exclui o tempo de logon.

Embora seja básico, o PsLoggedOn permite obter informações facilmente que talvez tivessem que ser investigadas em alguns locais do Windows.

PsLogList

Um dos utilitários normalmente mais úteis, o PsLogList é uma ferramenta para despejar os logs de evento do Windows em um formato de texto que pode ser usado por leitores de log, bancos de dados ou onde desejar. A principal vantagem é o fato de este utilitário converter as entradas do log de evento do formato binário em algo que pode ser facilmente transformado ou automatizado. (Obviamente, no Windows Vista™, os logs de evento estão disponíveis nativamente como XML, mas esse assunto fica para outro dia.)

O uso do PsLogList é:

PsLogList \\computer -u username -p password

Vários comutadores e parâmetros adicionais também estão disponíveis, como mostra a Figura 6.

Figure 6 Comutadores do PsLogList

Comutador Descrição
-a Despeja apenas os eventos após a data especificada.
-b Despeja apenas os eventos antes da data especificada.
-c Limpa o log de evento permanentemente após despejar a saída desejada.
-d Exibe apenas as informações para o número de dias especificado.
-e Exclui eventos com a ID especificada (até 10 podem ser especificadas).
-f Filtra tipos de eventos (aviso, erro e outros).
-g Exporta o log de evento como um arquivo EVT, requer o comutador -c.
-h Exibe apenas as informações para o número de horas especificado.
-l Despeja a partir do arquivo EVT especificado.
-m Exibe apenas as informações para o número de minutos especificado.
-n Exibe apenas o número especificado de eventos mais recentes.
-o Mostra apenas os eventos de uma origem específica (-o SRService para o serviço de restauração de sistemas Windows, por exemplo).
-q Exclui eventos de uma origem específica (o oposto de -o).
-r Ordem invertida, despeja dos eventos mais antigos para os mais recentes do log.
-s Lista os registros de cada linha dos campos delimitados.
-t Especifica algo diferente de uma vírgula como delimitador da saída -s.
-w Aguarda os novos eventos serem preenchidos e despejados em tempo real. Isso é aplicável apenas no sistema local.
-x Despeja os dados estendidos dos logs de evento.
eventlog Especifica qual log de evento deve ser despejado. System é o padrão.
@file Executa o comando em todos os computadores especificados no arquivo de texto.

Os logs de evento do Windows podem ser uma ferramenta de diagnóstico incrivelmente poderosa, mas o difícil é obter os dados no ponto em que podem ser manipulados ou consolidados. O PsLogList realiza esse truque.

PsPasswd

O PsPasswd é um utilitário simples, mas poderoso, desenvolvido com algumas das mesmas funções de Net.exe, mas com remotabilidade e automatização em mente.

PsPasswd  \\computer -u username -p password Username Newpassword

É possível especificar um computador, nenhum computador (o sistema local) ou, se o computador for especificado como \\*, o utilitário será executado em todos os computadores do domínio atual. O PsPasswd tem apenas um parâmetro adicional disponível: @file executa o comando em todos os computadores especificados no arquivo de texto. Mais uma vez, é um utilitário muito básico que é muito útil para vários sistemas.

PsService

O PsService permite visualizar e editar informações do SCM (Gerenciador de controle de serviços) em um ou mais sistemas da rede e é possível até mesmo procurar o nome de um serviço específico nos sistemas da rede.

PsService \\computer -u username -p password command options

Ao executar o PsService, o comando representa um dos comandos listados na Figura 7 e options especifica um atributo a ser aplicado em um determinado comando. Se nenhum comutador de comando adicional for fornecido, o PsService fará um despejo completo das informações do SCM.

Figure 7 Comandos do PsService

Comando Descrição
query Consulta um serviço específico.
config Consulta as informações de configuração de um serviço específico.
setconfig Define as informações de configuração de um serviço específico.
start Inicia um serviço.
stop Interrompe um serviço.
restart Reinicia (interrompe e inicia) um serviço.
pause Pausa um serviço.
cont Retoma um serviço pausado.
depend Mostra quais serviços dependem de um serviço específico.
find Procura na rede uma instância específica do serviço.
security Fornece as informações de segurança de um serviço específico.

Desse modo, é possível encarar o PsService como uma poderosa versão da linha de comando remota de Services.msc, mas que também permite procurar serviços na rede (possivelmente mais perigosos) e definir informações de configuração.

PsShutdown

PsShutdown é outro dos meus favoritos. Embora alguns digam que a Microsoft inclui uma ferramenta que manipula essa tarefa (shutdown.exe), não é a mesma coisa. A principal diferença é a função do PsShutdown, a saber, sua capacidade de encerrar ou reiniciar um sistema remoto. Além disso, ele permite colocar o sistema no modo de espera ou hibernação (não apenas encerramento ou reinicialização), bloquear um sistema e reiniciá-lo após exibir uma mensagem para o usuário durante um determinado período de tempo.

PsShutdown \\computer -u username -p password

Vários parâmetros adicionais também estão disponíveis para serem usados com o PsShutdown, como mostra a Figura 8.

Figure 8 Comutadores do PsShutdown

Comutador Descrição
-a Interrompe um encerramento já em andamento iniciado pelo PsShutdown.
-c Permite que um usuário interativo interrompa o encerramento.
-d Suspende o computador (espera).
-e Códigos de motivo de encerramento. Recomendo a consulta ao site da Microsoft para obter ajuda sobre esses códigos, pois podem causar problemas ao serem usados com o PsShutdown e o shutdown.exe interno. Acesse msdn2.microsoft.com/en-us/library/aa376885.aspx para obter mais informações.
-f Força a finalização de todos os aplicativos em execução.
-h Coloca o computador em hibernação.
-k Desliga o computador (reinicia se o desligamento não for suportado).
-l Bloqueia o computador.
-m Especifica a mensagem a ser exibida para qualquer usuário interativo.
-n Especifica o tempo limite que deve ser aguardado antes da falha de conexão nos computadores remotos.
-o Desconecta o usuário do console.
-r Reinicia o computador.
-s Encerra, mas não desliga o computador.
-t Tempo esperado antes de executar o comando de encerramento ou a hora específica para desligar.
-v Exibe a mensagem para os usuários até o encerramento.
@file Executa o comando em todos os computadores especificados no arquivo de texto.

Como vocês podem perceber, o PsShutdown é um utilitário de controle de energia do sistema extremamente configurado e ainda assim relativamente fácil de usar.

PsSuspend

O PsSuspend é um utilitário útil se desejar obter um processo não autorizado sob controle temporariamente ou se simplesmente desejar obter um processo de alto uso da CPU que não está girando temporariamente sem perder nenhum contexto de dados ou aplicativo.

PsSuspend \\computer -u username -p password process ID

É possível obter a ID do processo usando o PsList. Após suspender um processo, use o comutador -r para retomá-lo. Observe que o conceito de suspensão e retomada de um processo também é implementado pelo Process Explorer, embora funcione apenas localmente. Obviamente, o PsSuspend pode suspender e retomar processos tanto remota como localmente, o que é uma vantagem da implementação interna do Process Explorer.

Conclusão

Na minha opinião, o PsTools é um conjunto imprescindível de utilitários. Com os demais utilitários da Sysinternals (a saber, Regmon, Filemon, Process Explorer e agora Process Monitor), o PsTools é o primeiro programa que coloco em meu caminho ao reinstalar o Windows em qualquer sistema. Espero que essa coluna tenha trazido novas informações sobre o PsTools e, caso contrário, espero que tenham aprendido algo mais sobre as ferramentas. Muito obrigado a Mark Russinovich, obviamente, por fornecer essas ferramentas gratuitamente durante todos esses anos e por me ajudar com o conteúdo dessa coluna.

Wes Miller é gerente de desenvolvimento da Pluck (www.pluck.com) em Austin, Texas. Antes disso, Wes trabalhou na Winternals Software, em Austin, e na Microsoft, como gerente de programas e gerente de produtos do Windows. Para entrar em contato com Wes, você pode enviar um email para technet@getwired.com.

© 2008 Microsoft Corporation e CMP Media, LLC. Todos os direitos reservados. A reprodução parcial ou completa sem autorização é proibida..