ASP.NETでPage.Titleを設定しても反映されない

ASP.NETでPage.Titleを設定しても反映されないので暫く悩んでいた。原因は、自動生成されるASPXファイルの先頭に記述されているページディレクティブで空白が指定されているためだった。

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="CitySearchDetail.aspx.cs" Inherits="WeatherArchiveWeb.CitySearchDetail" %>

ASPXファイルの先頭に<%@で始まる一行があるが、これがページディレクティブによるパラメータの設定。ここでTitle=""と指定されているので、コード中でPage.Titleを変更しても常に上書きされてしまう。

Windowsストアアプリが起動しない時の対処

フォトを初めとする、初期インストールされていたWindowsストアアプリが一切起動しなくなってしまった。起動すると「このアプリを開けません。フォトで問題が見つかりました。修復または再インストールについてはシステム管理者に問い合わせて下さい。」と表示される。
いくつかのサイトを参考にした結果、以下のような対応を試してみた。

WSRESETの実行

管理者権限でコマンドプロンプトを開き、WSRESET.EXEを起動する。WSRESETはWindowsストアの機能を初期化するコマンドです。これで復旧する例もあるようですが、復元しませんでした。

sfc /scannnowの実行

sfcは誤ってシステムファイルが変更されたりファイルが壊れてしまった場合、WindowsUpdate等の実行時に自動的に作成されているバックアップファイルを使用して、システムを復元するコマンドです。ですが特に異常は見つからず、状況は変わりませんでした。

dism /online /cleanup-image /restorehealthの実行

dismはWindowsを複数台にインストールする場合などに、OSの構成を自動化するためのツールです。コントロールパネルの「Windowsの機能の有効化または無効化」が対応します。この修復機能でWindowsの機能の有効化が上手く出来ていない場合には正常に戻るはずです。ですが特に異常は見つからず、状況は変わりませんでした。

Get-AppxPackageの実行

Powersehllを管理者権限で開き「Get-AppxPackage -AllUsers| Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($_.InstallLocation)\AppxManifest.xml”}」を実行します。「Get-AppxPackage」はインストール済みのWindowsストアアプリを列挙するコマンドです。続く「Add-AppxPackage」で列挙したWindowsストアアプリを再インストールしています。
このコマンドを実行するといくつか「リソースが現在使用中であるため、パッケージをインストールできませんでした。」「新しいバージョンが既にインストールされていたため、パッケージをインストールできませんでした。」「パス ‘C:\AppxManifest.xml’ が存在しないため検出できません。 」と言ったエラーが表示されます。「もしやこのエラーが・・・と思ったのですが」詳細を調べてみると原因ではなさそうです。この方法でも状況は変わりませんでした。

システムの復元

システムの復元はWindows Updateやアプリケーションのインストールが行われる前に、自動的に作成されるレジストリ及びファイルのバックアップです。コントロールパネルの「システム」から「システムの保護」を選び、システムの復元ボタンを押して起動します。・・・ですが、残念な事に途中でエラーが発生して復元することが出来ませんでした。

システムの再インストール

残る手段はシステムの再インストールです。Windows 10ではスタートメニューの「設定」から「更新とセキュリティ」を選び「回復」タブを選択すると「このPCを初期状態に戻す」と言う項目があります。これを開始すると「データを残したまま再インストールする」か「データも破棄して再インストールする」かを選べますので「データを残したまま再インストールする」に進みます。以前のOSよりも手軽に再インストールできるようになっているのは良いのですが・・・これって解決方法じゃないよなぁ。

You have already activated rake 11.2.2, but your Gemfile requires rake 10.5.0.と表示される

Octpressでrake generateを実行したところ、下記のように「You have already activated rake 11.2.2, but your Gemfile requires rake 10.5.0.」とエラーが表示された。

$ rake generate
rake aborted!
Gem::LoadError: You have already activated rake 11.2.2, but your Gemfile requires rake 10.5.0. Prepending `bundle exec` to your command may solve this.
/home/knarita/octopress/Rakefile:2:in `&lt;top (required)&gt;'
/var/lib/gems/2.1.0/gems/rake-11.2.2/exe/rake:27:in `&lt;top (required)&gt;'
(See full trace by running task with --trace)

Gemfileで要求しているrakeのバージョンよりも、インストールしているrakeのバージョンの方が新しくなってしまったのが原因のようだ。本来ならOctpressを新しいバージョンのrakeで動作するように修正すべきところなのだろうけど、rakeのコマンドラインオプションで使用するrakeのバージョンを指定することでも対応できる。下記のようにrakeのパラメータに「_10.5.0_」と必要なバージョンを指示すればよい。

$ rake _10.5.0_ generate

WSUSの管理コンソールに接続できない

「WSUS 管理コンソールは、リモート API 経由で WSUS サーバーに接続できませんでした。 」と表示されて、Windows System Update Service(WSUS)の管理コンソールに接続できなくなった場合の対処方法です。

表示だけの問題であれば「%appdata%\Microsoft\MMC\」の下にあるwsusファイルを削除することにより、コンソールの保存される設定を削除することで接続出来るようになります。もしIIS、SQL、および Update Servicesが停止している場合には、サーバー上でこれらのサービスを起動します。それでも接続出来ない場合、WSUSのデータベースが破損している可能性があります。

WSUSはSQLServerでデータを管理しています。この時に使われるSQLServerはOSの機能の一つとして組み込まれているため導入にあたって意識することはありません。OSがフリーズした場合など、SQLServerが正常にシャットダウンできなかった場合は、起動後にデータベースの自動復旧を試みます。自動復旧に極端に時間がかかっている場合や、自動復旧中にエラーが発生すると、WSUSの管理コンソールが応答しない状態になります。

SQLServer Management Studioをインストールして接続先に’\\.\pipe\MICROSOFT##WID\tsql\query’を指定するとWSUSが使用しているSQLServerに接続出来ます。SUSDBと言うインスタンスがWSUSのデータベースです。修復中の場合は気長に待って下さい。修復に失敗している場合には手動で修復を試みるか、WSUSのサービスを再インストールすることになります。ただ・・・現実問題として、DBCC CHECKDBで修復したとしても整合性が失われる可能性が高く、OSのバックアップがない場合にはWSUSサービスの再インストールが現実解になるかと思います。

WSUSのサービスを再インストール場合、通常ならばサーバーマネージャーの「役割と機能の削除」からWSUS関連サービスを削除した後、OSを再起動すれば済みます。ですがSQLServerのSUSDBが破損しているため、サーバーマネージャーから削除しただけではデータベースの削除に失敗します。WSUSサービスを削除した後に、SQLServer Management Studioからデータベースを強制的に削除してください。また合わせて「更新プログラムの格納場所」となっているフォルダも削除します。

その後、あらためて「役割と機能の追加」からWSUSを導入すると正常に動作するようになります。もちろん必然的にWSUSの諸設定は失われますので、再度設定し直すことになります。コンピューターも一切登録されていない状態に戻りますが、クライアントPC側で次回WindowsUpdateが実施されるタイミングで再び追加されるので、追加されるのを待つことになります。

Windowsの推奨パスワード長

http://ophcrack.sourceforge.net/tables.php
ふと、今ならどの程度の長さのパスワードが妥当なのかなと思い見てみた。

ophcrackは有名なWindowsのログインパスワード解析ソフトです。レインボーテーブルというデータベースを使用することで効率よくパスワードの解析を行い、ターゲットとなるWindowsのハードディスクを接続した状態で起動すると数分~数時間でパスワードを調べてくれます。

提供されているレインボーテーブルで一番大きな物は Vista_eightXLで$949で販売されています。このテーブルを使えばWindowsのログインパスワードで大文字、小文字、数字、記号 を使ったパスワードの場合、8文字までは、短時間で解析可能って事になります。つまり、大文字、小文字、数字、記号 を使った場合は、最低でも9文字以上のパスワードにしないと気休めにもならないことを意味します。

会社のグループポリシーとしてパスワードを定める場合も9文字で良いのかというと、そこは微妙なところです。大文字、小文字、数字、記号 を使った良くある(クラック用のパスワード辞書に載ってるような)パスワードの場合、12文字まで対応したレインボーテーブルが提供されているからです。グループポリシーで「 複雑さの要件を満たす必要がある」に設定したとしても、 大文字、小文字、数字、記号のうち3種類以上を使うことを要求するだけで、パスワード辞書に載っているようなパスワードを設定出来なくなるわけではありません。最低でも13文字以上のパスワードを義務づけないと容易にクラック出来るパスワードを使われる可能性を排除できない事になります。

でも現実問題として13文字以上で大文字、小文字、数字、記号を使ったパスワードを諳んじたり、頻繁に入力するのはかなり厳しいですよね。現実的なところで、多要素認証でのローカルログイン導入が必須となりつつあるって事かな。Windows10なら顔認証とか、スマホ連携とか標準で対応できるしね。

Windows Updateで繰り返しエラーコード80073701が発生する場合の対処法

Windows Updateで繰り返しエラーが発生する場合の対処法でも直らなかったので、続き・・・

と言うわけで様々な方法を試してみても回復せず。当初80070003だったエラーコードも、対応を続けている内に80073701に変わってしまい、相変わらずインストールできない。そこで、Windows Updateが出力するエラーログを解析して、対処方法の見当をつけることにする。

Windows Updateを実施したときのログはC:\Windows\Logs\CBS\CBS.logに保存されている。エラーが発生するとログファイルも異常に大きな物になっているため、普通にメモ帳では開けない可能性があるので注意。私の場合には1.2GBを超える巨大ファイルになっていた。このファイルの中から「日時, Error~」となっている場所を検索する。

2016-04-12 03:21:12, Error                 CSI    00000017@2016/4/11:18:21:12.414 (F) d:\win7sp1_gdr\base\wcp\componentstore\csd_locking.cpp(324): Error STATUS_SXS_ASSEMBLY_MISSING originated in function CCSDirectTransaction::LockComponent expression: (null)
[gle=0x80004005]
2016-04-12 03:29:39, Error                 CSI    00000018 (F) STATUS_SXS_ASSEMBLY_MISSING #520062# from CCSDirectTransaction::OperateEnding at index 0 of 1 operations, disposition 2[gle=0xd015000c]
2016-04-12 03:29:39, Error                 CSI    00000019 (F) HRESULT_FROM_WIN32(ERROR_SXS_ASSEMBLY_MISSING) #519947# from Windows::ServicingAPI::CCSITransaction::ICSITransaction_InstallDeployment(Flags = 0, a = fe9c22555b6f13ab7c014ac3462882cc, Version = 6.1.7601.18658, pA = PROCESSOR_ARCHITECTURE_INTEL (0), Culture neutral, VersionScope = 1 nonSxS, PublicKeyToken = {l:8 b:31bf3856ad364e35}, Type neutral, TypeName neutral, PublicKey neutral, cb = (null), s = (null), rid = [77]"Package_30_for_KB3011780~31bf3856ad364e35~x86~~6.1.1.5.3011780-85_neutral_GDR", rah = [2]"16", manpath = (null), catpath = (null), disp = 0)[gle=0x80073701]
2016-04-12 03:29:39, Info                  CBS    Failed to begin deployment installation for Update: 3011780-85_neutral_GDR [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]

ERROR_SXS_ASSEMBLY_MISSINGの発生している行を見ると「rid = [77]”Package_30_for_KB3011780~31bf3856ad364e35~x86~~6.1.1.5.3011780-85_neutral_GDR” 」となっており、KB3011780の依存関係を解決する過程でエラーになっていたことが分かる。

どうもKB3011780が正常にインストールできていないことが原因のようなので、「更新プログラムのアンインストール」からKB3011780を探してアンインストールする。KBKB3011780のアンインストール後にWindows Updateから更新プログラムの確認を行うと、先ほどまでエラーになっていた更新に加えてKB3011780もインストールすべきアップデートとして表示されるので、そのままWindows Updateを適用する。

私の場合は先ほどまでエラーになっていた15個に加えて、今アンインストールしたKB3011780を加えた16個が表示され、内13個のインストールに成功。残3個がエラーとなった。OSの再起動後にあらためてWindows Updateから更新プログラムの確認を行い、エラーとなった残3個のアップデートのインストールを試みる。・・・が、再びエラーコード80073701になってしまった。あらためてログファイルを確認する。さっきよりも大分小さい300MB程度になっている。

2016-04-12 12:58:22, Error                 CSI    0000001f@2016/4/12:03:58:22.544 (F) d:\win7sp1_gdr\base\wcp\componentstore\csd_locking.cpp(324): Error STATUS_SXS_ASSEMBLY_MISSING originated in function CCSDirectTransaction::LockComponent expression: (null)
[gle=0x80004005]
2016-04-12 12:58:23, Error                 CSI    00000020 (F) STATUS_SXS_ASSEMBLY_MISSING #31564# from CCSDirectTransaction::OperateEnding at index 0 of 1 operations, disposition 2[gle=0xd015000c]
2016-04-12 12:58:23, Error                 CSI    00000021 (F) HRESULT_FROM_WIN32(ERROR_SXS_ASSEMBLY_MISSING) #31449# from Windows::ServicingAPI::CCSITransaction::ICSITransaction_PinDeployment(Flags = 0, a = Microsoft-Windows-RemoteDesktopClient-WinIP-Deployment, Version = 7.2.7601.16415, pA = PROCESSOR_ARCHITECTURE_INTEL (0), Culture neutral, VersionScope = 1 nonSxS, PublicKeyToken = {l:8 b:31bf3856ad364e35}, Type neutral, TypeName neutral, PublicKey neutral, cb = (null), s = (null), rid = [118]"Microsoft-Windows-RemoteDesktopClient-BlueIP-Package~31bf3856ad364e35~x86~~7.2.7601.16415.RemoteDesktopClient81-BlueIP", rah = (null), manpath = (null), catpath = (null), ed = 0, disp = 0)[gle=0x80073701]
2016-04-12 12:58:23, Info                  CBS    Failed to pin deployment while resolving Update: RemoteDesktopClient81-BlueIP from file: (null) [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]
2016-04-12 12:58:23, Info                  CBS    Failed to resolve item[0] in Package: Microsoft-Windows-RemoteDesktopClient-BlueIP-Package~31bf3856ad364e35~x86~~7.2.7601.16415, Update: RemoteDesktopClient81-BlueIP [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]
2016-04-12 12:58:23, Info                  CBS    Failed to resolve execution update. [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]
2016-04-12 12:58:23, Error                 CBS    Failed to resolve execution package: Microsoft-Windows-RemoteDesktopClient-BlueIP-Package~31bf3856ad364e35~x86~~7.2.7601.16415 [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]
2016-04-12 12:58:23, Info                  CSI    00000022@2016/4/12:03:58:23.948 CSI Transaction @0x1738ce0 destroyed
2016-04-12 12:58:23, Info                  CBS    Perf: Resolve chain complete.
2016-04-12 12:58:23, Info                  CBS    Failed to resolve execution chain. [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]
2016-04-12 12:58:23, Error                 CBS    Failed to process single phase execution. [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]

今度は「rid = [118]”Microsoft-Windows-RemoteDesktopClient-BlueIP-Package~31bf3856ad364e35~x86~~7.2.7601.16415.RemoteDesktopClient81-BlueIP” 」とあります。どうもリモートデスクトップクライアントが正常にインストールできていないようです。RemoteDesktopClient81とあることから、Remote Desktop Client 8.0から8.1へのアップデートが上手く適用できていないと思われれます。KB2803477 Update for RemoteApp and Desktop Connections feature is available for Windowsを先ほどと同じ要領でアンインストールしてから、あらためてインストールし直します。

もういちどWindows Updateを実行した結果、ついに残りのエラーは1個になりました。
OSを再起動して、さらにもう一度Windows Update(何度か繰り返す)・・・・Complete!
全てのWindows Updateを無事に適用できました。

もしWindows Updateで修復不能なエラーに悩まされたなら、CBS.LOGをのぞいてみて下さい。

PS…
Windows 8.1またはWindows 10であれば次のようにdismコマンドで壊れた環境を修復できる場合があるようです。

> dism.exe /online /cleanup-image /restorehealth

残念ながらWindows7ではrestorehealtオプションがありません。エラーを報告はしてくれるが、修復はしてくれないので、手作業でアンインストール/インストールを繰り返す以外にありません。

Windows Updateで繰り返しエラーが発生する場合の対処法

WEBで検索するとWindows Updateで繰り返しエラーが発生する場合の様々な対処法を見つけられるが、特定のセキュリティパッチ限定の方法だったり、汎用性がなかったり、自身が遭遇している問題とは関係なかったりする。そのため適切な対処方法になかなか巡り会えずに、困っている人も多いのじゃないかと思う。

次の手順がおそらく最も汎用性があって、ほぼ確実に不具合を修復出来ると思う。

1. オフィシャルのトラブルシューティングガイドを使う

あいにくと英語のページしかありませんが「I got an error code from Windows Update」と言うページがあります。こちらでOSの種類とエラーコードを入力すると、それに対応した修復手順を案内してくれます。頻繁に情報もアップデートされているようで、これが最も確実な対処法になるとおもう。

2. それでもよく分からない場合は・・・

よく分からない場合には、最も汎用性が高いと思われる、次の手順をお勧めします。
次の操作は管理者権限を持つユーザーで行って下さい。

2.1. OSのシステムファイルを修復する

https://support.microsoft.com/ja-jp/kb/929833
コマンドプロンプトを右クリックして「管理者で実行」を選択します。
コマンドプロンプトが開いたら次のコマンドを実行します。
sfc /scannow
システムファイルの修復が終わったらOSを再起動します。

Windows Updateが異常中断したためにシステムファイルの整合性が壊れたのが原因の場合には、これで直るはずです。

2.2. Windows Updateのバージョンを更新する

https://support.microsoft.com/ja-jp/kb/949104
上のページから使用しているOSにあわせて最新のWindows Update Agentをダウンロードしてインストールします。
インストールが終わったらOSを再起動します。

Windows Updateのバージョンに起因する問題の場合は、これで直るはずです。

2.3. 自動解決ツールを利用する

https://support.microsoft.com/ja-jp/gp/windows-update-issues/
上のページの「更新プログラムのインストールで問題が発生する場合、どうすればよいですか。
」から「Windows Update のトラブルシューティング ツール」をクリックして「WindowsUpdateDiagnostic.diagcab」をダウンロードします。ウィザードに従って次へ次へと進んでいくと、自動的に問題を修復してくれます。
「最新の更新プログラムのインストールに関する問題」が[未解決]と表示されますが、これは未適用のWindowsUpdateがあると言う意味(WindowsUpdateに失敗しているのだから当たり前)なので気にしなくて良いです。
修復が終わったらOSを再起動します。

Windows Updateが作成する作業ファイルや、ダウンロードしたファイルの破損などに起因する問題は、これで直るはずです。

グループポリシーでPCにログインできるユーザーを制限するには

グループポリシーでコンピューターにログインできるユーザーを制限するには、グループポリシーの「コンピューターの構成→Windowsの設定→セキュリティの設定→ローカルポリシー→ユーザー権利の割当→ローカルログオンを許可」の設定を有効にします。

この設定を有効にすると各PCのログインを許可するユーザーグループが全て設定値に置き換えられます。通常は「Administrators、Backup Operators、Power Users、Users、Guest」の5つのユーザーグループが登録されています。このうち「Users、Guest」を除く「Administrators、Backup Operators、Power Users」に加えて、ログインを許可したいユーザーグループをログインを許可するユーザーグループとして登録します。

例えば「ほげ」というユーザーグループにアクセスを許可したい場合には、「Administrators、Backup Operators、Power Users、ほげ」の4つのユーザーグループを設定します。

誤って「Administrators」を設定に加え忘れると、管理者もログイン出来なくなるため非常に困ることになります。気をつけましょう。

locallogon

Windows7でWindows PowerShellからタスクを追加するには

Windows7でWindows PowerShellからタスクを追加するにはschtasks.exeを呼び出す以外にないらしい。

Windows PowerShellでタスクの設定を追加するにあたって、Scheduled Tasks Cmdletsを使いたかったのだけど、現状ではWindwos 8.1とWindows 2012 R2以降でしかサポートしません。

昔はWindows7でも後からインストールできた用で、PowerShell V2.0の場合はPowerShell Packをインストールすることで、PowerShell V3.0であれば標準でタスクスケジューラの制御の為のScheduledTask Cmdletを提供していたようです。現在ではPowerShell Packもダウンロード出来ません。最新のPowerShell V4.0ではWindows8.1以降かWindows 2012R2以降でなければScheduled Tasks Cmdletsをサポートしないので仕方ありませんね

コマンドプロンプトからWindowsUpdateを適用して再起動するには

WindowsUpdateを適用して再起動するコマンドは用意されていないが、InitiateShutdown APIを使用すればWindowsUpdateを適用して再起動するアプリケーションを作ることは容易に出来る。サーバーの運用では指定の時間にWindows Updateを適用して再起動する様な処理が必要になる事が多いが、このAPIを使用して自作したコマンドをタスクに登録しておけば良い。

以下がサンプルコード。

#include "stdafx.h"
#include <stdlib.h>
#include <Windows.h>
#include <winreg.h>

int wmain()
{
	// 引数文字列の解析
	DWORD	dwShutdownFlags = 0;
	bool	showHelp = false;
	LPTSTR	comment = NULL;
	for (int i = 0; i < __argc; i++)
	{
		if (0 == _tcsicmp(__targv[i], _T("/r")) || 0 == _tcsicmp(__targv[i], _T("-r")))
		{
			dwShutdownFlags |= SHUTDOWN_RESTART;
		}
		if (0 == _tcsicmp(__targv[i], _T("/s")) || 0 == _tcsicmp(__targv[i], _T("-s")))
		{
			dwShutdownFlags |= SHUTDOWN_POWEROFF;
		}
		if (0 == _tcsicmp(__targv[i], _T("/n")) || 0 == _tcsicmp(__targv[i], _T("-n")))
		{
			dwShutdownFlags |= SHUTDOWN_NOREBOOT;
		}
		if (0 == _tcsicmp(__targv[i], _T("/f")) || 0 == _tcsicmp(__targv[i], _T("-f")))
		{
			dwShutdownFlags |= SHUTDOWN_FORCE_OTHERS;
		}
		if (0 == _tcsicmp(__targv[i], _T("/u")) || 0 == _tcsicmp(__targv[i], _T("-u")))
		{
			dwShutdownFlags |= SHUTDOWN_INSTALL_UPDATES;
		}
		if (0 == _tcsicmp(__targv[i], _T("/m")) || 0 == _tcsicmp(__targv[i], _T("-m")))
		{
			i++;
			if (i < __argc)
				comment = __targv[i];
		}
		if (0 == _tcsicmp(__targv[i], _T("/h")) || 0 == _tcsicmp(__targv[i], _T("-h")))
		{
			showHelp = true;
		}
	}

	if (showHelp)
	{
		_tprintf(_T("/r : The computer is shut down and rebooted.\n"));
		_tprintf(_T("/s : The computer is shut down and powered down.\n"));
		_tprintf(_T("/n : The computer is shut down but is not powered down or rebooted.\n"));
		_tprintf(_T("/u : The computer installs any updates before starting the shutdown.\n"));
		_tprintf(_T("/f : All sessions are forcefully logged off.\n"));
	}
	else
	{
		HANDLE				hToken;
		TOKEN_PRIVILEGES	TokenPri;

		// プロセストークンを取得
		if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) == FALSE)
		{
			return GetLastError();
		}

		// シャットダウン権限の LUID を取得
		if (LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &TokenPri.Privileges[0].Luid) == FALSE)
		{
			return GetLastError();
		}

		// シャットダウン権限を与える
		TokenPri.PrivilegeCount = 1;
		TokenPri.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
		AdjustTokenPrivileges(hToken, FALSE, &TokenPri, 0, (PTOKEN_PRIVILEGES)NULL, 0);
		if (GetLastError() != ERROR_SUCCESS)
		{
			return GetLastError();
		}

		// Windows Updateを適用して再起動する
		DWORD errCode = ::InitiateShutdown(NULL, comment, 0, dwShutdownFlags, SHTDN_REASON_MINOR_OTHER);
		_tprintf(_T("InitiateShutdown Result Code = 0x%08X.\n"), errCode);
		return errCode;
	}

	return 0;
}

以下はバイナリ(実行ファイル)のダウンロード
InitiateShutdown_x32
InitiateShutdown_x64