Windows PowerShell집중 탐구

Don Jones

목차

솔루션
기능 살펴보기
일대다 원격
편리한 백그라운드 작업 기능
새로운 방식의 원격 관리

가끔씩 서버 관리에 관한 Microsoft의 메시지가 이중적이어서 혼란스러운 경우가 있습니다. 한편으로는 고유 클라이언트 컴퓨터에 관리 도구를 설치하고 이 도구를 사용하여 서버를 관리하라는 지침을 받기도 하지만, 데이터 센터에는 함부로 액세스해서는 안되며 특히 원격 데스크톱 사용은 기본적으로 일반 절차를 따르지 않고 데이터 센터에 액세스하는 것이므로 기술적으로 편법을 쓰는 것입니다. 그러나 또 한편으로는 IP 주소나 네트워크 구성 항목 변경과 같이 기존의 원격 도구로는 손쉽게 수행할 수 없는 서버 관리 작업이 많은 것도 사실입니다.

Windows PowerShell Q&A

Q Windows PowerShell 스크립트를 로그온 스크립트로 사용할 수 있습니까?

A 예. 그러나 항상 사용할 수 있는 것은 아닙니다. VBScript 파일을 사용하듯이 해당 스크립트를 그룹 정책 개체(GPO)로 끌 수는 없습니다. 대신, Powershell.exe를 실행하는 일괄 처리 파일을 만들고 해당 파일에 실행할 스크립트를 지시하는 명령줄 매개 변수를 전달해야 합니다. 이 작업은 까다롭습니다. 또한 로그온 스크립트를 실행할 모든 컴퓨터에 Windows PowerShell을 설치해야 합니다. 정리하자면, Windows PowerShell은 VBScript나 Cmd.exe 셸보다 독립적인 면이 다소 강합니다. 예를 들어 New-PSDrive cmdlet을 사용하여 드라이브를 매핑해도 Windows 탐색기에는 아무런 영향이 없습니다. Windows에서 드라이브를 매핑하려면 Net Use 명령을 사용해야 하는데, 이 경우 GPO에 쉽게 추가할 수 있는 기존의 일괄 처리 파일을 사용하는 방법을 고려해 보십시오

Q Windows PowerShell 스크립트를 예약할 수 있습니까?

A: 물론입니다. PowerShell.exe(%systemroot% 폴더의 /WindowsPowerShell에 있음)를 예약하고 실행할 스크립트를 지정하는 명령줄 매개 변수를 제공합니다. 스크립트의 모든 동작에 필요한 권한이 있는 사용자 계정을 사용하도록 예약된 작업이 설정되고 스크립트 실행을 허용하는 셸 실행 정책이 구성되었는지 확인해야 합니다.(개인적으로 스크립트에 디지털 서명이 필요한 AllSigned 정책을 선호합니다. 이에 대한 자세한 내용은 셸에서 "Help about_signing"을 실행하십시오.)

Q Windows PowerShell에서 파일 및 폴더 권한 작업을 간단하게 수행하는 방법이 있습니까?

A 예. Get-ACL 명령과 Set-ACL 명령을 사용할 수 있습니다. 먼저, Get-ACL은 권한에 대한 보고만 필요한 경우 유용합니다. 솔직히, 이 명령을 사용하여 권한을 변경하는 것은 실용적이지 않습니다. Windows의 권한은 매우 복잡한 개념이며 이에 따라 액세스 제어 목록(ACL)을 설정하기 위해 사용자가 수행해야 하는 프로그래밍도 매우 복잡합니다. cmdlet을 사용해야 한다고 들으셨습니까? 이 셸은 기존의 명령줄 도구를 실행하는 데 매우 적합하며 다양한 Cacls.exe 버전(Active Directory용 Dsacls 같은 도구 등)이 Windows PowerShell에서 효율적으로 작동합니다. 파일 및 폴더 권한을 수정하거나 설정해야 할 때 저는 항상 이 명령을 사용합니다.

새로운 Server Core 설치를 설정하는 작업도 혼란스럽기는 마찬가지입니다. 역할 추가, 네트워크 구성뿐만 아니라 Windows 활성화도 로컬 콘솔 창이나 원격 데스크톱을 통해 명령줄 도구를 사용하여 수행되어야 합니다. 현재 사용 가능한 도구로는 단일 작업을 처리하는 사용자 지정 솔루션 또는 Windows Management Instrumentation(WMI)에 대한 전문 지식이 필요한 솔루션이 있습니다. 저는 WMI를 선호하지만, 솔직히 이 도구는 너무 복잡해서 익숙해지는 데 시간이 오래 걸려 사용하지 않는 관리자가 많습니다.

Windows PowerShell은 관리 과정을 간소화하기 위해 더 쉽게 처리할 수 있는 WMI를 제공하고 수년 간 사용해 온 명령줄 유틸리티와 유사하여 사용이 간편한 cmdlet으로 관리 작업을 통합했습니다. WMI 외에 셸이 기본적으로 로컬 셸이라는 것도 문제입니다. 대부분의 핵심 운영 체제 구성 cmdlet은 원격 컴퓨터 연결을 지원하지 않습니다. 또한 셸은 WMI의 고질적인 문제 중 하나를 해결하지 못했습니다. 바로 원격 연결을 위해 RPC(Remote Procedure Call)를 사용하는 것입니다. 대부분 로컬 방화벽을 사용하는 현재와 같은 환경에서는 RPC가 번거롭기 때문에 원격 관리에 WMI를 사용할 수 없는 경우가 많습니다.

솔루션

Microsoft는 이전부터 관리상의 단점을 파악하고 있었지만 모든 필요한 픽스를 단일 제품에 적용하기까지는 시간이 필요했습니다. 이와 같은 단점을 해결한 제품이 바로 새 버전의 Windows Remote Management(WRM)를 탑재한 Windows PowerShell v2입니다. 두 제품은 Windows 7 및 Windows Server 2008 R2에 최초로 제공되고 기본적으로 해당 운영 체제에 사전 설치됩니다.

두 기술은 Windows XP에 이르는 이전 버전의 Windows에도 사용할 수 있습니다. 그러나 이 글을 쓰는 시점에서는 지원되는 이전 운영 체제에 대한 명확한 공식 발표가 없었습니다.(이전 버전은 필요한 핵심 지원 기술을 제공하지 않을 수 있으므로 OS 버전이 오래될수록 Microsoft의 지원 작업이 어려울 수 있습니다.)

WinRM은 간편한 원격 관리를 실현하는 진정한 핵심 기술입니다. 이름에서 알 수 있듯이 WinRM은 Microsoft가 구현한 WS-MAN(관리용 웹 서비스)으로, 통신할 때 HTTP와 HTTPS를 사용하므로 트래픽이 방화벽을 쉽게 통과할 수 있습니다. 알려진 단일 지점에서 대화를 시작한 다음 무작위로 선택한 포트로 이동시키는 RPC와 달리 HTTP와 HTTPS는 기본적으로 80 및 443이라는 단일 포트를 사용하며, 이 포트가 적합하지 않으면 다른 포트를 구성할 수 있습니다. WinRM을 사용하면 수신되는 관리 연결을 다른 많은 응용 프로그램이 "수신 대기"할 수 있으며 Windows PowerShell v2는 바로 이러한 기능을 지원하는 응용 프로그램입니다. WMI는 궁극적으로 WinRM을 사용하도록 마이그레이션될 것이라는 게 개인적인 생각입니다.

기본적으로 사용자는 클라이언트 컴퓨터에서 원격 컴퓨터로 셸 연결을 요청합니다. 그러면 원격 컴퓨터에서 WinRM이 활성화되고 그 결과 원격 컴퓨터에서 Windows PowerShell v2 인스턴스가 실행됩니다. 해당 셸 인스턴스는 명령을 실행하고 결과를 사용자의 컴퓨터로 전달할 수 있습니다.

기능 살펴보기

Windows 7 Beta의 공식 릴리스는 전 세계가 이 기능을 최초로 사용해 보는 기회였습니다. 하나 또는 여러 서버에서 Windows PowerShell 세션을 열고 Enable-PSRemoting을 실행하여 WinRM을 구성하고 WinRM 서비스를 시작합니다. 그런 다음, Windows PowerShell v2를 실행 중인 클라이언트 컴퓨터로 이동하여 $session = New-PSSession 컴퓨터 이름을 실행하고 원격 작업을 위해 구성한 서버의 이름을 제공합니다. New-PSSession cmdlet은 필요한 경우 대체 자격 증명을 허용하고 사용자가 구성한 경우에 한해 표준이 아닌 포트를 사용하도록 지정할 수 있습니다.

그림 1에 표시된 것과 같은 긴 오류 메시지가 나타나면 WinRM 인증 방식 때문입니다. 기본적으로 Kerberos를 사용하지만 도메인 이외 환경(그림에 나온 랩 컴퓨터 참조)에서는 Kerberos를 사용할 수 없습니다. Kerberos가 지원되지 않는 경우 WinRM에서는 서버 컴퓨터에 SSL 인증서를 설치해야 하는 HTTPS 전송을 사용하도록 요청합니다. 이때는 원하는 컴퓨터에 연결되었는지 알 수 있게 사용자와 서버 간 상호 인증을 제공합니다. –auth 매개 변수에 기본 인증 또는 다이제스트 인증을 지정해도 소용 없습니다. WinRM이 HTTPS를 사용하여 트래픽을 암호화하려 하기 때문입니다. 가장 간편한 솔루션은 바로 Active Directory 도메인에 있습니다.

fig01.gif

그림 1 이와 같이 긴 오류 메시지는 WinRM 인증 방식 때문에 발생할 수 있습니다.

세션이 활성화되면 사용할 준비가 된 것입니다. Enter-PSSession $session은 사용자를 원격 서버에 라이브로 연결합니다. 놀랍게도 Windows PowerShell 인스턴스를 입력할 수 있습니다. UNIX 컴퓨터에서 자주 사용하는 SSH나 그와 유사한 기술과 달리 명령이 대화식으로 실행되고 결과가 즉시 표시됩니다.

Windows PowerShell은 몇 가지 기본 암호화를 수행하므로 HTTPS를 사용하지 않더라도 해킹으로부터 안전한 편입니다. 원격 콘솔 연결을 끊고 로컬 콘솔로 돌아가려면 Exit-PSSession을 실행합니다. 원격 컴퓨터에 연결되면 사용자의 현재 위치를 알려 주기 위해 셸 프롬프트가 변경됩니다.

일대다 원격

한 컴퓨터에서 여러 명령을 실행할 수 있는 것은 좋지만, 하나의 서버에서 한 가지 작업만 수행해야 하는 경우가 얼마나 될까요? 대개는 여러 컴퓨터에 명령 또는 명령 모음을 실행하는 경우가 더 일반적입니다. Windows PowerShell v1에서는 지금까지 단일 관리자가 단일 원격 컴퓨터를 관리하는 일대일(1:1) 원격 방식을 사용해 왔습니다. 그러나 셸은 단일 관리자가 여러 컴퓨터를 관리할 수 있는 일대다(1:n) 원격도 제공합니다. 그 핵심 요소는 New-PSSession의 –computerName 매개 변수입니다.

이전에 언급한 명령을 한 번 더 설명하겠습니다. 그러나 이번에는 매개 변수 자체에 대해 자세히 살펴봅니다. New-PSSession –computerName 컴퓨터. 여기에서 –computerName은 위치 매개 변수이므로 이전에는 실제 매개 변수 이름을 지정할 필요가 없었지만 이제 지정해 보면 이 기능을 쉽게 이해할 수 있습니다. $sessions = New-PSSession –computerName (Get-Content c:\names.txt). C:\names.txt 파일에 행마다 컴퓨터 이름이 나열된 컴퓨터 이름 목록이 들어 있다고 가정하면 셸은 각각에 대해 원격 세션을 만들고 전체 세션 목록을 $sessions 변수에 저장합니다.

기본적으로 해당 세션은 Windows PowerShell이 실행되는 자격 증명, 즉 셸을 시작할 때 RunAs에 사용한 계정 또는 내 로그온 계정을 사용하여 만듭니다. 주의 단어: UAC(사용자 계정 컨트롤)를 사용하는 경우 셸 아이콘을 마우스 오른쪽 단추로 클릭하여 셸을 명시적으로 "관리자로" 시작하십시오. 또는 명령의 –credential 매개 변수를 사용하여 세션에 다른 사용자 이름을 지정할 수도 있습니다.

이 명령 모음이 있으면 1:1 방식으로 계속 작업할 수 있습니다. 예를 들어 Enter-PSSession $sessions[0]는 사용자를 첫 번째 컴퓨터의 셸 인스턴스에 연결합니다. 그러나 모든 컴퓨터에 대해 명령을 한 번에 실행한다는 것이 실질적인 장점입니다. Invoke-Command –scriptblock { ipconfig } 0 –session $sessions. 이 명령은 세션을 연결한 모든 컴퓨터에서 Ipconfig 명령을 실행하고 결과를 사용자의 컴퓨터로 가져옵니다. 한 번에 최대 32개 컴퓨터에 병렬로 연결할 수 있으며, –throttlelimit 매개 변수를 사용하면 병렬 실행 제한을 변경할 수 있습니다.

편리한 백그라운드 작업 기능

실행 시간이 오래 걸리는 명령을 실행할 때에는 완료될 때까지 컴퓨터 옆에서 기다리고 싶지 않은 경우도 있습니다. 이 경우 셸이 백그라운드에서 작동하도록 하는 것은 어떻습니까? –AsJob 매개 변수를 Invoke-Command에 추가하기만 하면 셸이 백그라운드 작업을 만듭니다.

셸 복사본은 이러한 작업을 수행하지 않는다는 점을 기억하십시오. 지정한 명령이 Windows PowerShell 원격 인스턴스에서 실행 중입니다. 셸은 명령이 모두 완료될 때까지 기다렸다가 되돌려 보낼 결과를 수집합니다. 이러한 결과는 해당 작업의 일부로 저장됩니다. 현재 작업과 그 상태(예: 계속 실행 중인지 여부)를 모두 보려면 Get-Job을 실행하십시오. 완료된 작업의 결과를 가져오려면 Receive-Job을 사용하십시오. 결과는 다음과 같이 표시될 수 있습니다.

$sessions = New-PSSession –computerName (Get-Content c:\names.txt)
$job = Invoke-Command –scriptblock { your command(s) } –AsJob
Get-Job (to check the status)
$results = Receive-Job $job

그런 다음 $results 표시, 필터링, 정렬 등을 수행할 수 있습니다. 각 결과에는 결과와 관련된 컴퓨터를 알려 주는 정보가 첨부되어 있습니다. 사용자가 처리해야 하는 하위 작업 유무를 포함한 백그라운드 작업에 대해서는 다음 글에서 설명할 예정입니다.

새로운 방식의 원격 관리

“편법”으로 데이터 센터에 액세스하거나 원격 데스크톱 기술을 사용하는 기존의 구식 “원격” 관리는 잊어 버리십시오. Windows PowerShell v2의 원격 기능은 원격 컴퓨터에서 모든 명령을 실행할 수 있는 간편하고 확실한 방법입니다. 지금은 서버 관리를 중심으로 설명하고 있지만 데스크톱 관리 작업에도 이 기술을 유용하게 사용할 수 있습니다. 이러한 이유 때문에 Windows PowerShell v2가 Windows 7 및 Windows Server 2008 R2에 사전 설치됩니다.

Don JonesConcentrated Technology의 공동 창업자로서, Windows PowerShell, SQL Server, App-V 및 기타 주제에 대해 매주 블로그를 게시하고 있습니다. 문의 사항이 있으면 Don Jones의 웹 사이트를 통해 연락하시기 바랍니다.