원격 출력과 로컬 출력 비교
로컬 컴퓨터에서 Get-Process와 같은 명령을 실행하면 해당 명령은 System.Diagnostics.Process 형식의 개체를 반환하고 Windows PowerShell 파이프라인에 추가합니다. 이러한 개체에는 속성, 메서드 및 흔히 이벤트가 있습니다. 메서드는 작업을 수행하는 기능을 제공합니다. 예를 들어 Process 개체의 Kill() 메서드는 이 개체가 나타내는 프로세스를 종료합니다.
참고
serialization은 전송할 수 있는 형태로 개체를 변환하는 프로세스입니다. Serialization은 개체의 상태를 가져와서 XML 또는 이진 형식과 같은 직렬 데이터 형식으로 변환합니다. Deserialization은 서식이 지정된 XML 또는 이진 데이터를 개체 형식으로 변환합니다.
명령이 원격 컴퓨터에서 실행되면 해당 컴퓨터는 결과를 XML로 직렬화한 후 해당 XML 텍스트를 컴퓨터에 전송합니다. 이렇게 하면 네트워크를 통해 전송할 수 있는 형식으로 개체의 정보를 전환할 수 있습니다. 그러나 복잡한 개체의 경우 serialization 프로세스에서는 개체에 대한 정적 정보(즉, 해당 속성)만 사용할 수 있습니다.
컴퓨터에서 XML을 받으면 Windows PowerShell 파이프라인에 배치되는 개체로 다시 역직렬화됩니다. Process 개체가 있는 경우 Get-Member로 파이핑하면 이제는 관련이 있지만 서로 다른 종류의 개체인 Deserialized.System.Diagnostics.Process 형식이라는 것을 알 수 있습니다. 역직렬화된 개체에는 메서드와 이벤트가 없습니다.
PowerShell 원격 작업의 일부인 serialization 및 deserialization을 고려할 때 이러한 방식으로 얻은 개체는 정적 스냅샷으로 간주해야 합니다. 개체 속성의 값은 업데이트할 수 없으며 개체를 사용하여 작업을 수행할 수 없습니다. 따라서 원격 개체와 상호 작용해야 하는 모든 작업은 PowerShell 원격 세션의 일부로 원격 컴퓨터에서 수행되어야 합니다.
예를 들어 원하는 결과를 생성하지 않는 명령의 예는 다음과 같습니다.
Invoke-Command –Computer LON-DC1 –ScriptBlock { Get-Process –Name Note* } |
Stop-Process
이 예제에서는 Process 개체를 검색하지만 프로세스 중지 작업은 원격 컴퓨터가 아닌 로컬 컴퓨터에서 수행됩니다. 따라서 이름이 원격 프로세스와 일치하는 로컬 프로세스가 중지됩니다.
의도한 결과를 얻는 적절한 방법은 다음을 실행하는 것입니다.
Invoke-Command –Computer LON-DC1 –ScriptBlock { Get-Process –Name Note* |
Stop-Process }
이 경우 처리는 원격 컴퓨터에서 완전히 수행되고 최종 결과만 직렬화되어 다시 전송됩니다. 이러한 두 명령의 차이점은 미묘하지만 이해해야 합니다.