日経クロステックに掲載された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
Dim oObject_0, oObject_01, oObject_1, oObject_2, oObject_3
Dim retVal, fCovered, strTargetFunction
retVal = 1
fCovered = False
strTargetFunction = "Win32_OperatingSystem"
Set oObject_0 = CreateObject("WBemScripting.SWBemLocator")
Set oObject_01 = oObject_0.ConnectServer("")
oObject_01.Security_.ImpersonationLevel = 3
Set oObject_1 = oObject_01.InstancesOf(strTargetFunction)
For Each oObject_2 In oObject_1
  For Each oObject_3 In oObject_2.Methods_
    If IsObject(oObject_3) And (ucase(oObject_3.Name) = ucase("Win32Shutdown")) Then
       fCovered = True : Exit For
    End If
  Next
Next
If (fCovered = True) Then
      retVal = oObject_2.Win32Shutdown(1 + 4)
  If (0 = retVal) Then
    msgBox "Success"
  ElseIf ((0 <> retVal) And fCovered) Then
    msgBox Err.Description, 0, "Failed=> " & Err.Number
  Else
    msgBox Err.Description, 0, "Madat=> " & Err.Number
  End If
Else
    msgBox Err.Description, 0, "Not supported Win32Shutdown"
Endif

 

修正したコードがこちら。
oObject_01.Security_.ImpersonationLevel 自体は失敗するのですが、特権使用を監査する場合このコードを追加することで特権利用が監査できます。
2つ目の修正が重要で、oObject_3 自体が Win32Shutdown の実態なので oObject_2.Win32Shutdownとするのが正解です。
また、シャットダウンさせるといっているので、パラメータは 4(logoff and force)ではなく5(shutdown and force)が正解になります

このコードを実行すると、 特権利用の失敗がイベントログに記録されます。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です