Windows Installer를 사용하도록 설계된 응용 프로그램은 WMI의 Win32_Product 클래스를 통해 액세스할 수 있지만 현재 사용 중인 일부 응용 프로그램에서는 Windows Installer를 사용하지 않습니다. Windows Installer가 설치 가능한 응용 프로그램과 관련된 작업에 대해 광범위한 표준 방법을 제공하므로 이 설명서에서는 이러한 응용 프로그램을 중점적으로 설명합니다. 일반적으로 대체 설치 루틴을 사용하는 응용 프로그램은 Windows Installer가 관리하지 않습니다. 응용 프로그램의 작업 수행에 필요한 특정 방법은 설치 소프트웨어 및 응용 프로그램 개발자의 결정에 따라 달라집니다.

참고:

일반적으로 응용 프로그램 파일을 컴퓨터에 복사하여 설치한 응용 프로그램은 여기서 설명하는 방법으로 관리할 수 없습니다. 이러한 응용 프로그램은 "파일 및 폴더 작업 수행" 절에서 설명하는 방법을 사용하여 파일과 폴더로 관리할 수 있습니다.

Windows Installer 응용 프로그램 표시

로컬 또는 원격 시스템에서 Windows Installer를 사용하여 설치된 응용 프로그램을 나열하려면 다음의 간단한 WMI 쿼리를 사용합니다.

PS> Get-WmiObject -Class Win32_Product -ComputerName .
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
Name              : Microsoft .NET Framework 2.0
Vendor            : Microsoft Corporation
Version           : 2.0.50727
Caption           : Microsoft .NET Framework 2.0

Win32_Product 개체의 모든 속성을 디스플레이에 표시하려면 Format-List cmdlet과 같은 서식 지정 cmdlet의 Properties 매개 변수를 *(모두) 값과 함께 사용합니다.

PS> Get-WmiObject -Class Win32_Product -ComputerName . | Where-Object -FilterScript {$_.Name -eq "Microsoft .NET Framework 2.0"} | Format-List -Property *
Name              : Microsoft .NET Framework 2.0
Version           : 2.0.50727
InstallState      : 5
Caption           : Microsoft .NET Framework 2.0
Description       : Microsoft .NET Framework 2.0
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
InstallDate       : 20060506
InstallDate2      : 20060506000000.000000-000
InstallLocation   :
PackageCache      : C:\WINDOWS\Installer\619ab2.msi
SKUNumber         :
Vendor            : Microsoft Corporation

또는 Get-WmiObject Filter 매개 변수를 사용하여 Microsoft .NET Framework 2.0만 선택할 수 있습니다. 이 명령에 사용되는 필터는 WMI 필터이므로 Windows PowerShell 구문이 아니라 WQL(WMI 쿼리 언어) 구문을 사용합니다. 따라서 다음과 같습니다.

Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='Microsoft .NET Framework 2.0'"| Format-List -Property *

WQL 쿼리는 Windows PowerShell에서 특별한 의미를 갖는 공백 또는 등호와 같은 문자를 자주 사용하므로 Filter 매개 변수 값을 항상 따옴표로 묶어야 합니다. 또한 Windows PowerShell 이스케이프 문자, 즉 역음(`)을 사용할 수도 있습니다. 역음을 사용한다고 해서 쿼리가 항상 읽기 쉽게 되는 것은 아닙니다. 다음 명령은 이전 명령과 동일한 결과를 반환하지만 전체 필터 문자열을 따옴표로 묶는 대신 역음을 사용하여 특수 문자를 이스케이프 처리합니다.

Get-WmiObject -Class Win32_Product -ComputerName . -Filter Name`=`'Microsoft` .NET` Framework` 2.0`' | Format-List -Property *

관심이 있는 속성만 나열하려면 서식 지정 cmdlet의 Property 매개 변수를 사용하여 원하는 속성만 나열합니다.

Get-WmiObject -Class Win32_Product -ComputerName . | Format-List -Property Name,InstallDate,InstallLocation,PackageCache,Vendor,Version,IdentifyingNumber
...
Name              : HighMAT Extension to Microsoft Windows XP CD Writing Wizard
InstallDate       : 20051022
InstallLocation   : C:\Program Files\HighMAT CD Writing Wizard\
PackageCache      : C:\WINDOWS\Installer\113b54.msi
Vendor            : Microsoft Corporation
Version           : 1.1.1905.1
IdentifyingNumber : {FCE65C4E-B0E8-4FBD-AD16-EDCBE6CD591F}
...

마지막으로 설치된 응용 프로그램의 이름만 찾으려면 간단한 Format-Wide 문을 사용하여 출력을 단순화합니다.

Get-WmiObject -Class Win32_Product -ComputerName .  | Format-Wide -Column 1

여기서는 Windows Installer를 사용하여 설치된 응용 프로그램만 다루고 다른 응용 프로그램은 다루지 않습니다. 이것은 대부분의 표준 응용 프로그램이 Windows에 해당 설치 제거 관리자를 등록하므로 Windows 레지스트리에서 이러한 설치 제거 관리자를 찾아 로컬로 작업할 수 있기 때문입니다.

제거할 수 있는 모든 응용 프로그램 표시

시스템에 설치된 모든 응용 프로그램을 찾을 수 있는 방법은 없지만 프로그램 추가/제거 대화 상자를 사용하면 시스템에 설치된 응용 프로그램을 최대한 많이 찾을 수 있습니다. 프로그램 추가/제거는 다음 레지스트리 키에서 해당 응용 프로그램을 찾습니다.

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall.

이 키를 조사하여 응용 프로그램을 찾을 수도 있습니다. 다음과 같이 Windows PowerShell 드라이브를 이 레지스트리 위치에 매핑하면 Uninstall 키를 쉽게 볼 수 있습니다.

PS>    

Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
Uninstall  Registry      HKEY_LOCAL_MACHINE\SOFTWARE\Micr...
참고:

HKLM: 드라이브가 HKEY_LOCAL_MACHINE의 루트에 매핑되므로 Uninstall 키의 경로에 이 드라이브가 사용되었습니다. HKLM: 대신 HKLM 또는 HKEY_LOCAL_MACHINE을 사용하여 레지스트리 경로를 지정할 수 있습니다. 기존 레지스트리 드라이브를 사용하면 탭 완성 기능을 사용하여 키 이름을 채울 수 있으므로 키 이름을 직접 입력할 필요가 없습니다.

이제 응용 프로그램 설치를 쉽고 빠르게 찾을 수 있는 "Uninstall" 드라이브가 있으므로 다음과 같이 Uninstall: Windows PowerShell 드라이브에서 레지스트리 키의 수를 계산하여 설치된 응용 프로그램의 수를 찾을 수 있습니다.

PS> (Get-ChildItem -Path Uninstall:).Count
459

Get-ChildItem을 비롯한 다양한 방법을 사용하여 이 응용 프로그램 목록을 자세히 검색할 수 있습니다. 응용 프로그램 목록을 가져오고 응용 프로그램을 $UninstallableApplications 변수에 저장하려면 다음 명령을 사용합니다.

$UninstallableApplications = Get-ChildItem -Path Uninstall:
참고:

여기서는 이해를 돕기 위해 긴 변수 이름을 사용하지만 실제로는 긴 이름을 사용할 필요가 없습니다. 변수 이름에 탭 완성 기능을 사용할 수도 있지만 빠른 입력을 위해1–2자로 된 이름을 사용할 수도 있습니다. 길고 설명이 포함된 이름은 다시 사용할 코드를 개발하는 경우에 유용합니다.

Uninstall 아래의 레지스트리 키에 레지스트리 항목의 값을 표시하려면 레지스트리 키의 GetValue 메서드를 사용합니다. 메서드의 값은 레지스트리 항목의 이름입니다.

예를 들어 Uninstall 키에서 응용 프로그램의 표시 이름을 찾으려면 다음 명령을 사용합니다.

PS> Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("DisplayName") }

이러한 값은 고유한 값이 아닐 수도 있습니다. 다음 예제에서는 설치된 두 항목이 "Windows Media Encoder 9 Series"로 나타납니다.

PS> Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -eq "Windows Media Encoder 9 Series"}


   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Windows\CurrentVersion\Uninstall

SKC  VC Name                           Property
---  -- ----                           --------
  0   3 Windows Media Encoder 9        {DisplayName, DisplayIcon, UninstallS...
  0  24 {E38C00D0-A68B-4318-A8A6-F7... {AuthorizedCDFPrefix, Comments, Conta...

응용 프로그램 설치

Win32_Product 클래스를 사용하여 Windows Installer 패키지를 원격 또는 로컬로 설치할 수 있습니다. WMI 하위 시스템은 Windows PowerShell 경로를 인식하지 못하므로 원격으로 설치하는 경우 UNC(Universal Naming Convention) 네트워크 경로를 사용하여 .msi 패키지의 경로를 지정합니다. 예를 들어 네트워크 공유 \\AppServ\dsp에 있는 NewPackage.msi 패키지를 PC01 원격 컴퓨터에 설치하려면 Windows PowerShell 프롬프트에서 다음 명령을 입력하십시오.

(Get-WMIObject -ComputerName PC01 -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install(\\AppSrv\dsp\NewPackage.msi)

Windows Installer 기술을 사용하지 않는 응용 프로그램에는 자동화된 배포에 사용할 수 있는 응용 프로그램 관련 메서드가 있습니다. 배치 자동화에 관한 메서드가 있는지 확인하려면 응용 프로그램 설명서를 확인하거나 응용 프로그램 공급업체에 지원 시스템이 있는지 문의하십시오. 응용 프로그램 공급업체가 설치 자동화를 위해 응용 프로그램을 특별히 설계하지 않았지만 설치 프로그램 소프트웨어 제조업체에서 몇 가지 자동화 방법을 제공할 수도 있습니다.

응용 프로그램 제거

Windows PowerShell을 사용하여 Windows Installer 패키지를 제거하는 작업은 패키지를 설치하는 작업과 거의 동일합니다. 다음 예제에서는 이름을 기반으로 제거할 패키지를 선택하는 방법을 보여 줍니다. 그러나 경우에 따라 IdentifyingNumber로 필터링하는 것이 더 쉬울 수 있습니다.

(Get-WmiObject -Class Win32_Product -Filter "Name='ILMerge'" -ComputerName . ).Uninstall()

다른 응용 프로그램의 제거는 로컬로 제거하는 경우에도 매우 복잡합니다. UninstallString 속성을 추출하면 이러한 응용 프로그램의 명령줄 제거 문자열을 찾을 수 있습니다. 이 방법은 다음과 같이 Windows Installer 응용 프로그램과 Uninstall 키 아래에 나타나는 기존 프로그램에 사용할 수 있습니다.

Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("UninstallString") }

필요에 따라 다음과 같이 표시 이름으로 출력을 필터링할 수 있습니다.

Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -like "Win*"} | ForEach-Object -Process { $_.GetValue("UninstallString") }

그러나 이러한 문자열은 Windows PowerShell 프롬프트에서 직접 사용하려면 약간의 수정 작업을 거쳐야 합니다.

Windows Installer 응용 프로그램 업그레이드

응용 프로그램을 업그레이드하려면 응용 프로그램의 이름과 응용 프로그램 업그레이드 패키지의 경로를 알아야 합니다. 그러면 하나의 Windows PowerShell 명령만으로 응용 프로그램을 업그레이드할 수 있습니다.

(Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='OldAppName'").Upgrade(\\AppSrv\dsp\OldAppUpgrade.msi)




목차