shutdown.exeを使ったスケジュールシャットダウン

Windows2003には、コンピューターをシャットダウンさせるコマンドshutdown.exeが標準でついてくるようになった。同様のコマンドは、Windows2000ではリソースキットに含まれていた。
Windows2003のshutdown.exeでは、コンピュータのロックでロックした状態のコンピューターをシャットダウンできないみたいだ。てゆうかできなかった。
Shutdown.exe コマンドを実行してもコンピュータが自動的にシャットダウンしない
MSのサポート技術情報もこういっているので、間違いなくロックされたコンピューターはシャットダウンできない。

解決案

1.コンピューターのロックをしない
コンピューターのロックではなく、ログオフなら問題なくシャットダウンできそうなのでそうすればいい。でも、コンピューターのログオフは時間がかかって嫌いなのでできればやりたくはない。却下。
いうまでもないことだけれど、ロックもログオフもしないという選択肢は無い。

2.MSのサポートをたよる
上のMSサポート技術情報には、「場合によっては修正したshutdown.exeを提供してやらないことも無い」的なことが書かれている。引きこもりなぼくはサポートに電話しないといけないのが恥ずかしいので、却下。

3.TSSHUTDN.EXEを使う
Terminal Serviceをインストールするとインストールされるプログラム。shutdown.exeと同じように、システムのシャットダウンやリブートができる。
tsshutdnはInitiateSystemShutdownをコールしないみたいで、コンピューターをロックした状態でもシャットダウンができた。採用。

IBMのサポート情報には
Terminal Serverの停止には、TSSHUTDN.EXEコマンドをご利用ください。
とあった。これによると、リソースキットのshutdown.exeはbForceAppsClosedフラグをTRUEにしてInitiateSystemShutdownをコールするが、これは場合によっては不具合を起こすので、tsshutdn.exeを使おうね。ということらしい。

MSDN InitiateSystemShutdown
によると、

Windows Server 2003 and Windows XP: If the computer is locked and the bForceAppsClosed parameter is FALSE, the last error code is ERROR_MACHINE_LOCKED. If the system is not ready to handle the request, the last error code is ERROR_NOT_READY. The application should wait a short while and retry the call.

とある。
bForceAppsClosedフラグをFALSEにしてInitiateSystemShutdownをコールすると、ロックされたコンピューターではERROR_MACHINE_LOCKEDというエラーが返ってくるので、シャットダウンは行われないみたいだ。

たぶん、2003のshutdown.exeはbForceAppsClosedフラグをFALSEにしてInitiateSystemShutdownをコールする、という仕様変更をしたんだと思う。
で、コンピューターをロックしているとInitiateSystemShutdownがエラーを返してきてプログラム終了してるんだろうなあ。