Share via


.NET 및 COM 개체 만들기

이 샘플은 Windows 플랫폼에서만 실행됩니다.

.NET Framework 및 COM 인터페이스를 사용하여 많은 시스템 관리 작업을 수행할 수 있는 소프트웨어 구성 요소가 있습니다. PowerShell을 이용하면 이러한 구성 요소를 사용할 수 있으므로 사용자가 수행할 수 있는 작업이 cmdlet을 사용하여 수행할 수 있는 작업에만 제한되는 것은 아닙니다. PowerShell 초기 릴리스에 포함된 많은 cmdlet은 원격 컴퓨터에서 작동하지 않습니다. PowerShell에서 직접 .NET Framework System.Diagnostics.EventLog 클래스를 사용하여 이벤트 로그를 관리할 때 이 제한을 해결하는 방법을 보여 줍니다.

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

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

New-Object -TypeName System.Diagnostics.EventLog
  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----

명령에서 EventLog 클래스의 인스턴스를 만들었지만 해당 인스턴스에는 데이터가 포함되어 있지 않습니다. 이는 특정 이벤트 로그를 지정하지 않았기 때문입니다. 실제 이벤트 로그를 가져오려면 어떻게 해야 할까요?

New-Object와 함께 생성자 사용

특정 이벤트 로그를 참조하려면 로그의 이름을 지정해야 합니다. New-Object 에는 ArgumentList 매개 변수가 있습니다 . 이 매개 변수에 값으로 전달하는 인수는 개체의 특수 시작 메서드에서 사용됩니다. 이 메서드는 개체를 생성하는 데 사용되기 때문에 생성자라고 합니다. 예를 들어 애플리케이션 로그에 대한 참조를 얻으려면 'Application' 문자열을 인수로 지정합니다.

New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
Max(K) Retain OverflowAction        Entries Name
------ ------ --------------        ------- ----
16,384      7 OverwriteOlder          2,160 Application

참고 항목

대부분의 .NET 클래스는 System 네임스페이스에 포함되어 있으므로 PowerShell은 지정한 형식 이름과 일치하는 항목을 찾을 수 없을 경우 System 네임스페이스에서 지정한 클래스를 자동으로 찾으려고 합니다. 즉, System.Diagnostics.EventLog 대신 Diagnostics.EventLog를 지정할 수 있습니다.

변수에 개체 저장

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

유효한 PowerShell 명령의 출력을 변수에 저장할 수 있습니다. 변수 이름은 항상 $로 시작합니다. 애플리케이션 로그 참조를 $AppLog라는 변수에 저장하려는 경우 변수 이름과 등호를 차례로 입력한 다음, 애플리케이션 로그 개체를 만드는 데 사용되는 명령을 입력합니다.

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

그런 다음 $AppLog를 입력하면 애플리케이션 로그가 포함되어 있는 것을 확인할 수 있습니다.

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

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

이전 섹션에서 사용된 명령은 로컬 컴퓨터를 대상으로 합니다. cmdlet은 Get-EventLog 이 작업을 수행할 수 있습니다. 원격 컴퓨터에서 애플리케이션 로그에 액세스하려면 로그 이름과 컴퓨터 이름(또는 IP 주소)을 인수로 제공해야 합니다.

$RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application, 192.168.1.81
$RemoteAppLog
  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder            262 Application

변수에 저장된 이벤트 로그에 대한 참조가 $RemoteAppLog 있으므로 어떤 작업을 수행할 수 있나요?

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

개체에는 작업을 수행하기 위해 호출할 수 있는 메서드가 있는 경우가 많습니다. 개체와 연결된 메서드를 표시하는 데 사용할 Get-Member 수 있습니다. 다음 명령과 선택한 출력은 EventLog 클래스의 일부 메서드를 보여 줍니다.

$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() 메서드를 사용하여 이벤트 로그를 지울 수 있습니다. 메서드를 호출할 때는 메서드에 인수가 필요하지 않는 경우에도 메서드 이름 뒤에 항상 괄호를 추가해야 합니다. 이렇게 하면 PowerShell에서 메서드와 이름이 같은 잠재적인 속성을 구분할 수 있습니다. 다음과 같이 입력하여 Clear 메서드를 호출합니다.

$RemoteAppLog.Clear()
$RemoteAppLog
  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder              0 Application

이벤트 로그가 지워지고 이제 262개가 아닌 0개 항목이 있는 것을 확인할 수 있습니다.

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

COM(구성 요소 개체 모델) 구성 요소를 사용하는 데 사용할 New-Object 수 있습니다. 구성 요소는 WSH(Windows 스크립트 호스트)에 포함된 다양한 라이브러리부터 대부분의 시스템에 설치되어 있는 Internet Explorer와 같은 ActiveX 애플리케이션에 이르기까지 다양합니다.

New-Object 에서는 .NET Framework 런타임 호출 가능 래퍼를 사용하여 COM 개체를 만들 수 있으므로 COM 개체를 호출할 때 .NET Framework와 동일한 제한 사항이 있습니다. COM 개체를 만들려면 사용하려는 COM 클래스의 ProgId 또는 프로그래밍 방식 식별자와 함께 ComObject 매개 변수를 지정해야 합니다. COM 사용의 제한 사항과 시스템에서 사용할 수 있는 ProgId 확인 방법에 대한 자세한 설명은 이 사용자 가이드의 범위를 벗어나지만 WSH와 같은 환경에서 잘 알려진 대부분의 개체는 PowerShell 내에서 사용할 수 있습니다.

WScript.Shell, WScript.Network, Scripting.Dictionary 및 Scripting.FileSystemObject같은 progids를 지정하여 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 개체를 사용하여 신속하게 수행할 수 있는 작업 중 하나는 바로 가기를 만드는 것입니다. 바탕 화면에 PowerShell의 홈 폴더로 연결되는 바로 가기를 만든다고 가정합니다. 먼저 WScript.Shell에 대한 참조를 만들어야 합니다. 이 참조는 다음과 같은 $WshShell변수에 저장됩니다.

$WshShell = New-Object -ComObject WScript.Shell

Get-Member는 COM 개체로 작업하므로 다음과 같이 입력하여 개체의 멤버를 탐색할 수 있습니다.

$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 에는 입력을 제공하는 파이핑 대신 사용할 수 있는 선택적 InputObject 매개 변수가 있습니다 Get-Member. Get-Member -InputObject $WshShell 명령을 대신 사용한 경우 위와 동일한 출력을 얻게 됩니다. InputObject를 사용하는 경우 해당 인수를 단일 항목으로 처리합니다. 즉, Get-Member 변수에 여러 개체가 있는 경우 개체 배열로 처리합니다. 예시:

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

WScript.Shell CreateShortcut 메서드는 만들 바로 가기 파일의 경로인 단일 인수를 허용합니다. 바탕 화면의 전체 경로를 입력할 수 있지만 더 쉬운 방법이 있습니다. 데스크톱은 일반적으로 현재 사용자의 홈 폴더 내에 있는 Desktop이라는 폴더로 표시됩니다. Windows PowerShell에는 이 폴더의 경로가 포함된 변수 $HOME 가 있습니다. 이 변수를 사용하여 홈 폴더의 경로를 지정한 다음, 데스크톱 폴더의 이름과 다음을 입력하여 만들 바로 가기의 이름을 추가할 수 있습니다.

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

큰따옴표 안에 변수 이름처럼 보이는 항목을 사용하면 PowerShell은 일치하는 값을 대체하려고 합니다. 작은따옴표를 사용하면 PowerShell에서 변수 값을 대체하려 하지 않습니다. 예를 들어 다음 명령을 입력해 봅니다.

"$HOME\Desktop\PSHome.lnk"
C:\Documents and Settings\aka\Desktop\PSHome.lnk
'$HOME\Desktop\PSHome.lnk'
$HOME\Desktop\PSHome.lnk

이제 새 바로 가기 참조를 포함하는 이름이 지정된 $lnk 변수가 있습니다. 해당 멤버를 보려면 해당 멤버를 파이프할 Get-Member수 있습니다. 아래 출력은 바로 가기 만들기를 완료하는 데 사용해야 하는 멤버를 보여줍니다.

$lnk | Get-Member
TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}
Name             MemberType   Definition
----             ----------   ----------
...
Save             Method       void Save ()
...
TargetPath       Property     string TargetPath () {get} {set}

PowerShell의 애플리케이션 폴더인 TargetPath를 지정한 다음, Save 메서드를 호출하여 바로 가기를 저장해야 합니다. PowerShell 애플리케이션 폴더 경로는 $PSHome 변수에 저장되므로 다음과 같이 입력하면 됩니다.

$lnk.TargetPath = $PSHome
$lnk.Save()

PowerShell에서 Internet Explorer 사용

COM을 사용하여 많은 애플리케이션(Microsoft Office 애플리케이션 제품군 및 Internet Explorer 포함)을 자동화할 수 있습니다. 다음 예제에서는 COM 기반 애플리케이션 작업과 관련된 몇 가지 일반적인 기술과 문제를 보여 줍니다.

Internet Explorer ProgId, InternetExplorer.Application을 지정하여 Internet Explorer 인스턴스를 만듭니다.

$ie = New-Object -ComObject InternetExplorer.Application

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

참고 항목

일반적으로 ActiveX 실행 파일이라고 하는 별도의 프로세스로 시작하는 COM 개체는 시작할 때 사용자 인터페이스 창을 표시하거나 표시하지 않을 수 있습니다. Internet Explorer와 같이 창을 만들지만 표시하지 않는 경우 포커스는 일반적으로 Windows 바탕 화면으로 이동합니다. 창과 상호 작용하려면 창을 표시해야 합니다.

입력하면 $ie | Get-MemberInternet Explorer의 속성과 메서드를 볼 수 있습니다. Internet Explorer 창을 보려면 다음과 같이 입력하여 Visible 속성을 $true로 설정합니다.

$ie.Visible = $true

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

$ie.Navigate("https://devblogs.microsoft.com/scripting/")

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

$ie.Document.Body.InnerText

PowerShell 내에서 Internet Explorer를 닫려면 해당 메서드를 Quit() 호출합니다.

$ie.Quit()

$ie 여전히 COM 개체로 표시되는 경우에도 변수에 유효한 참조가 더 이상 포함되지 않습니다. 이를 사용하려고 하면 PowerShell에서 자동화 오류 메시지를 반환합니다.

$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 실행 파일을 종료할지 아니면 계속 실행할지에 대한 일반적인 표준은 없습니다. 애플리케이션이 표시되는지 여부, 애플리케이션에서 편집한 문서의 실행 여부 및 PowerShell의 실행 여부와 같은 상황에 따라 애플리케이션이 종료될 수도 있고, 종료되지 않을 수도 있습니다. 따라서 PowerShell에서 사용할 각 ActiveX 실행 파일의 종료 동작을 테스트해야 합니다.

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

경우에 따라 COM 개체에는 New-Object에서 사용하는 연결된 .NET Framework RCW(런타임 호출 가능 래퍼)가 포함되어 있을 수 있습니다. RCW의 동작은 일반 COM 개체 New-Object의 동작과 다를 수 있으므로 RCW 액세스에 대해 경고하는 Strict 매개 변수가 있습니다. Strict 매개 변수를 지정한 다음 RCW를 사용하는 COM 개체를 만들면 경고 메시지가 표시됩니다.

$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 interop assembly. If
this type exposes different members than the IDispatch members , scripts written to work with this
object might not work if the primary interop assembly isn't installed. At line:1 char:17 + $xl =
New-Object <<<< -ComObject Excel.Application -Strict

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