Psexec: Um Guia Abrangente com Exemplos do Mundo Real

Se houvesse uma utilidade de linha de comando que pudesse competir com o robocopy em termos de utilidade, seria o PsExec. A utilidade PsExec da Sysinternals é tão ubíqua quanto possível no arsenal de um administrador de TI. Essa ferramenta permite que os administradores executem comandos remotamente, como se estivessem no computador local.

Para abordar a ferramenta PsExec em profundidade, era apropriado cobrir essa ferramenta cobiçada em um Guia Completo da ATA. Neste guia, você aprenderá o que é o psexec, suas capacidades e muitos exemplos de como usar essa ferramenta útil.

O que é o PsExec.exe?

Se você é novo em TI ou talvez não tenha tido a necessidade de executar comandos e ferramentas em computadores remotos, pode não saber o que é o psexec.

PsExec ou psexec.exe é uma utilidade de linha de comando construída para o Windows. Permite que os administradores executem programas em computadores locais e, mais comumente, em computadores remotos. É uma utilidade gratuita parte do Sysinternals pstools suite construído por Mark Russinovich há muitos anos.

Foi criado para substituir ferramentas como o telnet, que obrigavam a abrir portas e introduziam vulnerabilidades de segurança. Atualmente, temos outras opções como o PowerShell Remoting e o Invoke-Command cmdlet do PowerShell, mas o PsExec ainda tem seu lugar.

PsExec permite total interatividade para aplicativos de console sem a necessidade de instalar qualquer software. Como você verá neste Guia Definitivo, o PsExec pode iniciar prompts de comando interativos, ser executado como sistema local em computadores remotos, executar comandos em vários computadores simultaneamente e muito mais.

Ele oferece suporte a todas as versões do Windows desde o Windows XP. Isso significa que sim, o PsExec no Windows 10 também é possível. É uma ferramenta simples de usar que funciona em quase tudo, mas não confunda sua simplicidade com suas capacidades!

Pré-requisitos

Você simplesmente precisa estar executando um sistema operacional Windows moderno para que o PsExec seja executado em seu computador local. No entanto, você vai querer executar o psexec em computadores remotos. Para fazer isso, você precisará garantir que alguns itens estejam em ordem.

Se você ainda não possui esses itens ou está inseguro, não se preocupe. Na próxima seção, abordaremos como escrever algum PowerShell para testar seus computadores remotos.

Na data desta redação, o PsExec está na versão 2.2 e será a versão abordada neste artigo.

Instalando o PsExec (Com Configuração em Computador Remoto)

Tecnicamente, você não instala o PsExec, já que é apenas uma utilidade de linha de comando, mas é quase isso. Como nenhuma instalação é necessária, você só precisa baixá-lo e extrair do arquivo zip do PsTools. O PsExec não está disponível como uma utilidade independente e faz parte do conjunto de ferramentas PsTools.

Baixando o PSExec

Você pode extrair o arquivo ZIP manualmente ou aqui está um trecho útil do PowerShell para baixar e extrair o PsExec do arquivo ZIP do pstools. Observe que isso remove todas as outras ferramentas PsTools. Muitas delas ainda são úteis, mas não vamos abordá-las neste artigo.

PS> Invoke-WebRequest -Uri 'https://download.sysinternals.com/files/PSTools.zip' -OutFile 'pstools.zip'
PS> Expand-Archive -Path 'pstools.zip' -DestinationPath "$env:TEMP\pstools"
PS> Move-Item -Path "$env:TEMP\pstools\psexec.exe" .
PS> Remove-Item -Path "$env:TEMP\pstools" -Recurse

Configuração do Computador Remoto

Depois de baixar o PsExec, você precisará garantir que qualquer computador remoto em que você vá executá-lo esteja aberto. O PsExec tem requisitos simples; Compartilhamento de Arquivos e Impressoras ativado e o compartilhamento administrativo admin$ disponível.

Você poderia ir a todos os computadores remotos, abrir o applet Firewall do Windows, ir para Aplicativos Permitidos e ativar Compartilhamento de Arquivos e Impressoras em todos os computadores, como mostrado abaixo.

Observe que o Compartilhamento de Arquivos e Impressoras é um risco de segurança conhecido, então garanta que apenas o perfil de firewall Privado esteja habilitado.

Allowing File and Print Sharing in the Windows Firewall

Ou você poderia visitar cada computador e executar a utilidade netsh para abrir via:

> netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=Yes

Ou você poderia usar o cmdlet Set-NetFirewallRule do PowerShell para fazer isso.

PS51> Set-NetFirewallRule -DisplayGroup "File And Printer Sharing" -Enabled True -Profile Private

Se você preferir não visitar cada computador, você tem o PowerShell Remoting disponível e está em um domínio Active Directory, você também pode abrir o firewall em vários computadores de uma só vez usando o cmdlet Invoke-Command.

PS51> Invoke-Command -ComputerName PC1, PC2, PC3 -ScriptBlock { Set-NetFirewallRule -DisplayGroup "File And Printer Sharing" -Enabled True -Profile Private }

Usando o PsExec

Antes de você poder executar, você precisa aprender. Se você nunca usou o PsExec antes, está prestes a ter uma experiência incrível! Certifique-se de ler esta seção primeiro para ter uma noção básica antes de aprofundar-se mais adiante neste artigo.

Na primeira vez que você executar o PsExec em um novo sistema, você verá imediatamente o contrato de licença do PsExec. Você terá que clicar no botão Aceitar para começar a usá-lo.

PSExec license agreement (EULA)

Se você deseja impedir que o contrato de licença seja exibido, você pode aceitá-lo silenciosamente usando o switch /accepteula conforme mostrado abaixo.

> psexec /accepteula

Você aprenderá alguns truques para silenciar esta janela de EULA em computadores locais e remotos mais adiante no artigo.

Encontrando Ajuda

Ao explorar o PsExec, você não deve usar nenhum switch. Quando você simplesmente executa o psexec sem switches, ele retornará todas as opções e uma breve explicação do que cada uma faz. Todas as opções estão na tabela abaixo para sua conveniência.

Switch Explanation
-a Separate processors on which the application can run with commas where 1 is the lowest numbered CPU. For example, to run the application on CPU 2 and CPU 4, enter: “-a 2,4”
-c Copy the specified program to the remote system for execution. If you omit this option the application must be in the system path on the remote system.
-d Don’t wait for process to terminate (non-interactive).
-e Does not load the specified account’s profile.
-f Copy the specified program even if the file already exists on the remote system.
-i Run the program so that it interacts with the desktop of the specified session on the remote system. If no session is specified the process runs in the console session. Some have reported best results always using the -s switch with -i due to windows being unintelligible.
-h If the target system is Vista or higher, has the proc
-l Run process as limited user (strips the Administrators group and allows only privileges assigned to the Users group). On Windows Vista the process runs with Low Integrity.
-n Specifies timeout in seconds connecting to remote computers.
-p Specifies optional password for user name. If you omit this you will be prompted to enter a hidden password.
-r Specifies the name of the remote service to create or interact. with.
-s Run the remote process in the System account.
-u Specifies optional user name for login to computer.
-v Copy the specified file only if it has a higher version number or is newer on than the one on the remote system.
-w Set the working directory of the process (relative
-x Display the UI on the Winlogon secure desktop (local system only).
-arm Specifies the remote computer is of ARM architecture.
-priority Specifies -low, -belownormal, -abovenormal, -high or
-realtime run the process at a different priority. Use
-background run at low memory and I/O priority on Vista.
computer Direct PsExec to run the application on the computer or computers specified. If you omit the computer name PsExec runs the application on the local system, and if you specify a wildcard (\*), PsExec runs
@file PsExec will execute the command on each of the computers listed in the file.
-accepteula This flag suppresses the display of the license dialog.
-nobanner Do not display the startup banner and copyright message.

Executando um Comando Remoto Simples

No seu nível mais básico, o PsExec requer dois parâmetros: um nome de computador e um comando para executar. Se você tiver um comando para executar no computador remoto que não requer argumentos, como hostname, você pode simplesmente adicioná-lo após o nome do computador.

Observe que se você não especificar um caminho completo do arquivo, o comando a ser executado deve estar no caminho do usuário ou do sistema. Além disso, se você tiver um programa com espaços no nome, sempre pode colocar o programa entre espaços, como “my application.exe”.

> psexec \\REMOTECOMPUTER hostname

Você pode ver abaixo que para executar o comando hostname no computador CONTOSODC1, você define o caminho UNC seguido pelo comando. O PSExec então se conectará ao computador remoto de forma segura, executará o comando e retornará a saída. Neste caso, o comando hostname retornou o nome do computador, que é CONTOSODC1.

Se o comando não for cmd ou outra console, o PsExec sairá rapidamente da sessão remota e retornará o código de saída que o processo remoto retornou.

Nota: O erro ou código de saída retornado pelo psexec não vem do PsExec em si. Em vez disso, vem do comando que o psexec executou no computador remoto.

Successful psexec remote command execution

Como o PsExec Funciona em Computadores Remotos

O PsExec passa por algumas etapas para executar programas em computadores remotos.

  1. Crie um arquivo PSEXESVC.exe em C:\Windows.
  2. Crie e inicie um serviço do Windows no computador remoto chamado PsExec.
  3. Execute o programa sob um processo pai de psexesvc.exe.
  4. Quando concluído, o serviço PsExec do Windows será interrompido e removido.

Quando o processo não funciona 100% corretamente, pode ser necessário remover manualmente o serviço usando o comando sc.

Executando um Comando Local Simples

Mesmo que o PsExec seja mais conhecido por executar comandos em computadores remotos, você também pode executar comandos localmente.

Você pode executar comandos localmente simplesmente não fornecendo um nome de computador, como mostrado abaixo.

> psexec <local command or EXE file>

Por que você faria isso? Uma razão seria executar comandos como a conta local SYSTEM. Você pode usar o parâmetro -s para executar qualquer comando como SYSTEM localmente ou remotamente, como você aprenderá mais adiante.

Dê uma olhada no vídeo curto abaixo. Observe que você só precisa fornecer o parâmetro -s junto com o interpretador de comandos executável para o PsExec iniciar uma nova sessão de comando como NT AUTHORITY\SYSTEM.

Running Psexec as SYSTEM

Comandos PsExec (Tornando-se Mais Avançado)

Depois de dominar o básico, você pode começar a aprender técnicas mais avançadas no psexec. PsExec pode fazer muito mais do que apenas executar um único comando em um único computador.

Executando comandos em vários computadores

O PsExec não se limita a executar comandos em um único computador remoto de cada vez. Esta ferramenta também suporta copiar programas e executar comandos em vários computadores de uma vez.

Você pode executar o PsExec em vários computadores de várias maneiras.

Nomes de Computadores Separados por Vírgula

Normalmente, ao executar um comando em um único computador remoto, você especificará um único nome de computador como \\COMPUTADORREMOTo. Você também pode especificar vários computadores separados por vírgulas, como abaixo.

> psexec \\REMOTECOMPUTER1,REMOTECOMPUTER2,REMOTECOMPUTER3

Todos os Computadores em um Domínio do Active Directory

Se estiver executando PsExec em um computador associado a um domínio do Active Directory e deseja executar um comando em todos os computadores desse domínio, use um caractere curinga.

O PsExec pesquisará todo o seu domínio do Active Directory e tentará executar um comando em cada computador. Abaixo está um exemplo de sintaxe de como o PsExec tentará se conectar a todos os computadores no domínio em que o computador em execução está inserido e executar o comando hostname.

> psexec \\* hostname

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

Enumerating domain...

Observe que se você usar um asterisco para encontrar todos os computadores em um domínio enquanto o computador local faz parte de um grupo de trabalho, receberá o erro Ocorreu um erro do sistema: 6118.

O uso de um caractere curinga força o PsExec a essencialmente executar o comando net view /all para primeiro encontrar todos os computadores no domínio. Esta é uma maneira desatualizada de encontrar informações de computador devido à sua dependência do NetBIOS.

Lendo de um Arquivo

Outra maneira de executar comandos em vários computadores de uma só vez é usar um arquivo de texto. Usando a sintaxe @<nomedoarquivo.txt>, o PsExec lerá cada linha no arquivo de texto como se fosse um nome de computador. Ele então processará cada computador individualmente.

Abaixo você pode ver um exemplo de uso do PowerShell para criar um arquivo de texto com nomes de computadores delimitados por linha e usar isso como entrada para o psexec.

PS51> (Get-AdComputer -Filter *).Name | Out-File computers.txt
PS51> psexec @computers.txt hostname

Copiando programas locais para o computador remoto

Usando a opção -c, o psexec irá copiar qualquer programa local para o computador remoto antes da execução.

Talvez você tenha um arquivo EXE em seu computador local em uma pasta C:\Tools e gostaria de executá-lo em um computador remoto. Você pode fazer isso usando a seguinte sintaxe:

> psexec \\REMOTECOMPUTER -c C:\Tools\program.exe

Ao usar a opção -c e não especificar um arquivo executável, o PsExec ainda copiará o arquivo, mas você receberá um erro indicando que o sistema não pode encontrar o arquivo especificado. Isso acontece porque o PsExec sempre tentará executar o arquivo que você copia.

Se você precisar copiar arquivos para computadores remotos antes de usar o PsExec, use o Copy-Item cmdlet do PowerShell em vez disso.

Executando Processos Remotos com Credenciais Alternativas

Outro caso de uso popular do PsExec é executar comandos com contas alternativas. Por padrão, o PsExec tentará se conectar ao computador remoto usando sua conta atualmente conectada. Mais especificamente, ele irá impersonar sua conta no computador remoto.

O uso da opção -u e opcional -p permite que você se conecte ao computador remoto com uma conta de usuário alternativa. O PsExec então criptografará tanto o nome de usuário quanto a senha e os enviará ao computador remoto para autenticação.

Por exemplo, se você estiver em um grupo de trabalho, sempre será necessário especificar o nome de usuário para autenticar-se no computador remoto.

> psexec \\REMOTECOMPUTER hostname -u localadmin -p secret-p@$$word

Se ambos os computadores forem membros do Active Directory, certifique-se de prefixar a conta de usuário com o nome do domínio.

> psexec \\REMOTECOMPUTER hostname -u contoso.local\domainadmin -p secret-p@$$word

Note que quando você não usa o switch -u, o psexec assume sua conta logada no computador remoto. Ele não terá acesso a nenhum recurso de rede.

Executando Processos como a Conta DO SISTEMA LOCAL

Uma das características mais úteis de executar o PsExec sob uma conta alternativa é usar o switch -s. Este switch permite que o PsExec (e sua aplicação executada remotamente) seja executado sob a conta DO SISTEMA LOCAL do computador remoto (ou local).

Observe abaixo que não incluí um nome de computador remoto. O PsExec também executará com prazer no computador local. Neste caso, estou usando a opção -s para dizer ao PsExec para iniciar um prompt de comando local como a conta DO SISTEMA LOCAL.

Running psexec as LOCAL SYSTEM

Para executar um prompt de comando como SISTEMA LOCAL em um computador remoto, adicione o nome do computador à referência como abaixo:

> psexec -s \\REMOTECOMPUTER cmd

Executando Aplicativos GUI Remotamente

Outro switch útil do PsExec é o -i. Por padrão, o PsExec não permite que o comando executado remotamente abra janelas no computador remoto. Isso é útil porque se você estiver executando comandos remotamente, de qualquer maneira não verá a tela.

Mas talvez você precise abrir programas para seus usuários. Você pessoalmente não estará usando a aplicação, mas um usuário final sim. Nesse caso, use o switch -i.

Talvez você precise abrir uma janela de bloco de notas em um computador remoto. Sem problemas. Execute notepad.exe com o switch -i e o PsExec abrirá o Bloco de Notas.

> psexec -i \\REMOTECOMPUTER notepad
Running psexec in interactive mode

Certifique-se também de usar o interruptor -d para desconectar quando a janela interativa for ativada. Por padrão, o PsExec aguardará o processo que ele executou ser concluído. Se o processo remoto (como o Bloco de Notas neste caso) continuar em execução, o PsExec nunca retornará o controle.

O uso do interruptor -d com -i indicará ao PsExec para não aguardar a conclusão do processo remoto. Em vez disso, ele se desconectará e retornará o controle para você assim que o processo remoto for executado.

Redirecionamento de Saída

O PsExec transmitirá qualquer saída enviada pelo processo remoto para sua sessão local. Tipicamente, essa saída vai diretamente para o seu console local. Mas se você quiser redirecioná-la, pode fazer isso usando operadores de redirecionamento típicos.

Por exemplo, se deseja executar um comando e silenciar toda a saída, pode redirecionar a saída e os erros para nulo usando ^> nul ^2^&1.

Observe que os caracteres especiais são escapados com um acento circunflexo. ( ^).

Casos de Uso do PsExec

Depois de aprender a usar o psexec, você inevitavelmente encontrará vários casos de uso específicos. Nesta seção, você aprenderá alguns casos de uso e exemplos do mundo real usando o psexec.

Executando um Prompt de Comando Remoto (psexec cmd)

Um dos casos de uso mais comuns é iniciar o PsExec como um prompt de comando interativo. O PsExec não apenas executa comandos remotamente, mas também pode enviar a saída do comando de volta para o console. Por causa disso, ele pode ser um ótimo substituto para o telnet (se alguém ainda estiver usando) ou talvez para o comando PowerShell Enter-PSSession.

Para iniciar um comando remoto, especifique o nome do computador remoto e execute o aplicativo cmd. Cmd é o interpretador de comandos do Windows. Como o PsExec suporta o uso interativo, ele retornará um cursor piscando e um prompt com prazer.

> psexec \\REMOTEPC cmd
Opening a command prompt on a remote computer

Neste ponto, o mundo está em suas mãos. Você pode executar comandos no seu computador local através deste prompt de comando “aninhado” e eles serão executados no computador remoto.

Para sair do prompt de comando, digite exit. O PsExec encerrará o processo cmd no computador remoto e retornará o foco para o computador local.

NÃO use Ctrl-C para fechar uma sessão interativa do cmd. Sempre use exit. Se você usar Ctrl-C, a sessão do psexec continuará em execução no computador remoto.

Instalando Software Remotamente

Você pode usar o PsExec como uma ferramenta de implantação de software básica. Talvez você tenha um instalador MSI que precisa ser executado em um ou mais computadores remotos chamado setup.msi. Este instalador precisa ser copiado para os computadores remotos e, em seguida, executado com o utilitário msiexec.exe com algumas opções.

Abaixo está um exemplo de como você poderia usar o PsExec para implantar software remotamente. Este exemplo copia o arquivo setup.msi para o computador remoto e em seguida inicia o instalador MSI de forma interativa na conta SYSTEM.

> psexec.exe \\REMOTECOMPUTER –i –s "msiexec.exe /i setup.msi" -c setup.msi

Aceitando o EULA sem o switch /accepteula

Como mencionado anteriormente, na primeira execução do PsExec, será necessário aceitar um EULA. Você pode usar o switch /accepteula, mas também pode “prepará-lo” no registro.

Ao ser lançado pela primeira vez, o PsExec cria uma chave de registro em HKCU\Software\Sysinternals\PsExec. Em vez dessa chave de registro, ele cria um valor de registro chamado EulaAccepted com um valor DWORD de 1.

Usando seu método favorito para modificar o registro em computadores remotos, você só precisa criar essa chave/valor nos computadores em que deseja executar o PsExec. Uma vez criado, não há necessidade de executar /accepteula!

Casando PowerShell e PsExec

Antes do PowerShell, tínhamos apenas o PsExec. Agora, temos opções. O PowerShell pode substituir o PsExec em muitas situações, mas complementá-lo em outras.

Construindo Nomes de Computador com PowerShell

Em vez de usar \\* para encontrar todos os computadores no domínio, você pode usar o PowerShell. Usando o PowerShell, você não só pode escolher determinados computadores, mas também não precisa usar o comportamento propenso a firewall de net view /all.

Você pode usar o PowerShell para criar uma string contendo todos os nomes de computador separados por vírgula. Você pode então passar essa string para o PsExec, que processará cada um como se você tivesse digitado manualmente.

Você pode ver abaixo um exemplo de uso do cmdlet Get-AdComputer parte do módulo ActiveDirectory do PowerShell .

PS51> psexec "\\$((Get-AdComputer -Filter *).Name -join ',')" hostname

Habilitando a Remoção do PowerShell Remotamente

Se você tiver computadores remotos que prefira usar a Remoção do PowerShell em vez do PsExec, pode usar o PsExec para habilitá-los.

Ao executar Enable-PSRemoting ou o arquivo em lote winrm.cmd em computadores remotos, você pode ativar rapidamente a Remoção do PowerShell em vários computadores de uma só vez.

Abaixo você pode ver um exemplo de chamada do arquivo em lote winrm.cmd em um computador remoto sendo executado como a conta do SISTEMA. Como a saída desse comando não é necessária, ela é silenciada com 2>&1> $null.

$computerName = 'REMOTECOMPUTER'
psexec "\\$Computername" -s c:\windows\system32\winrm.cmd quickconfig -quiet 2&>&1> $null 

Mensagens de Erro do PsExec

Vale mencionar novamente desde o início que a maioria dos códigos de erro que você vê retornados do PsExec são do processo remoto; não do PsExec. Mas é útil ter uma compreensão desses códigos de erro e o que eles podem significar.

Se você gostaria de uma referência sobre todos os códigos de erro do Windows, recomendo conferir esta lista exaustiva de códigos de erro do Windows.

Abaixo está uma lista de códigos de erro comuns que você pode ver retornados pelo PsExec.

Error Code Explanation
-2146232576 Typically returned by Windows Update when an error occurs.
0 Command executed successfully
1 Incorrect function. A problem happened. That’s about it.
1603 Fatal error during installation. This typically is returned by msiexec.
2 The system cannot find the file specified
4 The system cannot open the file.
5 Access is denied.
6 The handle is invalid.
6118 The list of servers for this workgroup is not currently available

Seu Feedback

Guias Definitivos da ATA são grandes. Há muita informação neles e é provável que eu perca alguma coisa aqui ou ali, ou cometa um erro. Se você notar algo errado ou achar que algo deveria ser adicionado a este guia, por favor, me avise pelos comentários. Ficarei feliz em dar créditos a você na postagem.

Créditos

  • Agradecimentos a Mathias (comentários) por vários feedbacks.

Source:
https://adamtheautomator.com/psexec/