Windows XP Service Pack 2(SP2)の出荷が迫り,私たちWindowsユーザーはいろいろな新しい技術を学ぶ必要があります。しかしその一方で,前回確認したように,Windowsの基本はそれほど大きく変化しているわけではありません。と同時に,サンプル・プログラムの実行結果が示していたように,Windowsの世界はオブジェクト指向ベースの(意外と)分かりやすい世界であることも分かりました。しかし,Windowsのセキュリティ・メカニズムを理解するのはかなりの経験豊富な開発者でも難しいと言われます。なぜでしょう。今回は,そのあたりの事情を調べてみましょう。

Windowsの分かりやすさ

 前回紹介した「No9ListNameSpaces.exe」サンプル・プログラムを実行すると分かりますが,返される情報はある一定の秩序で分かりやすく整理されています。これを専門的に表現すれば,「No9ListNameSpaces.exe」サンプル・プログラムは「クラスとクラス・コレクション」を応用し,単純な再帰動作をひたすら繰り返しているだけ,といってよいでしょう。つまり,「No9ListNameSpaces.exe」サンプル・プログラムは,米Microsoftの開発者が事前に用意してくれたクラスを活用する,オブジェクト指向ベースのクライアント・プログラム,といえます。

 筆者は,この数年,Windowsとオブジェクト指向の関係に注目してきました。.NETの世界はWindowsとオブジェクト指向の緊密な関係なくして成立しません。この意味では,私たちWindowsユーザーはオブジェクト指向に関する知識を身に付けておいた方がなにかと便利である,と言えるでしょう。

 ご承知のように,オブジェクト指向といえば,「クラス概念を理解することが基本」ですから,まずは単純なサンプル・プログラムを通して,クラスの概念を理解しておきましょう。サンプル・プログラムはこちらからダウンロードできるようにしてあります。時間のあるときにソースコードを検討し,実行してみるとよいでしょう。

 なお,オブジェクト指向そのものに関する詳しい基礎知識を身に付けたい人は,こちらの記事で紹介している書籍を参考にするとよいでしょう。

 オブジェクト指向に関する多くの専門図書では,プログラミングという視点とともに,「ソフトウエア・ビジネスでいかに収益を上げるか」という現実的な視点(プロジェクトのリスク管理)も設定しています。このため,オブジェクト指向に関する多くの専門図書は「難しい」と言われています。この連載では,説明の分かりやすさを優先し,プログラミングという視点のみを設定しています。以降の説明を読む際には,設定されている視点が多くの専門図書とは多少異なっている,ということを頭の隅に入れておいてください。

 クラスは,C#などのプログラミング言語やその基になった言語C++では,「ユーザー定義型」と呼ばれています。これは大変難しい表現ですが,簡単に言うと,クラスを使用すれば,自分の思い描いている夢や考えている内容を効率的に表現できる,ということです。この意味では,クラスは,自己表現のための道具の1つです。筆者はサンプル・プログラムNo22_1.vbs内でITProToyotaNo22という名称を持つクラスを定義していますが,そのクラス定義では,次のような技術概念を応用しています。

  • コンストラクタ:クラス・イメージがメモリーに実際に展開されたときに最初に実行されるコード・ブロック
  • デストラクタ:クラス・イメージがメモリーから削除されるときに実行されるコード・ブロック
  • プロパティ:クラスの状態を管理・操作するための実行コード
  • メソッド:クラスの動作を定義した実行コード
  • アクセス制御(情報隠ぺい):クラス固有の状態への外部からのアクセス制限

 オブジェクト指向に関する専門文献をそれほど読んでいない人にとっては,もしかすると,これらの概念はかなり難解なものに映っているかもしれません。ITProToyotaNo22クラスを定義するために使用したプログラミング言語は,Windowsユーザーならその場で無料で利用できるVBScriptですから,時間のあるときに,筆者が定義したITProToyotaNo22クラスを気軽に読み解いてみるとよいでしょう。読み解く過程では,一字でも一行でも変更を加える積極的な姿勢で臨んでください。

 VBScriptのクラス表現構文はプログラミング言語C++やC#のものとはかなり異なっています。例えば,コンストラクタ(に相当する)コードは,次のようなものです。

Private Sub Class_Initialize
 setFirstName = "孝"
 setSecondName = "豊田"
End Sub

 ご覧のように,コンストラクタ名はClass_Initializeとなっており,C++やC#のものとはかなり異なります。参考のために,デストラクタ(に相当するコード)も紹介しておきます。

Private Sub Class_Terminate
 Dim myName
 Set oHelp = Nothing
 myName = SecondName & FirstName
 MsgBox myName,0,"Class is terminated!"
End Sub

 プログラミング学習を始めて間もない人にとっては,おそらく,これまでの説明は難しいと思います。ここで一言述べておきますが,クラスという技術概念を理解してしまうと,プログラミングを効率的に学習できるようになる,ということなのです。そして,クラスを理解してしまえば,Windowsの世界を楽しく理解できるようになる,ということなのです。さらにいえば,IT業界にいる限り,クラスを知って損をすることは何一つありません。

 クラスの概念はなんとなく分かりました。クラスは自分の考えている内容を分かりやすく表現するための道具です。このため,私たちWindowsユーザーは,セキュリティ情報もクラスで分かりやすく表現してくれるとありがたい,と期待したいところです。ところが,実際にはそううまくはいかないようなのです。それでは次に,うまくいかない例を1つ紹介しておきましょう。

クラスとセキュリティ表現

 筆者は,以前こちらの連載を担当しました。その連載では,Windowsオペレーティング・システムのプロパティ情報を収集し,表示するサンプル・プログラムを紹介しました。クラスというのは,すでに説明したように,プロパティ以外の情報も持っています。例えば,メソッド情報などです。プログラミング学習を始めて間もない方の中には,メソッド情報といわれても,ピンとこない方もおられることでしょう。それでは,今回の第2サンプル・プログラムNo22_2.vbsを実行し,メソッドについて学習しましょう。

 第2サンプル・プログラムNo22_2.vbsを実行すると,筆者のWindows Server 2003環境では,次のような情報が返されます。

***********************************

Microsoft(R) Windows(R) Server 2003,Enterprise Editionのメソッド数: 4

No.1: Reboot
No.2: Shutdown
No.3: Win32Shutdown
No.4: SetDateTime

***********************************

 この第2サンプル・プログラムはWindows XP環境でも動作します。Windows XPユーザーの方は,以降の説明文内に出てくるWindows Server 2003はWindows XPと置き換えて読んでください。

 さて,この情報から,メソッドがどのようものなのか分かりますか。プロパティは目的のオブジェクトの状態を,メソッドはそのオブジェクトの動作をそれぞれ表現すると一般には言われています。この出力情報を読む限り,筆者のWindows Server 2003オブジェクトは,4つのメソッド(動作)を持っていることが分かります。

 例えば,Rebootメソッドは,Windows Server 2003がリブート(再起動)という動作を行う機能を持っていることを示しています。そこで筆者は,第3のサンプル・プログラムNo22_3.vbsを作成し,4つのメソッドの1つであるWin32Shutdownというメソッドを実行してみることにしました。サンプル・プログラムNo22_3.vbsもこちらからダウンロードできますから,時間のあるときにぜひ試してみてください。

図1●サンプル・プログラムNo22_3.vbsの実行結果
図2●特権使用の監査のプロパティ
図3●特権が正常に使用されている場合の監査報告例
 プログラムを実行すると,図1[拡大表示]のような情報が返されるだけで,Windowsシステムが実際にシャットダウンされるようなことはありませんでした。

 筆者は報告されたエラー番号438の説明を読んでみましたが,結論としては,関連するオブジェクト(この場合,Windowsオペレーティング・システム・オブジェクト)のドキュメントを読む以外にないことを知りました。この説明に何度も目を通しましたから,少なくとも,Win32Shutdownメソッドの使い方に間違いはないはずです。

 冷静に考えてみると,Windowsシステムを簡単にシャットダウンできる,ということは大変なことです。ましてや,VBScriptレベルでシャットダウン操作が可能となれば,おそらく,スクリプト・キッドの餌食となるWindowsユーザーの数は膨大になることでしょう。このような事情もあり,Win32Shutdownメソッドの説明には,次のような注意文が含まれています。

On computer systems running WindowsR NT/Windows 2000,the calling process must have the SE_SHUTDOWN_NAME privilege.

 この文は,WindowsをシャットダウンするにはSE_SHUTDOWN_NAME(別名SeShutdownPrivilege)特権が必要であることを述べています。そこで筆者は,図2[拡大表示]のような機能を活用して,No22_3.vbsサンプル・プログラムの特権使用を監査してみました。

 たいへん残念なことに,なんの監査報告もありませんでした。このため,結論としては,Win32Shutdownメソッドは名目上は存在するにしても,その実体は実装されていない,ということになると思われます。参考のために,特権が正常に使用されている場合の監査報告例を紹介しておきます(図3[拡大表示])。

 今回紹介した第2サンプル・プログラムNo22_2.vbsは,4種類のシャットダウン・メソッドの存在を確かに報告してくれます。オブジェクト指向的には,Windowsオペレーティング・システム・オブジェクトが公開しているインタフェースの分かりやすい報告ということになりますが,報告されるインタフェースの実際の使用法と使用上の制限,あるいはセキュリティとの関係などに関する重要な情報は,私たちWindowsユーザーが自力で収集し,理解する必要があります。この作業は,平均的なWindowsユーザーには荷が重過ぎる,と筆者は考えます。

 また,現在のWindowsオペレーティング・システム・オブジェクトの説明は飛躍が多く,結果的に,分かりにくくなっています。セキュリティに関する説明は,教育効果を十分考慮し,分かりやすい丁寧な説明が必要とされていると考えるのは,筆者だけでしょうか。

今回のまとめ

  • クラスは表現道具の1つである
  • クラスを知って損をすることは何1つない
  • クラスが公開するメソッドにはセキュリティとの関係から利用できないものがある
  • 利用できない理由を理解するには膨大な時間が必要になる
  • Microsoft社は利用できない理由を分かりやすく説明していない

 今回は以上で終了です。次回またお会いいたしましょう。ごきげんよう!