日経クロステックに掲載された20年前の豊田孝さんのコードと考察が酷かったので修正してみた
Windowsユーザーのためのワンポイント・レッスン 第22回 | 日経クロステック(xTECH)
プログラムを実行すると,図1のような情報が返されるだけで,Windowsシステムが実際にシャットダウンされるようなことはありませんでした。 筆者は報告されたエラー番号438の説明を読んでみましたが,結論としては,関連するオブジェクト(この場合,Windowsオペレーティング・システム・オブジェクト)のドキュメントを読む以外にないことを知りました。この説明に何度も目を通しましたから,少なくとも,Win32Shutdownメソッドの使い方に間違いはないはずです。 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メソッドは名目上は存在するにしても,その実体は実装されていない,ということになると思われます。 |
まず、突っ込みどころとしては、シャットダウンするために、SeShutdownPrivilege特権が必要なのであって、サンプルプログラムでは特権を使用するためのコードが書かれていないので監査報告があるはずがない点ですね。
On Error Resume Next |
修正したコードがこちら。
oObject_01.Security_.ImpersonationLevel 自体は失敗するのですが、特権使用を監査する場合このコードを追加することで特権利用が監査できます。
2つ目の修正が重要で、oObject_3 自体が Win32Shutdown の実態なので oObject_2.Win32Shutdownとするのが正解です。
また、シャットダウンさせるといっているので、パラメータは 4(logoff and force)ではなく5(shutdown and force)が正解になります
このコードを実行すると、 特権利用の失敗がイベントログに記録されます。
Comments