Quando você trabalha remotamente, digita comandos no PowerShell em um computador (conhecido como "computador local"), mas os comandos são executados em outro computador (conhecido como "computador remoto"). A experiência de trabalhar remotamente deve ser o mais parecida possível com trabalhar diretamente no computador remoto.
Observação
Para usar a comunicação remota do PowerShell, o computador remoto deve ser configurado para comunicação remota. Para obter mais informações, consulte about_Remote_Requirements.
Ambos os computadores devem ter o PowerShell instalado?
Sim. Para trabalhar remotamente, os computadores locais e remotos devem ter o PowerShell, o Microsoft .NET Framework e o protocolo Web Services for Management (WS-Management). Todos os arquivos e outros recursos necessários para executar um comando específico devem estar no computador remoto.
Os computadores que executam o Windows PowerShell 3.0 e os computadores que executam o Windows PowerShell 2.0 podem se conectar uns aos outros remotamente e executar comandos remotos. No entanto, alguns recursos, como a capacidade de se desconectar de uma sessão e se reconectar a ela, funcionam somente quando ambos os computadores estão executando o Windows PowerShell 3.0.
Você deve ter permissão para se conectar ao computador remoto, permissão para executar o PowerShell e permissão para acessar armazenamentos de dados (como arquivos e pastas) e o registro no computador remoto.
Para obter mais informações, consulte about_Remote_Requirements.
Como funciona a comunicação remota?
Quando você envia um comando remoto, o comando é transmitido pela rede para o mecanismo do PowerShell no computador remoto e é executado no cliente PowerShell no computador remoto. Os resultados do comando são enviados de volta para o computador local e aparecem na sessão do PowerShell no computador local.
Para transmitir os comandos e receber a saída, o PowerShell usa o protocolo WS-Management. Para obter informações sobre o protocolo WS-Management, consulte WS-Management Protocol na documentação do Windows.
A partir do Windows PowerShell 3.0, o PowerShell armazena a informação da sessão remota no computador remoto. Isso permite que você se desconecte da sessão e se reconecte de uma sessão diferente ou de um computador diferente sem interromper os comandos ou perder o estado.
A comunicação remota do PowerShell é segura?
Quando você se conecta a um computador remoto, o sistema usa as credenciais de nome de usuário e senha no computador local ou as credenciais fornecidas no comando para fazer login no computador remoto. As credenciais e o resto da transmissão são encriptados.
Para aumentar a proteção, pode configurar o computador remoto para usar Secure Sockets Layer (SSL) em vez de HTTP para pedidos de Gestão Remota do Windows (WinRM). Em seguida, os usuários podem usar o parâmetro UseSSL dos cmdlets Invoke-Command, New-PSSessione Enter-PSSession ao estabelecer uma conexão. Esta opção usa o canal HTTPS mais seguro em vez de HTTP.
Todos os comandos remotos exigem comunicação remota do PowerShell?
Não. Alguns cmdlets têm um parâmetro ComputerName que permite obter objetos do computador remoto.
Estes cmdlets não usam a funcionalidade de comunicação remota do PowerShell. Podes usá-los em qualquer computador a correr PowerShell. Os seguintes cmdlets não necessitam de remoting no PowerShell:
Get-HotFixRename-ComputerRestart-ComputerStop-Computer
Para localizar todos os cmdlets com um parâmetro ComputerName, digite:
Get-Help * -Parameter ComputerName
# or
Get-Command -ParameterName ComputerName
Para determinar se o parâmetro ComputerName de um cmdlet específico requer comunicação remota do PowerShell, consulte a descrição do parâmetro. Para exibir a descrição do parâmetro, digite:
Get-Help <cmdlet-name> -Parameter ComputerName
Por exemplo:
Get-Help Get-HotFix -Parameter ComputerName
Para todos os outros comandos, use o cmdlet Invoke-Command.
Como executar um comando num computador remoto?
Para executar um comando em um computador remoto, use o cmdlet Invoke-Command. Inclua o seu comando em órteses ({}). Use o ScriptBlock parâmetro de Invoke-Command para especificar o comando.
Use o parâmetro Nomecomputador de Invoke-Command para especificar um computador remoto. Ou, você pode criar uma conexão persistente com um computador remoto (uma sessão) e, em seguida, usar o parâmetro Session de Invoke-Command para executar o comando na sessão.
Por exemplo, os comandos a seguir executam um comando Get-Process remotamente.
Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-Process}
# - OR -
Invoke-Command -Session $s -ScriptBlock {Get-Process}
Para interromper um comando remoto, escreva Ctrl+C. A solicitação de interrupção é passada para o computador remoto, onde encerra o comando remoto.
Para mais informações sobre comandos remotos, consulte about_Remote e a Ajuda dos cmdlets que suportam funcionalidades remotas.
Posso simplesmente telnet em um computador remoto?
Você pode usar o cmdlet Enter-PSSession para iniciar uma sessão interativa com um computador remoto.
Na linha de comandos do PowerShell, digite:
Enter-PSSession <ComputerName>
O prompt de comando é alterado para mostrar que você está conectado ao computador remoto.
<ComputerName>\C:>
Os comandos que introduz correm no computador remoto como se os tivessem introduzido diretamente no computador remoto.
Para encerrar a sessão interativa, digite:
Exit-PSSession
Uma sessão interativa é uma sessão persistente que usa o protocolo WS-Management. Não é o mesmo que usar Telnet, mas proporciona uma experiência semelhante.
Para obter mais informações, consulte Enter-PSSession.
Posso criar uma conexão persistente?
Sim. Você pode executar comandos remotos especificando o nome do computador remoto, seu nome NetBIOS ou seu endereço IP. Ou pode executar comandos remotos especificando uma sessão PowerShell (PSSession) ligada ao computador remoto.
Quando você usa o parâmetro ComputerName de Invoke-Command ou Enter-PSSession, o PowerShell estabelece uma conexão temporária. O PowerShell usa a conexão para executar apenas o comando atual e, em seguida, fecha a conexão. Este comportamento funciona bem para executar um único comando ou vários comandos não relacionados, mesmo em muitos computadores remotos.
Quando você usa o cmdlet New-PSSession para criar uma PSSession, o PowerShell estabelece uma conexão persistente para a PSSession. Em seguida, você pode executar vários comandos no PSSession, incluindo comandos que compartilham dados.
Normalmente, você cria uma PSSession para executar uma série de comandos relacionados que compartilham dados. Caso contrário, a conexão temporária criada pelo parâmetro ComputerName é suficiente para a maioria dos comandos.
Para obter mais informações sobre sessões, consulte about_PSSessions.
Posso executar comandos em mais de um computador de cada vez?
Sim. O parâmetro ComputerName do cmdlet Invoke-Command aceita vários nomes de computador e o parâmetro Session aceita várias PSSessions.
Quando você executa um comando Invoke-Command, o PowerShell executa os comandos em todos os computadores especificados ou em todas as PSSessions especificadas.
O PowerShell pode gerenciar centenas de conexões remotas simultâneas. No entanto, o número de comandos remotos que pode enviar pode ser limitado pelos recursos do seu computador e pela sua capacidade de estabelecer e manter múltiplas ligações de rede.
Para mais informações, consulte o exemplo no Invoke-Command artigo de Ajuda.
Onde estão os meus perfis?
Os perfis PowerShell não são executados automaticamente em sessões remotas, por isso os comandos que o perfil adiciona não estão presentes na sessão. Além disso, a variável automática $PROFILE não é preenchida em sessões remotas.
Para executar um perfil em uma sessão, use o cmdlet Invoke-Command.
Por exemplo, o comando a seguir executa o perfil CurrentUserCurrentHost do computador local na sessão no $s.
Invoke-Command -Session $s -FilePath $PROFILE
O comando a seguir executa o perfil de CurrentUserCurrentHost do do computador remoto na sessão em $s.
Invoke-Command -Session $s {
. "$HOME\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"
}
Depois de executar este comando, os comandos que o perfil adiciona à sessão ficam disponíveis em $s.
Você também pode usar um script de inicialização em uma configuração de sessão para executar um perfil em cada sessão remota que usa a configuração de sessão.
Para obter mais informações sobre perfis do PowerShell, consulte about_Profiles. Para obter mais informações sobre configurações de sessão, consulte Register-PSSessionConfiguration.
Como funciona a limitação em comandos remotos?
Para ajudá-lo a gerenciar os recursos em seu computador local, o PowerShell inclui um recurso de limitação por comando que permite limitar o número de conexões remotas simultâneas estabelecidas para cada comando.
O padrão é 32 conexões simultâneas, mas você pode usar o parâmetro ThrottleLimit dos cmdlets para definir um limite de aceleração personalizado para comandos específicos.
A funcionalidade de limitação aplica-se a cada comando, não a toda a sessão ou ao computador. Se estiveres a executar comandos em simultâneo em várias sessões ou PSSessions, o número de ligações concorrentes é a soma das ligações concorrentes em todas as sessões.
Para localizar cmdlets com um parâmetro ThrottleLimit, digite:
Get-Help * -Parameter ThrottleLimit
-or-
Get-Command -ParameterName ThrottleLimit
A saída dos comandos remotos é diferente da saída local?
Quando você usa o PowerShell localmente, envia e recebe objetos "ao vivo" do .NET Framework; Objetos "ao vivo" são objetos associados a programas reais ou componentes do sistema. Quando você invoca os métodos ou altera as propriedades de objetos dinâmicos, as alterações afetam o programa ou componente real. E, quando as propriedades de um programa ou componente mudam, as propriedades do objeto que as representam também mudam.
No entanto, como a maioria dos objetos ativos não pode ser transmitida pela rede, o PowerShell serializa os objetos devolvidos por comandos remotos. A serialização converte cada objeto em elementos de dados XML da Common Language Infrastructure (CLIXML) para transmissão.
Quando o PowerShell recebe um objeto serializado, converte o CLIXML num tipo de objeto desserializado. O objeto desserializado é um registo preciso das propriedades do objeto, mas já não é um objeto vivo . O objeto deserializado não tem métodos porque já não são eficazes.
Normalmente, você pode usar objetos desserializados da mesma forma que usaria objetos dinâmicos, mas deve estar ciente de suas limitações. Além disso, os objetos devolvidos por Invoke-Command têm propriedades adicionais que ajudam a determinar a origem do comando.
Alguns tipos de objetos, como objetos DirectoryInfo e GUIDs, são convertidos de volta em objetos ativos quando são recebidos. Esses objetos não precisam de nenhum tratamento ou formatação especial.
Para obter informações sobre como interpretar e formatar a saída remota, consulte about_Remote_Output.
Posso executar trabalhos em segundo plano remotamente?
Sim. Um trabalho em segundo plano do PowerShell é um comando do PowerShell que é executado de forma assíncrona sem interagir com a sessão. Quando inicias um trabalho em segundo plano, o prompt de comandos retorna imediatamente. Podes continuar a trabalhar na sessão enquanto o trabalho decorre.
Você pode iniciar um trabalho em segundo plano mesmo enquanto outros comandos estão em execução, porque os trabalhos em segundo plano sempre são executados de forma assíncrona em uma sessão temporária.
Você pode executar trabalhos em segundo plano em um computador local ou remoto. Por padrão, um trabalho em segundo plano é executado no computador local. No entanto, você pode usar o parâmetro AsJob do cmdlet Invoke-Command para executar qualquer comando remoto como um trabalho em segundo plano. Além disso, você pode usar Invoke-Command para executar um comando Start-Job remotamente.
Para mais informações sobre empregos de base em PowerShell, consulte about_Jobs e about_Remote_Jobs.
Posso executar programas do Windows num computador remoto?
Você pode usar comandos remotos do PowerShell para executar programas baseados no Windows em computadores remotos.
Por exemplo, você pode executar Shutdown.exe ou Ipconfig.exe em um computador remoto.
No entanto, não podes usar comandos PowerShell para abrir a interface de qualquer programa num computador remoto.
Quando inicias um programa Windows num computador remoto, o prompt de comandos do PowerShell não retorna até o programa terminar ou até carregares em Ctrl+C para interromper o comando. Por exemplo, se executares o programa ipconfig.exe num computador remoto, o prompt de comandos só retorna quando ipconfig.exe for concluído.
Se usares comandos remotos para iniciar um programa com interface de utilizador, o processo do programa inicia-se, mas a interface de utilizador não aparece. O programa ainda está a decorrer. O prompt de comandos só volta quando paras o programa ou pressionas Ctrl+C, o que interrompe o comando e interrompe o processo.
Por exemplo, se usar um comando PowerShell para correr Notepad num computador remoto, o processo do Bloco de Notas começa no computador remoto, mas a interface do utilizador do Bloco de Notas não aparece. Para interromper o comando e restaurar o prompt de comandos, pressione Ctrl+C.
Posso limitar os comandos que os utilizadores podem executar remotamente no meu computador?
Sim. Cada sessão remota deve usar uma das configurações de sessão no computador remoto. Podes gerir as configurações da sessão no teu computador. Podes definir permissões nessas configurações de sessão para limitar quem pode executar comandos remotamente no teu computador. Também podes limitar que comandos podem executar.
Uma configuração de sessão configura o ambiente para a sessão. Você pode definir a configuração usando um assembly que implementa uma nova classe de configuração ou usando um script que é executado na sessão. A configuração pode determinar os comandos que estão disponíveis na sessão. Além disso, a configuração pode incluir configurações que protegem o computador, como configurações que limitam a quantidade de dados que a sessão pode receber remotamente em um único objeto ou comando. Você também pode especificar um descritor de segurança que determine as permissões necessárias para usar a configuração.
O cmdlet Enable-PSRemoting cria as configurações de sessão padrão em seu computador: Microsoft.PowerShell, Microsoft.PowerShell.Workflow e Microsoft.PowerShell32 (somente sistemas operacionais de 64 bits).
Enable-PSRemoting define o descritor de segurança da configuração para permitir que apenas membros do grupo Administradores no seu computador os utilizem.
Você pode usar os cmdlets de configuração de sessão para editar as configurações de sessão padrão, criar novas configurações de sessão e alterar os descritores de segurança de todas as configurações de sessão.
A partir do Windows PowerShell 3.0, o cmdlet New-PSSessionConfigurationFile permite criar configurações de sessão personalizadas usando um arquivo de texto. O arquivo inclui opções para definir o modo de idioma e para especificar os cmdlets e módulos disponíveis em sessões que usam a configuração de sessão.
Quando os utilizadores usam os Invoke-Command, New-PSSession ou Enter-PSSession cmdlets, podem usar o parâmetro ConfigurationName para indicar a configuração da sessão que é usada para a sessão. Além disso, eles podem alterar a configuração padrão que suas sessões usam alterando o valor da variável de preferência $PSSessionConfigurationName na sessão.
Para obter mais informações sobre configurações de sessão, consulte a Ajuda dos cmdlets de configuração de sessão. Para localizar os cmdlets de configuração de sessão, digite:
Get-Command *PSSessionConfiguration
O que são configurações de entrada e saída de ventilador?
O cenário de comunicação remota do PowerShell mais comum envolvendo vários computadores é a configuração um-para-muitos, na qual um computador local (o computador do administrador) executa comandos do PowerShell em vários computadores remotos. Isso é conhecido como o cenário de "fan-out".
No entanto, em algumas empresas, a configuração é muitos-para-um, onde muitos computadores clientes se ligam a um único computador remoto que está a correr PowerShell, como um servidor de ficheiros ou um quiosque. Isso é conhecido como a configuração "fan-in".
A comunicação remota do PowerShell oferece suporte a configurações de fan-out e fan-in.
Para a configuração de distribuição, o PowerShell usa o protocolo Web Services for Management (WS-Management) e o serviço WinRM que suporta a implementação Microsoft do WS-Management. Quando um computador local se conecta a um computador remoto, WS-Management estabelece uma conexão e usa um plug-in para o PowerShell para iniciar o processo de host do PowerShell (Wsmprovhost.exe) no computador remoto. O usuário pode especificar uma porta alternativa, uma configuração de sessão alternativa e outros recursos para personalizar a conexão remota.
Para dar suporte à configuração "fan-in", o PowerShell usa o IIS (Serviços de Informações da Internet) para hospedar o WS-Management, carregar o plug-in do PowerShell e iniciar o PowerShell. Nesse cenário, em vez de iniciar cada sessão do PowerShell em um processo separado, todas as sessões do PowerShell são executadas no mesmo processo de host.
O alojamento IIS e a gestão remota de fan-in não são suportados no Windows XP nem no Windows Server 2003.
Em uma configuração fan-in, o usuário pode especificar um URI de conexão e um ponto de extremidade HTTP, incluindo o transporte, o nome do computador, a porta e o nome do aplicativo. O IIS encaminha todas as solicitações com um nome de aplicativo especificado para o aplicativo. O padrão é WS-Management, que pode hospedar o PowerShell.
Você também pode especificar um mecanismo de autenticação e proibir ou permitir o redirecionamento de pontos de extremidade HTTP e HTTPS.
Posso testar a comunicação remota num único computador que não esteja num domínio?
Sim. A funcionalidade de remoto do PowerShell está disponível mesmo quando o computador local não está num domínio de rede. Você pode usar os recursos de comunicação remota para se conectar a sessões e criar sessões no mesmo computador. Os recursos funcionam da mesma forma que quando você se conecta a um computador remoto.
Para executar comandos remotos em um computador em um grupo de trabalho, altere as seguintes configurações do Windows no computador.
Cuidado: Essas configurações afetam todos os usuários do sistema e podem tornar o sistema mais vulnerável a um ataque mal-intencionado. Tenha cuidado ao fazer essas alterações.
Windows Vista, Windows 7, Windows 8:
Crie a seguinte entrada do Registro e defina seu valor como 1: LocalAccountTokenFilterPolicy no
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\SystemVocê pode usar o seguinte comando do PowerShell para adicionar essa entrada:
$parameters = @{ Path='HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System' Name='LocalAccountTokenFilterPolicy' propertyType='DWord' Value=1 } New-ItemProperty @parametersWindows Server 2003, Windows Server 2008, Windows Server 2012, Windows Server 2012 R2:
A definição padrão do modelo de Acesso à Rede: Partilha e segurança para a política de contas locais é
Classic. Verifique se a definição está definida paraClassic.
Posso executar comandos remotos num computador noutro domínio?
Sim. Normalmente, os comandos são executados sem erro. No entanto, pode ser necessário usar o parâmetro Credential com os cmdlets Invoke-Command, New-PSSession ou Enter-PSSession. As credenciais podem ser exigidas mesmo quando o utilizador atual é membro do grupo de Administradores nos computadores locais e remotos.
No entanto, se o computador remoto não estiver num domínio em que o computador local confie, o computador remoto pode não conseguir autenticar as credenciais do utilizador.
Para habilitar a autenticação, use o seguinte comando para adicionar o computador remoto à lista de hosts confiáveis para o computador local no WinRM. Digite o comando no prompt do PowerShell.
Set-Item WSMan:\localhost\Client\TrustedHosts -Value <Remote-computer-name>
Por exemplo, para adicionar o computador Server01 à lista de hosts confiáveis no computador local, digite o seguinte comando no prompt do PowerShell:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value Server01
O PowerShell oferece suporte à comunicação remota sobre SSH?
Sim. Para obter mais informações, consulte PowerShell Remoting via SSH.