.NET オブジェクトと COM オブジェクトを作成する (New-Object)Creating .NET and COM Objects (New-Object)

ソフトウェア コンポーネントの中には、さまざまなシステム管理タスクを実行できるようにする .NET Framework や COM インターフェイスを備えているものがあります。There are software components with .NET Framework and COM interfaces that enable you to perform many system administration tasks. これらのコンポーネントは Windows PowerShell から使用することもでき、コマンドレットだけではできないタスクも実行できます。Windows PowerShell lets you use these components, so you are not limited to the tasks that can be performed by using cmdlets. Windows PowerShell の初回リリースでは、コマンドレットの多くがリモート コンピューターに対応していません。Many of the cmdlets in the initial release of Windows PowerShell do not work against remote computers. ここでは、イベント ログを管理する場合に、.NET Framework の System.Diagnostics.EventLog クラスを Windows PowerShell から直接使用して、この制限を回避する方法を紹介します。We will demonstrate how to get around this limitation when managing event logs by using the .NET Framework System.Diagnostics.EventLog class directly from Windows PowerShell.

New-Object によるイベント ログへのアクセスUsing New-Object for Event Log Access

.NET Framework のクラス ライブラリには、イベント ログの管理に使用する System.Diagnostics.EventLog というクラスが含まれています。The .NET Framework Class Library includes a class named System.Diagnostics.EventLog that can be used to manage event logs. .NET Framework クラスの新しいインスタンスを作成するには、New-Object コマンドレットと TypeName パラメーターを使用します。You can create a new instance of a .NET Framework class by using the New-Object cmdlet with the TypeName parameter. たとえば、次のコマンドを実行すると、イベント ログの参照が作成されます。For example, the following command creates an event log reference:

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

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

このコマンドによって EventLog クラスのインスタンスは作成されましたが、このインスタンスにはデータがまったく含まれていません。Although the command has created an instance of the EventLog class, the instance does not include any data. これは、特定のイベント ログを指定しなかったためです。That is because we did not specify a particular event log. 実際のイベント ログを取得するにはどうすればよいのでしょうか。How do you get a real event log?

New-Object でのコンストラクターの使用Using Constructors with New-Object

特定のイベント ログを参照するには、ログの名前を指定する必要があります。To refer to a specific event log, you need to specify the name of the log. New-Object には、ArgumentList というパラメーターがあります。New-Object has an ArgumentList parameter. このパラメーターの値として渡した引数は、オブジェクトの特殊な初期化メソッドで使用されます。The arguments you pass as values to this parameter are used by a special startup method of the object. オブジェクトを構築 (construct) する目的で使用されることから、このメソッドはコンストラクターと呼ばれています。The method is called a constructor because it is used to construct the object. たとえば、Application ログの参照を取得するには、"Application" という文字列を引数として指定します。For example, to get a reference to the Application log, you specify the string 'Application' as an argument:

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 名前空間から検索しようと試みます。Since most of the .NET Framework core classes are contained in the System namespace, Windows PowerShell will automatically attempt to find classes you specify in the System namespace if it cannot find a match for the typename you specify. したがって、「System.Diagnostics.EventLog」の部分は「Diagnostics.EventLog」と指定することもできます。This means that you can specify Diagnostics.EventLog instead of System.Diagnostics.EventLog.

オブジェクトの変数への保存Storing Objects in Variables

オブジェクトの参照を保存し、それを現在のシェルで使用できます。You might want to store a reference to an object, so you can use it in the current shell. Windows PowerShell では多くの作業をパイプラインを使って実行できるため、変数を使用する機会はあまり多くありません。しかし、場合によっては、オブジェクトの参照を変数に格納した方が、オブジェクトを効率よく操作できることがあります。Although Windows PowerShell lets you do a lot of work with pipelines, lessening the need for variables, sometimes storing references to objects in variables makes it more convenient to manipulate those objects.

Windows PowerShell では、変数 (つまり、オブジェクトに名前を付けたもの) を作成できます。Windows PowerShell lets you create variables that are essentially named objects. 正しい Windows PowerShell コマンドであれば、その出力を変数に格納できます。The output from any valid Windows PowerShell command can be stored in a variable. 変数名の先頭には、常に $ が付きます。Variable names always begin with $. Application ログの参照を変数 $AppLog に格納するには、この変数名の後に等号を入力し、続けて、Application ログ オブジェクトの作成に使用するコマンドを入力します。If you want to store the Application log reference in a variable named $AppLog, type the name of the variable, followed by an equal sign and then type the command used to create the Application log object:

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

その後、「$AppLog」と入力すると、Application ログが格納されていることを確認できます。If you then type $AppLog, you can see that it contains the Application log:

PS> $AppLog

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

New-Object によるリモートのイベント ログへのアクセスAccessing a Remote Event Log with New-Object

前のセクションで使用したコマンドは、アクセス先としてローカル コンピューターを想定していました。ローカル コンピューターのイベント ログを取得するのであれば、Get-EventLog コマンドレットを使って行うこともできます。The commands used in the preceding section target the local computer; the Get-EventLog cmdlet can do that. リモート コンピューターの Application ログにアクセスするには、引数として、ログの名前とコンピューター名 (または IP アドレス) の両方を指定する必要があります。To access the Application log on a remote computer, you must supply both the log name and a computer name (or IP address) as arguments.

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 変数に格納されました。以降、この変数を使って、具体的にどのようなタスクを実行できるのかを説明します。Now that we have a reference to an event log stored in the $RemoteAppLog variable, what tasks can we perform on it?

オブジェクトのメソッドを使用したイベント ログのクリアClearing an Event Log with Object Methods

多くの場合、オブジェクトには、特定のタスクを実行するときに呼び出すことのできるメソッドが存在します。Objects often have methods that can be called to perform tasks. Get-Member を使用すると、オブジェクトに関連付けられているメソッドを表示できます。You can use Get-Member to display the methods associated with an object. 次の例は、EventLog クラスのメソッドを表示するコマンドと、その出力の抜粋です。The following command and selected output show some the methods of the EventLog class:

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() メソッドを使用します。The Clear() method can be used to clear the event log. メソッドを呼び出すときは、引数が不要な場合でも、メソッド名の後に丸かっこを必ず入力する必要があります。When calling a method, you must always follow the method name by parentheses, even if the method does not require arguments. Windows PowerShell は、丸かっこの有無により、それがメソッド名なのか、同名のプロパティ名なのかを判断します。This lets Windows PowerShell distinguish between the method and a potential property with the same name. Clear メソッドを呼び出すには、次のように入力します。Type the following to call the Clear method:

PS> $RemoteAppLog.Clear()

ログを表示するには、次のように入力します。Type the following to display the log. イベント ログがクリアされ、エントリ数が 262 から 0 に変わっていることが確認できます。You will see that the event log was cleared, and now has 0 entries instead of 262:

PS> $RemoteAppLog

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

New-Object による COM オブジェクトの作成Creating COM Objects with New-Object

コンポーネント オブジェクト モデル (COM) のコンポーネントを操作するには、New-Object を使用します。You can use New-Object to work with Component Object Model (COM) components. 一口にコンポーネントと言っても、その種類は Windows Script Host (WSH) に含まれている各種ライブラリから、Internet Explorer のようなほとんどのシステムにインストールされている ActiveX アプリケーションまで多岐にわたります。Components range from the various libraries included with Windows Script Host (WSH) to ActiveX applications such as Internet Explorer that are installed on most systems.

New-Object では、.NET Framework ランタイム呼び出し可能ラッパーを使って COM オブジェクトを作成します。したがって、COM オブジェクトを呼び出す際には .NET Framework の場合と同じ制限が適用されます。New-Object uses .NET Framework Runtime-Callable Wrappers to create COM objects, so it has the same limitations that .NET Framework does when calling COM objects. COM オブジェクトを作成するには、使用する COM クラスのプログラム識別子 (ProgId) を ComObject パラメーターで指定する必要があります。To create a COM object, you need to specify the ComObject parameter with the Programmatic Identifier or ProgId of the COM class you want to use. COM の使用上の制限や、システム上で利用できる ProgId の調査方法については、このマニュアルの範囲を超えているので詳しく説明しません。しかし、WSH などの環境に存在する、一般によく知られているようなオブジェクトについては、Windows PowerShell 内で使用できます。A complete discussion of the limitations of COM use and determining what ProgIds are available on a system is beyond the scope of this user's guide, but most well-known objects from environments such as WSH can be used within Windows PowerShell.

WSH オブジェクトは、WScript.ShellWScript.NetworkScripting.DictionaryScripting.FileSystemObject などを ProgId として指定すれば作成できます。You can create the WSH objects by specifying these progids: WScript.Shell, WScript.Network, Scripting.Dictionary, and Scripting.FileSystemObject. これらのオブジェクトを作成するコマンドの例を次に示します。The following commands create these objects:

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

これらのクラスの機能は、その多くが、Windows PowerShell から他の方法を使ってアクセスすることもできます。ただし、ショートカットの作成など、一部のタスクについては、WSH のクラスを使用した方が簡単です。Although most of the functionality of these classes is made available in other ways in Windows PowerShell, a few tasks such as shortcut creation are still easier to do using the WSH classes.

WScript.Shell によるデスクトップ ショートカットの作成Creating a Desktop Shortcut with WScript.Shell

COM オブジェクトの使用が適しているタスクの 1 つに、ショートカットの作成があります。One task that can be performed quickly with a COM object is creating a shortcut. Windows PowerShell のホーム フォルダーに対するショートカットをデスクトップ上に作成するとします。Suppose you want to create a shortcut on your desktop that links to the home folder for Windows PowerShell. まず必要なことは、WScript.Shell の参照を作成することです。ここでは、この参照を $WshShell という変数に格納することにします。You first need to create a reference to WScript.Shell, which we will store in a variable named $WshShell:

$WshShell = New-Object -ComObject WScript.Shell

Get-Member は COM オブジェクトに対応しているため、次のように入力することで、オブジェクトのメンバーを調査できます。Get-Member works with COM objects, so you can explore the members of the object by typing:

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 には、省略可能なパラメーター InputObject があります。Get-Member に対する入力をパイプで渡す代わりに、このパラメーターを使用することもできます。Get-Member has an optional InputObject parameter you can use instead of piping to provide input to Get-Member. Get-Member -InputObject $WshShell コマンドを使用しても表示される出力結果は同じです。You would get the same output as shown above if you instead used the command Get-Member -InputObject $WshShell. InputObject を使用した場合、その引数は単一の項目として扱われます。If you use InputObject, it treats its argument as a single item. つまり、1 つの変数に複数のオブジェクトが格納されている場合、Get-Member では、それらはオブジェクトの配列として扱われます。This means that if you have several objects in a variable, Get-Member treats them as an array of objects. たとえば、次のように入力します。For example:

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

WScript.Shell CreateShortcut メソッドは、作成するショートカット ファイルのパスのみを引数として受け取ります。The WScript.Shell CreateShortcut method accepts a single argument, the path to the shortcut file to create. デスクトップへのフル パスを入力することもできますが、より簡単な方法があります。We could type in the full path to the desktop, but there is an easier way. 通常、デスクトップは、現在のユーザーのホーム フォルダーにある "デスクトップ" というフォルダー名で表されます。The desktop is normally represented by a folder named Desktop inside the home folder of the current user. Windows PowerShell には、このフォルダーへのパスを保持する $Home という変数が用意されています。Windows PowerShell has a variable $Home that contains the path to this folder. この変数を使ってホーム フォルダーのパスを指定し、続けて、デスクトップ フォルダーの名前と、作成するショートカットの名前を追加します。次にその例を示します。We can specify the path to the home folder by using this variable, and then add the name of the Desktop folder and the name for the shortcut to create by typing:

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

変数名と思われる情報が二重引用符内に存在した場合、Windows PowerShell は、それを対応する値に置き換えようと試みます。When you use something that looks like a variable name inside double-quotes, Windows PowerShell tries to substitute a matching value. 一重引用符を使用した場合、変数値の置き換えは行われません。If you use single-quotes, Windows PowerShell does not try to substitute the variable value. たとえば、次のコマンドを入力してみてください。For example, try typing the following commands:

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

$lnk という変数には、現在、新しいショートカットの参照が格納されています。We now have a variable named $lnk that contains a new shortcut reference. メンバーを表示するには、この変数をパイプを使って Get-Member に渡します。If you want to see its members, you can pipe it to Get-Member. 次のように、ショートカットを完成するために必要なメンバーが出力結果として表示されます。The output below shows the members we need to use to finish creating our shortcut:

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}

TargetPath (Windows PowerShell のアプリケーション フォルダー) を指定した後、Save メソッドを呼び出してショートカット $lnk を保存する必要があります。We need to specify the TargetPath, which is the application folder for Windows PowerShell, and then save the shortcut $lnk by calling the Save method. Windows PowerShell のアプリケーション フォルダーのパスは変数 $PSHome に保存されているため、次のように入力します。The Windows PowerShell application folder path is stored in the variable $PSHome, so we can do this by typing:

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

Windows PowerShell からの Internet Explorer の使用Using Internet Explorer from Windows PowerShell

Microsoft Office ファミリのアプリケーションや Internet Explorer など、多くのアプリケーションは COM を使用して自動化できます。Many applications (including the Microsoft Office family of applications and Internet Explorer) can be automated by using COM. COM ベースのアプリケーション操作に関係する一般的なテクニックと問題点を、Internet Explorer を例に取り上げます。Internet Explorer illustrates some of the typical techniques and issues involved in working with COM-based applications.

Internet Explorer のインスタンスを作成するには、次のように、Internet Explorer の ProgId として InternetExplorer.Application を指定します。You create an Internet Explorer instance by specifying the Internet Explorer ProgId, InternetExplorer.Application:

$ie = New-Object -ComObject InternetExplorer.Application

このコマンドでは、Internet Explorer は起動しますが、表示はされません。This command starts Internet Explorer, but does not make it visible. 「Get-Process」と入力すると、iexplore という名前のプロセスが実行されていることがわかります。If you type Get-Process, you can see that a process named iexplore is running. 実際、Windows PowerShell を終了しても、このプロセスは実行されたままです。In fact, if you exit Windows PowerShell, the process will continue to run. iexplore プロセスを終了するには、コンピューターを再起動するか、またはタスク マネージャーなどのツールを使用する必要があります。You must reboot the computer or use a tool like Task Manager to end the iexplore process.

注意

独立したプロセスとして起動する COM オブジェクトは、一般に ActiveX 実行可能ファイルと呼ばれ、起動時にユーザー インターフェイス ウィンドウを表示するものと、表示しないものが存在します。COM objects that start as separate processes, commonly called ActiveX executables, may or may not display a user interface window when they start up. Internet Explorer のように、ウィンドウは作成されても、表示状態にはしない COM オブジェクトの場合、フォーカスが Windows デスクトップに移されることが多く、ユーザーが操作できるようにするためには、ウィンドウを表示状態にする必要があります。If they create a window but do not make it visible, like Internet Explorer, the focus will generally move to the Windows desktop and you must make the window visible to interact with it.

$ie | Get-Member と入力すると、Internet Explorer のプロパティおよびメソッドを表示できます。By typing $ie | Get-Member, you can view properties and methods for Internet Explorer. Internet Explorer ウィンドウを表示するには、次のように、Visible プロパティを $true に設定します。To see the Internet Explorer window, set the Visible property to $true by typing:

$ie.Visible = $true

次に、Navigate メソッドを使用すると、特定の Web アドレスに移動できます。You can then navigate to a specific Web address by using the Navigate method:

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

Internet Explorer オブジェクト モデルの他のメンバーを使用すると、この Web ページからテキストの内容を取得できます。Using other members of the Internet Explorer object model, it is possible to retrieve text content from the Web page. 次のコマンドを実行すると、現在の Web ページの本文に含まれる HTML テキストが表示されます。The following command will display the HTML text in the body of the current Web page:

$ie.Document.Body.InnerText

Internet Explorer を PowerShell 内から終了するには、Quit() メソッドを呼び出します。To close Internet Explorer from within PowerShell, call its Quit() method:

$ie.Quit()

この場合、アプリケーションは強制的に終了されます。This will force it to close. 一見すると、まだ COM オブジェクトが有効であるかのように見えますが、この時点で、$ie 変数には正しい参照が存在しません。The $ie variable no longer contains a valid reference even though it still appears to be a COM object. 使用を試みると、オートメーション エラーが発生します。If you attempt to use it, you will get an automation error:

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" などのような形で残っている参照を削除することも、次のように入力して変数を完全に削除することもできます。You can either remove the remaining reference with a command like $ie = $null, or completely remove the variable by typing:

Remove-Variable ie

注意

参照を削除したときに、ActiveX 実行可能ファイルを終了するか、実行を継続するかに関して、共通の標準は存在しません。There is no common standard for whether ActiveX executables exit or continue to run when you remove a reference to one. アプリケーションが終了するかどうかは、アプリケーションが可視状態であるか、編集中のドキュメントが存在するか、Windows PowerShell がまだ実行されているかなど、さまざまな条件に依存します。Depending on circumstances such as whether the application is visible, whether an edited document is running in it, and even whether Windows PowerShell is still running, the application may or may not exit. そのため、Windows PowerShell で使用する ActiveX 実行可能ファイルごとに、終了時の動作をテストしておく必要があります。For this reason, you should test termination behavior for each ActiveX executable you want to use in Windows PowerShell.

.NET Framework によってラップされた COM オブジェクトの警告の取得Getting Warnings About .NET Framework-Wrapped COM Objects

COM オブジェクトに、.NET Framework ランタイム呼び出し可能ラッパー (RCW) が関連付けられていて、これが New-Object で使用されることがあります。In some cases, a COM object might have an associated .NET Framework Runtime-Callable Wrapper or RCW, and this will be used by New-Object. RCW の動作は通常の COM オブジェクトの動作とは異なる場合があるため、New-Object には、RCW アクセスに関する警告を取得する Strict パラメーターが用意されています。Since the behavior of the RCW may be different from the behavior of the normal COM object, New-Object has a Strict parameter to warn you about RCW access. Strict パラメーターを指定し、RCW を使用する COM オブジェクトを作成した場合、次のような警告メッセージが表示されます。If you specify the Strict parameter and then create a COM object that uses an RCW, you get a warning message:

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 オブジェクトではないことを示す警告が表示されます。Although the object is still created, you are warned that it is not a standard COM object.