PowerShell 원격 기능 FAQ

원격으로 작업하는 경우 한 컴퓨터("로컬 컴퓨터"라고 함)의 PowerShell에 명령을 입력하지만 명령은 다른 컴퓨터("원격 컴퓨터"라고 함)에서 실행됩니다. 원격으로 작업하는 환경은 가능한 한 원격 컴퓨터에서 직접 작업하는 것과 같아야 합니다.

참고 항목

PowerShell 원격을 사용하려면 원격 컴퓨터를 원격으로 구성해야 합니다. 자세한 내용은 about_Remote_Requirements 참조하세요.

두 컴퓨터에 모두 PowerShell이 설치되어 있어야 합니까?

예. 원격으로 작동하려면 로컬 및 원격 컴퓨터에 PowerShell, Microsoft .NET Framework 및 WS-Management(Web Services for Management) 프로토콜이 있어야 합니다. 특정 명령을 실행하는 데 필요한 파일 및 기타 리소스는 원격 컴퓨터에 있어야 합니다.

Windows PowerShell 3.0을 실행하는 컴퓨터와 Windows PowerShell 2.0을 실행하는 컴퓨터는 원격으로 서로 연결하고 원격 명령을 실행할 수 있습니다. 그러나 세션에서 연결을 끊고 다시 연결하는 기능과 같은 일부 기능은 두 컴퓨터에서 Windows PowerShell 3.0을 실행하는 경우에만 작동합니다.

원격 컴퓨터에 연결할 수 있는 권한, PowerShell을 실행할 수 있는 권한, 데이터 저장소(예: 파일 및 폴더) 및 원격 컴퓨터의 레지스트리에 액세스할 수 있는 권한이 있어야 합니다.

자세한 내용은 about_Remote_Requirements 참조하세요.

원격 작업은 어떻게 작동하나요?

원격 명령을 제출하면 이 명령은 네트워크를 통해 원격 컴퓨터의 PowerShell 엔진으로 전송되고 원격 컴퓨터의 PowerShell 클라이언트에서 실행됩니다. 명령 결과는 로컬 컴퓨터로 다시 전송되고 로컬 컴퓨터의 PowerShell 세션에 표시됩니다.

명령을 전송하고 출력을 수신하기 위해 PowerShell은 WS-Management 프로토콜을 사용합니다. WS-Management 프로토콜에 대한 자세한 내용은 Windows 설명서의 WS-Management 프로토콜을 참조하세요.

Windows PowerShell 3.0부터 원격 세션이 원격 컴퓨터에 저장됩니다. 이렇게 하면 명령을 중단하거나 상태를 잃지 않고 세션에서 연결을 끊고 다른 세션 또는 다른 컴퓨터에서 다시 연결할 수 있습니다.

PowerShell 원격이 안전한가요?

원격 컴퓨터에 연결할 때 시스템은 로컬 컴퓨터의 사용자 이름 및 암호 자격 증명 또는 명령에서 제공하는 자격 증명을 사용하여 원격 컴퓨터에 로그인합니다. 자격 증명 및 나머지 전송은 암호화됩니다.

보호를 추가하려면 HTTP 대신 SSL(Secure Sockets Layer)을 사용하여 WinRM(Windows Remote Management) 요청을 수신하도록 원격 컴퓨터를 구성할 수 있습니다. 그런 다음, 사용자는 연결을 설정할 때 , New-PSSessionEnter-PSSession cmdlet의 Invoke-CommandUseSSL 매개 변수를 사용할 수 있습니다. 이 옵션은 HTTP 대신 더 안전한 HTTPS 채널을 사용합니다.

모든 원격 명령에 PowerShell 원격이 필요합니까?

아니요. 일부 cmdlet에는 원격 컴퓨터에서 개체를 가져올 수 있는 ComputerName 매개 변수가 있습니다.

이러한 cmdlet은 PowerShell 원격을 사용하지 않습니다. 따라서 PowerShell 원격에 대해 컴퓨터가 구성되지 않았거나 컴퓨터가 PowerShell 원격에 대한 요구 사항을 충족하지 않는 경우에도 PowerShell을 실행하는 모든 컴퓨터에서 사용할 수 있습니다.

이러한 cmdlet에는 다음이 포함됩니다.

  • Get-Hotfix
  • Rename-Computer
  • Restart-Computer
  • Stop-Computer

ComputerName 매개 변수가 있는 모든 cmdlet을 찾으려면 다음을 입력합니다.

Get-Help * -Parameter ComputerName
# or
Get-Command -ParameterName ComputerName

특정 cmdlet의 ComputerName 매개 변수에 PowerShell 원격이 필요한지 확인하려면 매개 변수 설명을 참조하세요. 매개 변수 설명을 표시하려면 다음을 입력합니다.

Get-Help <cmdlet-name> -Parameter ComputerName

예시:

Get-Help Get-Hotfix -Parameter ComputerName

다른 모든 명령의 경우 cmdlet을 Invoke-Command 사용합니다.

원격 컴퓨터에서 명령을 실행할 어떻게 할까요? 있나요?

원격 컴퓨터에서 명령을 실행하려면 cmdlet을 Invoke-Command 사용합니다.

명령을 중괄호({})로 묶어 스크립트 블록으로 만듭니다. ScriptBlock 매개 변수를 Invoke-Command 사용하여 명령을 지정합니다.

ComputerName 매개 변수를 Invoke-Command 사용하여 원격 컴퓨터를 지정할 수 있습니다. 또는 원격 컴퓨터(세션)에 대한 영구 연결을 만든 다음 세션 매개 Invoke-Command 변수를 사용하여 세션에서 명령을 실행할 수 있습니다.

예를 들어 다음 명령은 원격으로 Get-Process 명령을 실행합니다.

Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-Process}

#  - OR -

Invoke-Command -Session $s -ScriptBlock {Get-Process}

원격 명령을 중단하려면 Ctrl+C를 입력합니다. 중단 요청은 원격 컴퓨터에 전달되고 원격 명령은 종료됩니다.

원격 명령에 대한 자세한 내용은 원격을 지원하는 cmdlet에 대한 about_Remote 및 도움말 항목을 참조하세요.

원격 컴퓨터에 텔넷만 사용할 수 있나요?

cmdlet을 Enter-PSSession 사용하여 원격 컴퓨터로 대화형 세션을 시작할 수 있습니다.

PowerShell 프롬프트에서 다음을 입력합니다.

Enter-PSSession <ComputerName>

명령 프롬프트가 변경되어 원격 컴퓨터에 연결되어 있음을 표시합니다.

<ComputerName>\C:>

이제 입력한 명령이 원격 컴퓨터에 직접 입력한 것처럼 원격 컴퓨터에서 실행됩니다.

대화형 세션을 종료하려면 다음을 입력합니다.

Exit-PSSession

대화형 세션은 WS-Management 프로토콜을 사용하는 영구 세션입니다. 텔넷 사용과 동일하지는 않지만 비슷한 환경을 제공합니다.

자세한 내용은 Enter-PSSession를 참조하세요.

영구 연결을 만들 수 있나요?

예. 원격 컴퓨터의 이름, NetBIOS 이름 또는 IP 주소를 지정하여 원격 명령을 실행할 수 있습니다. 또는 원격 컴퓨터에 연결된 PowerShell 세션(PSSession)을 지정하여 원격 명령을 실행할 수 있습니다.

ComputerName 매개 변수를 Invoke-Command 사용하거나 Enter-PSSession사용하는 경우 PowerShell은 임시 연결을 설정합니다. PowerShell은 연결을 사용하여 현재 명령만 실행한 다음 연결을 닫습니다. 이는 많은 원격 컴퓨터에서도 단일 명령 또는 관련 없는 여러 명령을 실행하는 매우 효율적인 방법입니다.

cmdlet을 New-PSSession 사용하여 PSSession을 만들 때 PowerShell은 PSSession에 대한 영구 연결을 설정합니다. 그런 다음 데이터를 공유하는 명령을 포함하여 PSSession에서 여러 명령을 실행할 수 있습니다.

일반적으로 데이터를 공유하는 일련의 관련 명령을 실행하는 PSSession을 만듭니다. 그렇지 않으면 ComputerName 매개 변수로 만든 임시 연결이 대부분의 명령에 충분합니다.

세션에 대한 자세한 내용은 about_PSSessions 참조하세요.

한 번에 둘 이상의 컴퓨터에서 명령을 실행할 수 있나요?

예. cmdlet의 ComputerName 매개 변수는 여러 컴퓨터 이름을 허용하며 Session 매개 변수는 여러 PSSessions를 허용합니다.Invoke-Command

명령을 실행할 Invoke-Command 때 PowerShell은 지정된 모든 컴퓨터 또는 지정된 모든 PSSessions에서 명령을 실행합니다.

PowerShell은 수백 개의 동시 원격 연결을 관리할 수 있습니다. 그러나 보낼 수 있는 원격 명령의 수는 컴퓨터의 리소스와 여러 네트워크 연결을 설정하고 기본 수 있는 용량에 의해 제한될 수 있습니다.

자세한 내용은 도움말 항목의 예제를 Invoke-Command 참조하세요.

내 프로필은 어디에 있나요?

PowerShell 프로필은 원격 세션에서 자동으로 실행되지 않으므로 프로필이 추가하는 명령은 세션에 없습니다. 또한 $profile 자동 변수는 원격 세션에서 채워지지 않습니다.

세션에서 프로필을 실행하려면 cmdlet을 Invoke-Command 사용합니다.

예를 들어 다음 명령은 세션$s로컬 컴퓨터에서 CurrentUserCurrentHost 프로필을 실행합니다.

Invoke-Command -Session $s -FilePath $profile

다음 명령은 세션$s원격 컴퓨터에서 CurrentUserCurrentHost 프로필을 실행합니다. 변수가 $profile 채워지지 않으므로 명령은 프로필에 대한 명시적 경로를 사용합니다.

Invoke-Command -Session $s {
  . "$home\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"
}

이 명령을 실행한 후에는 프로필이 세션에 추가하는 명령을 사용할 수 있습니다 $s.

세션 구성에서 시작 스크립트를 사용하여 세션 구성을 사용하는 모든 원격 세션에서 프로필을 실행할 수도 있습니다.

PowerShell 프로필에 대한 자세한 내용은 about_Profiles 참조하세요. 세션 구성에 대한 자세한 내용은 다음을 참조하세요 Register-PSSessionConfiguration.

원격 명령에서 제한은 어떻게 작동하나요?

로컬 컴퓨터에서 리소스를 관리할 수 있도록 PowerShell에는 각 명령에 대해 설정된 동시 원격 연결 수를 제한할 수 있는 명령별 제한 기능이 포함되어 있습니다.

기본값은 32개의 동시 연결이지만 cmdlet의 ThrottleLimit 매개 변수를 사용하여 특정 명령에 대한 사용자 지정 제한 제한을 설정할 수 있습니다.

제한 기능을 사용하는 경우 전체 세션이나 컴퓨터가 아닌 각 명령에 적용됩니다. 여러 세션 또는 PSSessions에서 동시에 명령을 실행하는 경우 동시 연결 수는 모든 세션에서 동시 연결의 합계입니다.

ThrottleLimit 매개 변수가 있는 cmdlet을 찾으려면 다음을 입력합니다.

Get-Help * -Parameter ThrottleLimit
-or-
Get-Command -ParameterName ThrottleLimit

원격 명령의 출력이 로컬 출력과 다른가요?

PowerShell을 로컬로 사용하는 경우 "라이브" .NET Framework 개체를 보내고 받습니다. "live" 개체는 실제 프로그램 또는 시스템 구성 요소와 연결된 개체입니다. 메서드를 호출하거나 라이브 개체의 속성을 변경하면 변경 내용이 실제 프로그램 또는 구성 요소에 영향을 줍니다. 또한 프로그램 또는 구성 요소의 속성이 변경되면 해당 속성을 나타내는 개체의 속성도 변경됩니다.

그러나 대부분의 라이브 개체는 네트워크를 통해 전송할 수 없으므로 PowerShell은 원격 명령으로 전송되는 대부분의 개체를 "직렬화"합니다. 즉, 각 개체를 일련의 XML(XML [CLiXML]의 제약 조건 언어) 데이터 요소로 변환합니다.

PowerShell은 직렬화된 개체를 받으면 XML을 역직렬화된 개체 형식으로 변환합니다. 역직렬화된 개체는 이전 시간에 프로그램 또는 구성 요소의 속성에 대한 정확한 레코드이지만 더 이상 "라이브"가 아닙니다. 즉, 더 이상 구성 요소와 직접 연결되지 않습니다. 또한 메서드는 더 이상 효과적이지 않으므로 제거됩니다.

일반적으로 라이브 개체를 사용하는 것처럼 역직렬화된 개체를 사용할 수 있지만 해당 제한 사항을 알고 있어야 합니다. 또한 cmdlet에서 Invoke-Command 반환되는 개체에는 명령의 원본을 확인하는 데 도움이 되는 추가 속성이 있습니다.

DirectoryInfo 개체 및 GUID와 같은 일부 개체 형식은 수신될 때 라이브 개체로 다시 변환됩니다. 이러한 개체에는 특별한 처리 또는 서식이 필요하지 않습니다.

원격 출력 해석 및 서식 지정에 대한 자세한 내용은 about_Remote_Output 참조하세요.

백그라운드 작업을 원격으로 실행할 수 있나요?

예. PowerShell 백그라운드 작업은 세션과 상호 작용하지 않고 비동기적으로 실행되는 PowerShell 명령입니다. 백그라운드 작업을 시작하면 명령 프롬프트가 즉시 반환되며, 오랜 시간 동안 실행되는 경우에도 작업이 실행되는 동안 세션에서 작업을 계속할 수 있습니다.

백그라운드 작업은 항상 임시 세션에서 비동기적으로 실행되므로 다른 명령이 실행되는 동안에도 백그라운드 작업을 시작할 수 있습니다.

로컬 또는 원격 컴퓨터에서 백그라운드 작업을 실행할 수 있습니다. 기본적으로 백그라운드 작업은 로컬 컴퓨터에서 실행됩니다. 그러나 cmdlet의 AsJob 매개 변수를 Invoke-Command 사용하여 원격 명령을 백그라운드 작업으로 실행할 수 있습니다. 또한 명령을 원격으로 Start-Job 실행하는 데 사용할 Invoke-Command 수 있습니다.

PowerShell 의 백그라운드 작업에 대한 자세한 내용은 about_Jobsabout_Remote_Jobs 참조하세요.

원격 컴퓨터에서 Windows 프로그램을 실행할 수 있나요?

PowerShell 원격 명령을 사용하여 원격 컴퓨터에서 Windows 기반 프로그램을 실행할 수 있습니다. 예를 들어 원격 컴퓨터에서 실행하거나 Ipconfig.exe 실행할 Shutdown.exe 수 있습니다.

그러나 PowerShell 명령을 사용하여 원격 컴퓨터의 모든 프로그램에 대한 사용자 인터페이스를 열 수는 없습니다.

원격 컴퓨터에서 Windows 프로그램을 시작하면 프로그램이 완료되거나 Ctrl+C를 눌러 명령을 중단할 때까지 명령이 완료되지 않고 PowerShell 명령 프롬프트가 반환되지 않습니다. 예를 들어 원격 컴퓨터에서 Ipconfig.exe 프로그램을 실행하는 경우 명령 프롬프트는 완료될 때까지 Ipconfig.exe 반환되지 않습니다.

원격 명령을 사용하여 사용자 인터페이스가 있는 프로그램을 시작하는 경우 프로그램 프로세스가 시작되지만 사용자 인터페이스는 표시되지 않습니다. PowerShell 명령이 완료되지 않으며, 프로그램 프로세스를 중지하거나 Ctrl+C를 누르면 명령이 중단되고 프로세스가 중지될 때까지 명령 프롬프트가 반환되지 않습니다.

예를 들어 PowerShell 명령을 사용하여 원격 컴퓨터에서 실행하는 Notepad 경우 메모장 프로세스가 원격 컴퓨터에서 시작되지만 메모장 사용자 인터페이스는 표시되지 않습니다. 명령을 중단하고 명령 프롬프트를 복원하려면 Ctrl+C를 누릅니다.

사용자가 내 컴퓨터에서 원격으로 실행할 수 있는 명령을 제한할 수 있나요?

예. 모든 원격 세션은 원격 컴퓨터의 세션 구성 중 하나를 사용해야 합니다. 컴퓨터의 세션 구성(및 해당 세션 구성에 대한 권한)을 관리하여 컴퓨터에서 원격으로 명령을 실행할 수 있는 사용자와 실행할 수 있는 명령을 결정할 수 있습니다.

세션 구성은 세션에 대한 환경을 구성합니다. 새 구성 클래스를 구현하는 어셈블리를 사용하거나 세션에서 실행되는 스크립트를 사용하여 구성을 정의할 수 있습니다. 구성은 세션에서 사용할 수 있는 명령을 결정할 수 있습니다. 또한 구성에는 단일 개체 또는 명령에서 세션이 원격으로 수신할 수 있는 데이터 양을 제한하는 설정과 같이 컴퓨터를 보호하는 설정이 포함될 수 있습니다. 구성을 사용하는 데 필요한 권한을 결정하는 보안 설명자를 지정할 수도 있습니다.

cmdlet은 Enable-PSRemoting 컴퓨터에 Microsoft.PowerShell, Microsoft.PowerShell.Workflow 및 Microsoft.PowerShell32(64비트 운영 체제만 해당)의 기본 세션 구성을 만듭니다. Enable-PSRemoting는 컴퓨터의 관리istrators 그룹의 멤버만 사용할 수 있도록 구성에 대한 보안 설명자를 설정합니다.

세션 구성 cmdlet을 사용하여 기본 세션 구성을 편집하고, 새 세션 구성을 만들고, 모든 세션 구성의 보안 설명자를 변경할 수 있습니다.

Windows PowerShell 3.0 New-PSSessionConfigurationFile 부터 cmdlet을 사용하면 텍스트 파일을 사용하여 사용자 지정 세션 구성을 만들 수 있습니다. 이 파일에는 언어 모드를 설정하고 세션 구성을 사용하는 세션에서 사용할 수 있는 cmdlet 및 모듈을 지정하는 옵션이 포함되어 있습니다.

사용자가 또는 Enter-PSSessionNew-PSSessioncmdlet을 Invoke-Command사용하는 경우 ConfigurationName 매개 변수를 사용하여 세션에 사용되는 세션 구성을 나타낼 수 있습니다. 또한 세션에서 기본 설정 변수의 값을 변경하여 세션에서 사용하는 기본 구성을 $PSSessionConfigurationName 변경할 수 있습니다.

세션 구성에 대한 자세한 내용은 세션 구성 cmdlet에 대한 도움말을 참조하세요. 세션 구성 cmdlet을 찾으려면 다음을 입력합니다.

Get-Command *PSSessionConfiguration

팬 인 및 팬 아웃 구성이란?

여러 컴퓨터와 관련된 가장 일반적인 PowerShell 원격 시나리오는 일대다 구성으로, 하나의 로컬 컴퓨터(관리자 컴퓨터)가 수많은 원격 컴퓨터에서 PowerShell 명령을 실행합니다. 이를 "팬아웃" 시나리오라고 합니다.

그러나 일부 기업에서는 많은 클라이언트 컴퓨터가 파일 서버 또는 키오스크와 같이 PowerShell을 실행하는 단일 원격 컴퓨터에 연결하는 다대일 구성이 있습니다. 이를 "팬인" 구성이라고 합니다.

PowerShell 원격은 팬아웃 및 팬인 구성을 모두 지원합니다.

팬아웃 구성의 경우 PowerShell은 WS-Management(Web Services for Management) 프로토콜 및 WS-Management의 Microsoft 구현을 지원하는 WinRM 서비스를 사용합니다. 로컬 컴퓨터가 원격 컴퓨터에 연결되면 WS-Management는 연결을 설정하고 PowerShell용 플러그 인을 사용하여 원격 컴퓨터에서 PowerShell 호스트 프로세스(Wsmprovhost.exe)를 시작합니다. 사용자는 대체 포트, 대체 세션 구성 및 기타 기능을 지정하여 원격 연결을 사용자 지정할 수 있습니다.

"팬인" 구성을 지원하기 위해 PowerShell은 IIS(인터넷 정보 서비스)를 사용하여 WS-Management를 호스트하고, PowerShell 플러그 인을 로드하고, PowerShell을 시작합니다. 이 시나리오에서는 각 PowerShell 세션을 별도의 프로세스에서 시작하는 대신 모든 PowerShell 세션이 동일한 호스트 프로세스에서 실행됩니다.

IIS 호스팅 및 팬인 원격 관리는 Windows XP 또는 Windows Server 2003에서 지원되지 않습니다.

팬 인 구성에서 사용자는 전송, 컴퓨터 이름, 포트 및 애플리케이션 이름을 포함하여 연결 URI 및 HTTP 엔드포인트를 지정할 수 있습니다. IIS는 지정된 애플리케이션 이름을 가진 모든 요청을 애플리케이션에 전달합니다. 기본값은 PowerShell을 호스트할 수 있는 WS-Management입니다.

인증 메커니즘을 지정하고 HTTP 및 HTTPS 엔드포인트에서 리디렉션을 금지하거나 허용할 수도 있습니다.

할 일이 아닌 단일 컴퓨터에서 원격을 테스트할 수 있나요기본

예. PowerShell 원격은 로컬 컴퓨터가 할 일기본 없는 경우에도 사용할 수 있습니다. 원격 기능을 사용하여 세션에 연결하고 동일한 컴퓨터에서 세션을 만들 수 있습니다. 기능은 원격 컴퓨터에 연결할 때와 동일하게 작동합니다.

작업 그룹의 컴퓨터에서 원격 명령을 실행하려면 컴퓨터에서 다음 Windows 설정을 변경합니다.

주의: 이러한 설정은 시스템의 모든 사용자에게 영향을 미치며 악의적인 공격에 시스템을 더 취약하게 만들 수 있습니다. 이러한 변경을 할 때는 주의해야 합니다.

  • Windows Vista, Windows 7, Windows 8:

    다음 레지스트리 항목을 만든 다음, 해당 값을 1로 설정합니다. LocalAccountTokenFilterPolicy in HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

    다음 PowerShell 명령을 사용하여 이 항목을 추가할 수 있습니다.

    $parameters = @{
      Path='HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System'
      Name='LocalAccountTokenFilterPolicy'
      propertyType='DWord'
      Value=1
    }
    New-ItemProperty @parameters
    
  • Windows Server 2003, Windows Server 2008, Windows Server 2012, Windows Server 2012 R2:

    "네트워크 액세스: 로컬 계정에 대한 공유 및 보안 모델" 정책의 기본 설정이 "클래식"이므로 변경할 필요가 없습니다. 변경된 경우 설정을 확인합니다.

다른 작업에서 컴퓨터에서 원격 명령을 실행할 수 있나요기본

예. 일반적으로 명령은 오류 없이 실행되지만 , 또는 Enter-PSSession cmdlet의 Invoke-Command자격 증명 매개 변수를 사용하여 원격 컴퓨터에서 관리istrators 그룹의 멤버 자격 증명을 제공해야 할 수도 New-PSSession있습니다. 이는 현재 사용자가 로컬 및 원격 컴퓨터에서 관리istrators 그룹의 구성원인 경우에도 필요합니다.

그러나 원격 컴퓨터가 로컬 컴퓨터에서 신뢰하는 할 일기본 없는 경우 원격 컴퓨터가 사용자의 자격 증명을 인증하지 못할 수 있습니다.

인증을 사용하도록 설정하려면 다음 명령을 사용하여 WinRM의 로컬 컴퓨터에 대한 신뢰할 수 있는 호스트 목록에 원격 컴퓨터를 추가합니다. PowerShell 프롬프트에 명령을 입력합니다.

Set-Item WSMan:\localhost\Client\TrustedHosts -Value <Remote-computer-name>

예를 들어 로컬 컴퓨터의 신뢰할 수 있는 호스트 목록에 Server01 컴퓨터를 추가하려면 PowerShell 프롬프트에 다음 명령을 입력합니다.

Set-Item WSMan:\localhost\Client\TrustedHosts -Value Server01

PowerShell은 SSH를 통해 원격을 지원하나요?

예. 자세한 내용은 SSH를 통해 PowerShell 원격을 참조하세요.