Windows PowerShell프로필의 유용성

Don Jones

목차

셸, 호스트 및 프로필
프로필 사용
사용자 지정 콘솔 만들기
프로필 기술 더 보기
프로필 주의 사항

이 칼럼을 정기적으로 읽는 독자라면 Windows PowerShell이 프로필 시스템을 지원한다는 사실은 알고 있을 것입니다. 프로필은 기본적으로 셸을 실행할 때 자동으로 실행되는 셸 스크립트이며 파일 확장명은 .ps1입니다. 예를 들면 프로필을 통해 사용자 지정 별칭을 편리하게 정의할 수 있습니다. 셸을 실행할 때마다 프로필이 자동으로 별칭을 정의하도록 하면 셸을 사용할 때 언제든지 별칭을 사용할 수 있습니다.

셸은 다음과 같은 네 가지 프로필을 정의합니다.

  • 컴퓨터의 모든 사용자 및 모든 셸에 적용되는 프로필
  • 모든 사용자에게 적용되지만 Microsoft PowerShell 셸에만 적용되는 프로필
  • 현재 사용자 및 모든 셸에 적용되는 프로필
  • 현재 사용자에게 적용되면서 Microsoft PowerShell 셸에만 적용되는 프로필

여기서 "모든 셸"이란 개념이 혼동스러울 수 있습니다. 이 용어의 기원은 최종 제품이 완성되기 전의 초창기 Windows PowerShell 개발 개념으로 거슬러 올라갑니다. 지금은 "모든 호스트"라는 용어가 더 적절하겠습니다.

셸, 호스트 및 프로필

Windows PowerShell 자체는 Microsoft .NET Framework 어셈블리의 집합입니다. 셸의 이 부분에는 일반적으로 Windows PowerShell로 간주되는 기능이 포함되어 있으므로 필자는 이 부분을 Windows PowerShell 엔진이라고 지칭합니다. 다만 사용자가 이 엔진과 상호 작용할 수 있는 방법은 기본적으로 제공되지 않습니다. 실제로 셸을 사용하려면 호스팅 응용 프로그램 또는 호스트로 엔진을 로드해야 합니다.

여러분이 종종 실행하는 powershell.exe 응용 프로그램도 이러한 호스트 중 하나입니다. Windows PowerShell 2.0 CTP(Community Technology Preview)에 포함된 gpowershell.exe 응용 프로그램 역시 이러한 호스트입니다. 호스트와 셸의 관계는 여기에 나온 것만큼 간단하지는 않지만 겉으로 나타나는 동작은 이러한 간략한 설명을 통해 이해할 수 있습니다.

텍스트 기반 명령줄 인터페이스를 통해 셸과 상호 작용하는 경우 powershell.exe 호스트를 사용한다는 점을 알아두어야 합니다. Exchange 관리 셸과 같은 다른 응용 프로그램에 의해 설치된 바로 가기를 사용하여 셸을 시작하는 경우에도 마찬가지입니다. Exchange 관리 셸은 다른 셸 또는 호스팅 응용 프로그램이 아니며 미리 로드할 스냅인 및 스크립트 집합을 지정하는 바로 가기를 사용하여 시작하는 일반적인 powershell.exe 호스트일 뿐입니다. 이러한 스냅인은 셸 내에서 Exchange 관리 기능을 활성화하는 요소입니다. 하지만 여전히 동일한 셸을 사용하는 것입니다.

Windows Vista에서 powershell.exe 호스트에 대한 프로필 위치는 다음과 같습니다.

  • %windir%\system32\WindowsPowerShell\v1.0\profile.ps1 컴퓨터의 모든 사용자 및 모든 셸에 해당됩니다.
  • %windir%\system32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1 컴퓨터의 모든 사용자에게 해당되지만 Microsoft.PowerShell 셸에만 해당됩니다.
  • %UserProfile%\Documents\WindowsPowerShell\profile.ps1 현재 사용자와 모든 셸에 해당됩니다.
  • %UserProfile%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 현재 사용자에게만, 그리고 Microsoft.PowerShell 셸에만 해당됩니다.

이러한 프로필은 기본적으로 생성되지 않으므로 필요한 경우 직접 만들어야 합니다.

각 호스팅 응용 프로그램은 올바른 프로필을 로드 및 실행하는 역할을 담당합니다. 특정 호스팅 응용 프로그램이 프로필을 로드하지 않기로 "결정"한다면 실제로 로드할 필요가 없는 것입니다. 프로필은 Windows PowerShell 엔진에 의해 자동으로 실행되지 않습니다.

이러한 부분을 모두 추적하기 위한 가장 쉬운 방법은 셸을 열고 $profile을 입력한 다음 Enter 키를 누르는 것입니다. 이렇게 하면 셸이 "주" 프로필로 사용하려고 시도하는 프로필(사용자별 셸 특정 프로필)의 전체 경로를 얻을 수 있습니다. 그런 다음 이 스크립트를 생성 또는 수정하면 셸이 시작될 때마다 이 스크립트가 실행됩니다.

프로필 사용

앞서 소개했듯이 프로필의 일반적 용도 중 하나는 사용자 지정 별칭 정의입니다. 또는 사용자 지정 PSDrive(기본적으로 Windows PowerShell 내에 존재하는 매핑된 드라이브)를 추가할 수도 있습니다. 그다지 일반적이지는 않지만 사용자 환경에서 사용 중인 소프트웨어 제품을 기반으로 필요한 관리 작업을 수행할 수 있는 일종의 고급 셸을 만들기 위한 용도로도 사용됩니다. 고급 셸 개념을 설명하려면 우선 약간의 배경 정보가 필요합니다.

Windows PowerShell을 만드는 Microsoft 내의 제품 그룹은 MMC(Microsoft Management Console)를 비롯한 여러 가지 다른 핵심 관리 기술을 담당합니다. MMC에는 Windows PowerShell의 작동 방식과 유사한 부분이 있습니다. mmc.exe를 실행하면 빈 콘솔이 시작되는데 이는 그다지 유용하지 않습니다. 기능 콘솔을 만들려면 MMC 스냅인을 추가해야 합니다.

콘솔을 원하는 방식으로 구성한 후에는 확장명이 .msc인 파일에 콘솔을 저장합니다. 이 저장된 콘솔 파일을 통해 언제든지 신속하게 사용자 지정 콘솔을 다시 로드할 수 있습니다.

많은 관리자들은 사용자 지정 MMC 콘솔을 만들기보다 그저 관리 대상 제품과 함께 설치되는 콘솔에 의지합니다. 예를 들어 Exchange Server는 Exchange Server 스냅인만 포함된 콘솔을 만듭니다. Active Directory 사용자 및 컴퓨터 역시 단일 스냅인이 포함된 미리 만들어진 콘솔입니다.

Windows PowerShell도 거의 같은 방식으로 작동합니다. Exchange Server 2007 관리 도구와 함께 설치되는 Exchange 관리 셸 아이콘은 실제로 콘솔 파일을 로드하기 위한 명령이 들어 있는 powershell.exe에 대한 바로 가기입니다. 셸 콘솔 파일은 .psc1 확장명을 가지며 미리 로드할 스냅인 목록을 포함합니다(.msc 파일이 MMC가 미리 로드할 스냅인 목록을 포함하는 것과 유사). 그러나 미리 생성된 셸 콘솔만 사용할 수 있는 것은 아닙니다. MMC에서와 마찬가지로 사용자 지정 콘솔을 만들어 이를 모든 관리 작업에 사용할 수 있습니다. 이를 가능하게 하는 데 있어 프로필이 중요한 역할을 합니다.

사용자 지정 콘솔 만들기

사용자 지정 콘솔을 만들려면 먼저 사용할 각 스냅인의 전체 이름을 찾아야 합니다. 필요한 관리 도구가 모두 컴퓨터에 설치되어 있는지 확인합니다. 그런 다음 Windows PowerShell에서 Get-PSSnapin -registered를 실행합니다. 이렇게 하면 언로드된 상태의 사용 가능한 모든 등록된 스냅인이 나열됩니다. 적절한 Windows PowerShell 프로필을 생성하거나 편집합니다. Add-PSSnapin 명령을 추가하여 항상 사용할 수 있도록 하려는 각 스냅인을 로드합니다. 여기에는 Exchange Server, System Center 제품용 스냅인 및 타사 스냅인이 포함될 수 있습니다(예: PowerShell Community Extensions). 프로필을 저장하고(Windows PowerShell 실행 정책에서 요구하는 경우 프로필에 디지털 서명을 해야 함) 셸을 닫습니다. 셸을 다시 열면 프로필에 나열된 모든 스냅인이 자동으로 로드됩니다.

또 다른 방법은 Add-PSSnapin과 스냅인의 이름을 사용하여 모든 스냅인을 셸에 로드한 다음 Export-Console을 실행하여 현재 사용 중인 모든 스냅인이 포함된 .psc1 콘솔 파일을 만드는 것입니다. 그러면 이 .psc1 콘솔 파일을 사용하여 PSConsoleFile 매개 변수 및 사용자 지정 .psc1 파일을 지정하는 새로운 Windows PowerShell 바로 가기를 만들 수 있습니다. 이 바로 가기는 사용자의 콘솔을 사용하여 지정된 모든 스냅인을 자동으로 로드하게 됩니다.

프로필 기술 더 보기

필자는 셸을 시작할 때마다 여러 기타 유용한 작업들이 수행되도록 하는 데 Windows PowerShell 프로필을 사용합니다. 필자의 시스템에서 셸이 시작될 때 수행되는 작업은 다음과 같습니다.

  1. 도메인 관리자 계정용 Get-Credential을 실행하고 그 결과를 $cred라는 변수에 저장합니다. 이렇게 하면 $cred를 셸 전반에 걸쳐 사용할 수 있게 됩니다. Get-WmiObject cmdlet과 같은 다양한 cmdlet의 –credential 매개 변수에 이를 전달할 수 있습니다. $cred에는 암호가 저장되므로 암호를 입력하지 않고도 이러한 cmdlet을 사용할 수 있습니다.
  2. Cd C:\를 실행하여 필자 컴퓨터의 C: 드라이브 루트에서 셸이 시작되도록 합니다.
  3. New-Alias of Out-File을 실행하여 "of"라는 별칭을 만듭니다. 그러면 "Out-File" 대신 "of"를 사용할 수 있게 됩니다. 필자는 이 방법을 자주 사용하므로 짧은 별칭을 정의해 두면 무척 유용합니다.

레지스트리의 HKEY_LOCAL_MACHINE 부분을 나타내는 셸의 HKLM: 드라이브에서 테스트 키를 만들어 봅니다. 오류가 발생하면 셸이 상승된 권한 없이 시작되었음을 알 수 있습니다. 필자의 작업에는 일반적으로 상승된 권한이 필요한데, 이를 통해 본격적인 작업에 들어가기 전에 상승된 권한이 있는지 여부를 신속히 알아볼 수 있습니다.

컴퓨터 이름 또는 IP 주소를 받아 컴퓨터가 ping 테스트를 통과하는지에 따라 True 또는 False 값을 반환하는 Ping-Address라는 사용자 지정 함수를 정의합니다. 필자는 작업에서 이 함수를 자주 사용하므로 셸 전역에서 사용할 수 있도록 프로필에 정의해 둡니다.

이달의 cmdlet: Get-WmiObject

눈치 빠른 독자라면 이 cmdlet을 예전에 다룬 적이 있다는 사실을 알겠지만 이 cmdlet이 제공하는 훌륭한 기능을 한 번 더 소개하겠습니다. 필자는 다음과 같은 방법을 사용하여 텍스트 파일에 이름이 나열된 여러 컴퓨터에서 WMI(Windows Management Instrumentation) 정보를 검색하려고 시도하는 관리자를 자주 봅니다.

Get-Content c:\computers.txt | ForEach-Object 
  { Get-WmiObject Win32_Service –comp $_ }

이 방법은 작동은 하지만 Get-WmiObject가 –computerName 매개 변수에 대한 컴퓨터 이름 배열을 받을 수 있기 때문에 실제로는 필요가 없습니다. 다음과 같이 하여 동일한 결과를 얻을 수 있습니다.

Get-WmiObject Win32_Service –comp (Get-Content
  c:\computers.txt)

Get-Content 명령을 괄호 안에 입력하면 셸에서 명령을 실행하여 그 결과(컴퓨터 이름 배열)를 –computerName 매개 변수에 저장합니다.

프로필 주의 사항

Microsoft.PowerShell 프로필 또는 모든 셸 프로필을 로드하는 응용 프로그램이 powershell.exe만 있는 것은 아닙니다. SAPIEN Technologies의 PrimalScript, Quest Software의 PowerGUI, ShellTools의 PowerShell Plus를 비롯하여 Windows PowerShell을 지원하는 많은 IDE(통합 개발 환경)가 이러한 프로필을 로드하여 powershell.exe 호스트와 유사한 환경을 제공합니다.

많은 스냅인을 로드하는 큰 프로필의 경우 호스팅 응용 프로그램에서 사용할 수 있도록 준비하는 과정에서 Windows PowerShell 엔진이 많은 명령을 실행해야 하므로 이러한 응용 프로그램의 시작 속도가 느려질 수 있습니다. 실행할 프로필 스크립트가 매우 큰 경우에는 powershell.exe를 시작하는 데에도 꽤 많은 시간이 소요될 수 있습니다.

동일한 이름으로 cmdlet을 정의하는 여러 스냅인이 충돌을 일으킬 수도 있습니다. 예를 들어 두 개의 스냅인이 Get-User라는 이름의 cmdlet을 정의하는 경우 Windows PowerShell은 사용자가 cmdlet의 정규화된 이름을 사용하여 원하는 항목을 지정할 때까지는 어느 cmdlet도 실행하지 않습니다. 스냅인 이름이 길 경우 이 정규화된 이름은 지저분해 보일 수 있습니다. 이 문제에 직면하는 경우 필자는 보통 이 두 스냅인을 동시에 로드한다는 생각을 버립니다. 대신 필자는 프로필에서 가장 많이 사용하는 스냅인 하나만 로드한 후 다른 스냅인을 로드하여 사용해야 할 경우에는 별도의 "새로운" 셸을 사용합니다.

Windows PowerShell 프로필은 셸의 편의성을 크게 높여 줄 수 있습니다. 그러나 맬웨어에 의해 악의적으로 편집되는 경우 큰 손상을 입힐 수도 있다는 점을 명심하십시오. 프로필을 보호하려면 프로필에 디지털 서명을 하고 AllSigned 실행 정책을 사용하도록 Windows PowerShell을 구성하거나, 모든 프로필의 NTFS 파일 권한을 수정하여 일반 사용자 계정으로는 이를 수정할 수 없도록 하면 됩니다.

Don JonesWindows PowerShell: TFM and VBScript, WMI, and ADSI Unleashed의 저자입니다. 문의 사항이 있으면 PowerShellCommunity.org 웹 사이트를 통해 연락하시기 바랍니다.