.NET Framework 및 COM 인터페이스에는 다양한 시스템 관리 작업을 수행할 수 있는 소프트웨어 구성 요소가 포함되어 있습니다. Windows PowerShell에서는 이러한 구성 요소를 사용할 수 있기 때문에 cmdlet을 사용하지 않고도 작업을 수행할 수 있습니다. Windows PowerShell의 초기 릴리스에 포함된 대부분의 cmdlet은 원격 컴퓨터에 사용할 수 없습니다. 이 설명서에서는 Windows PowerShell에서 .NET Framework System.Diagnostics.EventLog 클래스를 직접 사용하여 이벤트 로그를 관리할 때 이러한 제한을 해결하는 방법을 보여 줍니다.

New-Object를 사용하여 이벤트 로그에 액세스

.NET Framework 클래스 라이브러리에는 이벤트 로그를 관리하는 데 사용할 수 있는 System.Diagnostics.EventLog라는 클래스가 포함되어 있습니다. TypeName 매개 변수와 함께 New-Object cmdlet을 사용하면 .NET 클래스의 새 인스턴스를 만들 수 있습니다. 예를 들어 다음 명령은 이벤트 로그 참조를 만듭니다.

PS> New-Object -TypeName System.Diagnostics.EventLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----

이 명령이 EventLog 클래스의 인스턴스를 만들었지만 이 인스턴스에는 아무 데이터도 포함되어 있습니다. 이것은 특정 이벤트 로그를 지정하지 않았기 때문입니다. 실제 이벤트 로그를 보는 방법은 다음 절에서 설명합니다.

New-Object와 함께 생성자 사용

특정 이벤트 로그를 참조하려면 이벤트 로그의 이름을 지정해야 합니다. New-Object에는 ArgumentList라는 매개 변수가 있습니다. 이 매개 변수에 값으로 전달되는 인수는 개체의 특수 시작 메서드에서 사용합니다. 이러한 메서드는 개체를 생성하는 데 사용되므로 생성자라고 합니다. 예를 들어 응용 프로그램 로그에 대한 참조를 보려면 다음과 같이 'Application'이라는 문자열을 인수로 지정하면 됩니다.

PS> New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

Max(K) Retain OverflowAction        Entries Name
------ ------ --------------        ------- ----
16,384      7 OverwriteOlder          2,160 Application
참고:

대부분의 .NET Framework 핵심 클래스가 System 네임스페이스에 들어 있으므로 Windows PowerShell은 사용자가 지정한 클래스를 찾을 수 없으면 자동으로 System 네임스페이스에서 이 클래스를 찾으려고 시도합니다. 따라서 System.Diagnostics.EventLog 대신 Diagnostics.EventLog를 지정할 수 있습니다.

변수에 개체 저장

현재 셸에서 사용할 수 있도록 개체에 대한 참조를 저장할 수 있습니다. Windows PowerShell에서는 파이프라인을 통해 많은 작업을 수행할 수 있지만 변수에 대한 필요성을 줄이고 경우에 따라 개체에 대한 참조를 변수에 저장하면 이러한 개체를 훨씬 더 쉽게 조작할 수 있습니다.

Windows PowerShell에서는 이름이 기본적으로 지정되는 개체인 변수를 만들 수 있습니다. 올바른 Windows PowerShell 명령의 출력은 변수에 저장될 수 있습니다. 변수 이름은 항상 $로 시작됩니다. $AppLog라는 변수에 응용 프로그램 로그를 저장하려면 다음과 같이 변수 이름과 등호를 차례로 입력한 다음 응용 프로그램 로그 개체를 만드는 데 사용되는 명령을 입력합니다.

PS> $AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

그런 다음 아래와 같이 $AppLog를 입력하면 $AppLog 변수에 응용 프로그램 로그가 포함되어 있는 것을 확인할 수 있습니다.

PS> $AppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  16,384      7 OverwriteOlder          2,160 Application

New-Object를 사용하여 원격 이벤트 로그에 액세스

앞 절에서 설명한 명령은 로컬 컴퓨터를 대상으로 하는 반면 Get-EventLog cmdlet은 원격 컴퓨터를 대상으로 합니다. 원격 컴퓨터에 있는 응용 프로그램 로그에 액세스하려면 로그 이름과 컴퓨터 이름(또는 IP 주소)을 인수로 제공해야 합니다.

PS> $RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application,192.168.1.81
PS> $RemoteAppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder            262 Application

이제 $RemoteAppLog 변수에 이벤트 로그에 대한 참조가 저장되었으므로 다음 절에서는 이러한 이벤트 로그와 관련된 작업에 대해 설명합니다.

개체 메서드를 사용하여 이벤트 로그 지우기

일반적으로 개체에는 작업을 수행하기 위해 호출할 수 있는 메서드가 있습니다. Get-Member를 사용하면 개체와 연결된 메서드를 볼 수 있습니다. 다음 명령과 일부 출력 내용은 EventLog 클래스의 일부 메서드를 보여 줍니다.

PS> $RemoteAppLog | Get-Member -MemberType Method


   TypeName: System.Diagnostics.EventLog

Name                      MemberType Definition
----                      ---------- ----------
...
Clear                     Method     System.Void Clear()
Close                     Method     System.Void Close()
...
GetType                   Method     System.Type GetType()
...
ModifyOverflowPolicy      Method     System.Void ModifyOverflowPolicy(Overfl...
RegisterDisplayName       Method     System.Void RegisterDisplayName(String ...
...
ToString                  Method     System.String ToString()
WriteEntry                Method     System.Void WriteEntry(String message),...
WriteEvent                Method     System.Void WriteEvent(EventInstance in...

Clear() 메서드는 이벤트 로그를 지우는 데 사용할 수 있습니다. 메서드를 호출할 때는 인수가 필요 없어도 항상 메서드 이름 뒤에 괄호를 입력해야 합니다. 이렇게 하면 Windows PowerShell이 메서드와 동일한 이름을 가진 잠재적 속성과 메서드를 구별할 수 있게 됩니다. 다음 명령을 입력하면 Clear 메서드를 호출할 수 있습니다.

PS> $RemoteAppLog.Clear()

다음 명령을 입력하면 로그를 표시할 수 있습니다. 그러면 다음과 같이 이벤트 로그가 지워지고 항목 수로 262 대신 0이 표시됩니다.

PS> $RemoteAppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder              0 Application

New-Object를 사용하여 COM 개체 만들기

New-Object를 사용하여 COM(구성 요소 개체 모델) 구성 요소와 관련된 작업을 수행할 수 있습니다. 구성 요소는 WSH(Windows 스크립트 호스트)에 포함된 다양한 라이브러리부터 대부분의 시스템에 설치되어 있는 Internet Explorer와 같은 ActiveX 응용 프로그램까지 다양합니다.

New-Object는 .NET Framework 런타임 호출 가능 래퍼를 사용하여 COM 개체를 만들기 때문에 COM 개체를 호출할 때 .NET Framework에 적용되는 것과 동일한 제한을 받습니다. COM 개체를 만들려면 사용할 COM 클래스의 ProgId(프로그래밍 ID)를 사용하여 ComObject 매개 변수를 지정해야 합니다. 이 설명서에서 COM 사용과 관련된 제한 사항과 시스템에서 사용할 수 있는 ProgId를 확인하는 방법에 대해 자세히 설명하지는 않지만 WSH와 같은 환경에서 가져온 잘 알려진 개체는 Windows PowerShell에서 사용할 수 있습니다.

WScript.Shell, WScript.Network, Scripting.DictionaryScripting.FileSystemObject와 같은 Progid를 지정하여 WSH 개체를 만들 수 있습니다. 다음 명령은 이러한 개체를 만듭니다.

New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

Windows PowerShell에서 이러한 클래스의 기능 대부분을 다양하게 사용할 수 있지만 바로 가기 만들기와 같은 일부 작업은 WSH 클래스를 사용하여 더 쉽게 수행할 수 있습니다.

WScript.Shell을 사용하여 데스크톱 바로 가기 만들기

COM 개체를 사용하여 신속하게 수행할 수 있는 작업 중 하나는 바로 가기 만들기입니다. 예를 들어 데스크톱에 Windows PowerShell의 홈 폴더와 연결된 바로 가기를 만들려면 먼저 WScript.Shell에 대한 참조를 만든 후 다음과 같이 $WshShell이라는 변수에 저장해야 합니다.

$WshShell = New-Object -ComObject WScript.Shell

Get-Member를 COM 개체에 사용할 수 있으므로 다음과 같이 입력하여 개체의 멤버를 검색할 수 있습니다.

PS> $WshShell | Get-Member


   TypeName: System.__ComObject#{41904400-be18-11d3-a28b-00104bd35090}

Name                     MemberType            Definition
----                     ----------            ----------
AppActivate              Method                bool AppActivate (Variant, Va...
CreateShortcut           Method                IDispatch CreateShortcut (str...
...

Get-Member에는 파이프 대신 사용하여 Get-Member에 개체를 입력할 수 있는 선택적 InputObject 매개 변수가 있습니다. 따라서 Get-Member -InputObject $WshShell 명령을 대신 사용해도 위와 동일한 내용이 출력됩니다. InputObject를 사용할 경우에는 해당 인수를 단일 항목으로 취급합니다. 즉, 변수에 여러 개의 개체가 있을 경우 Get-Member는 이러한 개체를 하나의 개체 배열로 취급합니다. 예를 들면 다음과 같습니다.

PS> $a = 1,2,"three"
PS> Get-Member -InputObject $a
TypeName: System.Object[]
Name               MemberType    Definition
----               ----------    ----------
Count              AliasProperty Count = Length
...

WScript.Shell CreateShortcut 메서드는 만들려는 바로 가기 파일의 경로로 단일 인수를 받아들입니다. 데스크톱에 대한 전체 경로를 입력할 수도 있지만 더 쉬운 방법이 있습니다. 일반적으로 데스크톱은 현재 사용자의 홈 폴더에 들어 있는 Desktop이라는 폴더로 표시됩니다. Windows PowerShell에는 이 폴더의 경로가 들어 있는 $Home이라는 변수가 있습니다. 다음과 같이 이 변수를 사용하여 홈 폴더의 경로를 지정한 다음 Desktop 폴더의 이름과 만들려는 바로 가기의 이름을 추가할 수 있습니다.

$lnk = $WshShell.CreateShortcut("$Home\Desktop\PSHome.lnk")

변수 이름과 유사한 이름을 큰따옴표로 묶으면 Windows PowerShell은 이 이름과 일치하는 변수의 값을 대체하려고 시도합니다. 작은따옴표를 사용하면 Windows PowerShell은 변수 값을 대체하려고 시도하지 않습니다. 예를 들어 다음 명령을 입력해 보십시오.

PS> "$Home\Desktop\PSHome.lnk"
C:\Documents and Settings\aka\Desktop\PSHome.lnk
PS> '$Home\Desktop\PSHome.lnk'
$Home\Desktop\PSHome.lnk

그러면 새 바로 가기 참조가 들어 있는 $lnk라는 변수가 만들어집니다. 해당 멤버를 보려면 이 변수를 Get-Member에 파이프하면 됩니다. 다음 출력은 바로 가기 만들기를 완료하기 위해 사용해야 하는 멤버를 보여 줍니다.

PS> $lnk | Get-Member

TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}

Name MemberType Definition

---- ---------- ----------

...

Save Method void Save ()

...

TargetPath Property string TargetPath () {get} {set}

...

Windows PowerShell의 응용 프로그램 폴더인 TargetPath를 지정한 다음 Save 메서드를 호출하여 $lnk 바로 가기를 저장해야 합니다. Windows PowerShell 응용 프로그램 폴더 경로가 $PSHome 변수에 저장되므로 이렇게 하려면 다음과 같이 입력해야 합니다.

$lnk.TargetPath = $PSHome

$lnk.Save()

Windows PowerShell에서 Internet Explorer 사용

COM을 사용하면Microsoft Office 제품군 응용 프로그램이나 Internet Explorer와 같은 다양한 응용 프로그램을 자동화할 수 있습니다. Internet Explorer는 COM 기반 응용 프로그램 작업과 관련된 몇 가지 일반적인 기술과 문제를 보여 줍니다.

다음과 같이 Internet Explorer ProgId인 InternetExplorer.Application을 지정하여 Internet Explorer 인스턴스를 만들 수 있습니다.

$ie = New-Object -ComObject InternetExplorer.Application

이 명령은 Internet Explorer를 시작하기만 하고 보여 주지는 않습니다. Get-Process를 입력하면 iexplore라는 프로세스가 실행 중인 것을 확인할 수 있습니다. 실제로 iexplore 프로세스는 Windows PowerShell을 종료해도 계속 실행되므로 이 프로세스를 종료하려면 컴퓨터를 다시 시작하거나 작업 관리자와 같은 도구를 사용해야 합니다.

참고:

개별 프로세스로 시작되는 COM 개체(보통 ActiveX 실행 파일이라고 함)는 시작 시 사용자 인터페이스 창을 표시하거나 표시하지 않을 수 있습니다. Internet Explorer와 마찬가지로 창을 만들기만 하고 표시하지 않으면 일반적으로 포커스가 Windows 바탕 화면으로 이동하므로 이 창을 사용하기 위해서는 먼저 이 창이 보이게 해야 합니다.

$ie | Get-Member를 입력하면 Internet Explorer의 속성과 메서드를 볼 수 있습니다. Internet Explorer 창을 표시하려면 다음과 같이 입력하여 변수 속성을 $true로 설정하십시오.

$ie.Visible = $true

그러면 다음과 같이 Navigate 메서드를 사용하여 특정 웹 주소로 이동할 수 있습니다.

$ie.Navigate("http://www.microsoft.com/technet/scriptcenter/default.mspx")

Internet Explorer 개체 모델의 다른 멤버를 사용하면 웹 페이지에서 텍스트 내용을 검색할 수 있습니다. 다음 명령은 현재 웹 페이지의 본문에 HTML 텍스트를 표시합니다.

$ie.Document.Body.InnerText

PowerShell에서 Internet Explore를 종료하려면 다음과 같이 해당 Quit() 메서드를 호출하십시오.

$ie.Quit()

그러면 Internet Explore가 강제로 종료됩니다. COM 개체에 $ie 변수가 아직 표시되어 있어도 $ie 변수에는 더 이상 유효한 참조가 없습니다. 이 변수를 사용하려고 하면 다음과 같은 자동화 오류 메시지가 나타납니다.

PS> $ie | Get-Member
Get-Member : Exception retrieving the string representation for property "Appli
cation" : "The object invoked has disconnected from its clients. (Exception fro
m HRESULT: 0x80010108 (RPC_E_DISCONNECTED))"
At line:1 char:16
+ $ie | Get-Member <<<<

$ie = $null과 같은 명령을 사용하여 나머지 참조를 제거하거나 다음 명령을 사용하여 변수를 완전히 제거할 수 있습니다.

Remove-Variable ie
참고:

해당 참조를 제거할 때 ActiveX 실행 파일을 종료할지 아니면 계속 실행할지 여부를 결정하는 일반적인 규칙은 없습니다. 응용 프로그램이 보이는지 여부, 응용 프로그램에 편집된 문서가 열려 있는지 여부 및 Windows PowerShell이 계속 실행 중인지 여부와 같이 상황에 따라 응용 프로그램을 종료하거나 종료하지 않을 수 있습니다. 따라서 Windows PowerShell에서 사용할 각 ActiveX 실행 파일의 종료 동작을 테스트해야 합니다.

.NET Framework-Wrapped COM 개체에 대한 경고 보기

경우에 따라 COM 개체에는 New-Object가 사용하는 .NET Framework RCW(런타임 호출 가능 래퍼)가 포함되어 있을 수 있습니다. RCW의 동작이 일반적인 COM 개체와 다를 수 있기 때문에 New-Object에는 RCW 액세스에 대해 경고하는 Strict 매개 변수가 포함되어 있습니다. Strict 매개 변수를 지정한 다음 RCW를 사용하는 COM 개체를 만들면 다음과 같은 경고 메시지가 나타납니다.

PS> $xl = New-Object -ComObject Excel.Application -Strict
New-Object : The object written to the pipeline is an instance of the type "Mic
rosoft.Office.Interop.Excel.ApplicationClass" from the component's primary inte
rop assembly. If this type exposes different members than the IDispatch members
, scripts written to work with this object might not work if the primary intero
p assembly is not installed.
At line:1 char:17
+ $xl = New-Object  <<<< -ComObject Excel.Application -Strict

개체가 만들어진 후에도 표준 COM 개체가 아니라는 경고 메시지는 계속 나타납니다.




목차