Comparar a saída da comunicação remota com a saída local
Quando você executa um comando como Get-Process no computador local, o comando retorna o objeto ou os objetos do tipo System.Diagnostics.Process e os adiciona ao pipeline do Windows PowerShell. Esses objetos têm propriedades, métodos e, com frequência, eventos. Os métodos fornecem a capacidade de executar a tarefa. Por exemplo, o método Kill() de um objeto de Processo encerra o processo que esse objeto representa.
Observação
O processo de conversão de um objeto em um formulário que pode ser prontamente transportado é conhecido como serialização. A serialização pega o estado de um objeto e o transforma em formato de dados serial, como o formato XML ou binário. A desserialização converte os dados no formato XML ou binário em um tipo de objeto.
Quando um comando é executado em um computador remoto, esse computador serializa os resultados em XML e transmite esse texto XML para o computador. Você faz isso para colocar as informações do objeto em um formato que pode ser transmitido por uma rede. No entanto, para objetos complexos, o processo de serialização só pode usar informações estáticas sobre um objeto, em outras palavras, as propriedades.
Quando o computador recebe o XML, ele é desserializado novamente em objetos que são colocados no pipeline do Windows PowerShell. Quando você tem um objeto de Processo, ao encaminhá-lo para o Get-Member, você sabe que agora ele é do tipo Deserialized.System.Diagnostics.Process, um tipo de objeto relacionado, mas diferente. O objeto desserializado não tem métodos nem eventos.
Considerando a serialização e a desserialização que fazem parte da comunicação remota do PowerShell, você deve considerar todos os objetos obtidos dessa maneira como um instantâneo estático. Os valores das propriedades do objeto não são atualizáveis e os objetos não podem ser usados para executar ações. Portanto, todas as tarefas que exigem a interação com objetos remotos devem ser executadas no computador remoto, como parte da sessão de comunicação remota do PowerShell.
Por exemplo, este é um exemplo de um comando que não produzirá os resultados desejados:
Invoke-Command –Computer LON-DC1 –ScriptBlock { Get-Process –Name Note* } |
Stop-Process
Neste exemplo, você está recuperando objetos de Processo, mas a tarefa de interromper processos ocorre no computador local, e não no remoto. Isso resultará na interrupção de todos os processos locais com os nomes correspondentes aos remotos.
A maneira adequada de chegar ao resultado pretendido seria executar:
Invoke-Command –Computer LON-DC1 –ScriptBlock { Get-Process –Name Note* |
Stop-Process }
Nesse caso, o processamento ocorreu inteiramente no computador remoto, e apenas os resultados finais são serializados e devolvidos. A diferença entre esses dois comandos é sutil, mas importante de entender.