simclass is not a CIM class

Powershell, .NET関連でCIMを調べていて、漸く辿り着いた結論が『cimclass is not a CIM class』

cimclass は.NET のclass で、通常は使用しないが、下記の様にcim instance 生成に使用できる。

$o = [cimclass]::new().create($s, "win32_process")
# $s はcimsession, win32_*はcimclass name. 

上記で生成されたcim instanceはpsobject にwrap されたcim instanceであり、psobject として利用できる。ただし、通常は下記のようにしてcim instanceを生成する。

$o =new-ciminstance -classname win32_process -property @{cOmmandline="notepad.exe"}

psobject 用のnew-object や、個々のcim classに対する [class]::new()ではなく、ciminstance 専用のcmdlet がある事が、cim worldと、psobject world の2つの異なる世界の存在を明らかにしている。

powershell はnew-ciminstanceなどのcim world向けのcmdletや、psobject でwrap されたciminstance に対応することで、2つの世界の共生を試みている。

ここで、psobject world と、cim world を簡単にまとめる。

  1. psobject world

psobject classにより、.NET class をwrap したclass world. .NETインスタンスが psobject でwrapされ、psobject として扱える。なお、psobject は抽象class かつ、sealed classであり、継承もインスタンス化もできない。.NET class world のコピーワールドのようなもの。

2. cim world

CIMの基本仕様はDMTF で定義される。実装はVENDER依存である。CIM は単一classを親とするSmalltalkに端を発する多くのobject言語と異なり、namespace で細切れにされた複数のトップ階層のcimclass を持つmulti root 構造である。少なくともobject 自身の実装上は、superclassがnull のcimclass が大量に存在し全class がparent class を持つ実装とは異なる。実際はトップ階層のobject のentityがcimserver に隠蔽され、トップに見えるものは実はcimserver 内部のlocal実装を継承した形になっていると思われる。

さて、この2つの世界を繋ぐため、powershell では、CIM のclass 自体をclass として実装せず、cimclassをコンテナ的なヘルパークラスとして実装したため、題名の様な事実が発生する。

psobject におけるcimの扱い。

  1. CIM class, CIM class 自体のclassはなく、cim class を名前で呼び出すか、cim class object のコンテナとしてのcimclass を提供している。一般的なclass はインスタンスを作成可能だが、cimclass class にはCIM classのコンストラクタがなく、cim instance をコンストラクタで生成することができない。[cimclass]::new()で制されるのは、.net class としてのcimclass のインスタンスであり、CIM class のインスタンスではない。create() instance method を使用し、パラメータで指定したCIM class のciminstance を作成する事ができるが、一般的なclass によるinstance 生成ではなくヘルパー関数のようなもの。通常、ciminstance 生成にはpsobject とは異なる専用のnew-ciminstance 等を使う。

  2. CIM instance, こちらも同様に、cim instance のコンテナとしてのciminstance class を提供している。しかし、cimclass class とは異なり、ciminstance class はCIM INSTANCE をwrapしたpsobject であり、他のpsobjectと同様にcim instanceを扱う事ができる。

  3. CIM namespace, CIM namespaceは、__namespace class のinstance. root が頂点。CIM instance であり、例えば、root/poi namespace を生成する場合、new-ciminstance -namespace root -classname __namespace -property @{name="poi"} 、で生成できる。__namespace class のnamespace はroot. そして、root は、__namespace class のinstance. __namespace classは自分のインスタンスであるrootのnamespace に属するclass というのが興味深い。

Powershell でwindows を扱う場合、powershell 自体と、CIMの2つのclass 階層と、それぞの処理方法を意識する必要がある。

CIM class はPS worldとは別世界だが、cim instanceがPSObjectであり、cim instanceを取得さえできれば、以後はps world に戻り処理する事ができる。

なお、CIM世界のclass階層を一つ示す。

CIM_ManagedSystemElement
- CIM_LogicalElement
-- CIM_Proces
--- win32_process

ここにCIMのprocess があるが、powershell Get-Processで得られるのは、.net のProcess classのinstance であり、win32_process でもCIM_process でもない。CIMを使用するケースは、powershell/.net で準備されていないが、cim で実装済みの機能を使いたい場合が殆どだろう。しかし、その機能が.net で実装されれば用済みとなり、cimで実装してもそのライフは短いかもしれない。

今回はここまで。その他のcim にまつわる話は次回以降にて。

今回のテーマ『cimclass is not a CIM class』の意味を理解頂けたでしょうか。

それではまた。


この記事が気に入ったらサポートをしてみませんか?