コマンドプロンプトから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

JPEGファイルに機密データを埋め込むツールを作ろう・・・って、おぃ

仕事に役立つJavaScript入門:JPEGファイルに機密データを埋め込むツールを作ろう

それ、役に立てちゃ駄目なやつじゃ・・・

というのはさておき、セキュリティを守る側としては「大抵のデータ形式は目に見えない部分に別の情報を保持できるよ」って事は知っておこう。例えばPNGは補助チャンクに任意のデータを埋め込むことが出来るし、xlsxやdocxは拡張子をzipに変換した後に開いて中のXMLファイルに任意のコメントを入れることも出来ます(一端開いて上書き保存すると消えちゃうけど・・・)。

Traffic ServerでWordPressを高速化した結果

Traffic ServerでWORDPRESSを高速化するでWordPressの高速化を実施したのだけど、その前後で20%近くPVが増えていてちょっとびっくりした。月間2200PV程度しかない個人サイトだけど、今月は2600PVぐらいになりそう。
コンテンツの内容だけではなく、サーバーの質(応答速度とか)でランクを制御していると見聞きするけど、本当なんだと実感した次第。
最近は電子証明書も無料で使える所が出てきたいので、近いうちにSSLに対応したいと思います。SSL対応有無も検索ランクに影響すると聞いているので、またPVの変動として観測できるかな。

「内部不正による情報セキュリティインシデント実態調査」報告書

IPAによる「内部不正による情報セキュリティインシデント実態調査」を読んだ。悲しいかな、予測の範囲を出ない実態があらためて報告されたように感じる。以下、考えたところを纏めておく。

内部不正の81%は悪意の無い物

内部不正の81%は悪意の無い物だというのが重要。「 ルールを知っていたが、うっかり違反した」「 ルールを知らずに違反した 」「 業務が忙しく、終わらせるために持ち出す 必要があった」「 ルールはあったが、ルール違反を繰り返 している人がいたので、自分もやった」は悪意によるものではない。

・USBメモリの使用やメールへの添付など特定の行為を禁止するなら、ルールを定めるだけではなく、使用不可能にすることが重要。
・仮に使用不可能にすることが出来ないなら、ルール違反には速やかに警告できるように監視体制を構築することが必要。

この二つが実施できていれば、81%については従業員も重大な処分を受けることはないし、会社も損失を被ることは無かったはずだ。正直にいって会社側の責任が大きいと思う。

枝葉の対策に捕らわれずに、業務全体を見直す

悪意を持たない不正の中に「 業務が忙しく、終わらせるために持ち出す 必要があった」と「 ルールはあったが、ルール違反を繰り返 している人がいたので、自分もやった」を合わせて23%ある。業務全体を見直して実施の可否や、その影響範囲、業務手順の変更を同時に行ってないと得てしてそうなる。USBメモリなどの保存して自宅へ持ち帰ることを禁止するのは簡単に思えますが、同時に全業務の棚卸しを行い特定の個人しか実施できない業務がなく、必要なら同僚が何時でも代行できる体制でなければ、業務を遂行するためには持ち帰らざる得ないと考えるのがどおりです。他にも自宅から取引先に直行直帰というわけに行かなくなれば、取引先への訪問に使える時間は減ります。単純に持ち出し禁止とするのではなく、従業員の業務負担を減らすための業務見直しや、サテライトオフィスやテレワークなど代替処置を含めて考えないと、すぐに綻びることになります。

安易に例外を認めない

上長の許可を取れば可能とか、申請をすれば可能とか、安易な例外処置を認めてはいけません。許可申請を行うのが常態化し、本来必要な業務の見直しや代替処置の検討を先送りすることになります。もし例外を認めるなら委員会や役員の許可を得て、特定の業務に対して、業務見直しの期限を設けて許可を与える必要があるでしょう。さもなければ申請を出すのが通常業務の一部とかし、有効性を失いっていきます。

悪意のある内部不正は・・・

禁止事項を設けるだけで防ぐことは不可能です。USBメモリの使用を禁止すればメールで、添付メールを禁止すればWEBで、WEBを禁止すれば紙で、紙迄禁止したら業務にならないのは目に見えています。以下のようなことが必要になります。
・各従業員の行っている業務を明確にし、業務上必要の無い資料の閲覧を禁止する。
・閲覧の許された資料についても閲覧記録を常に監視し、網羅するような閲覧には警告をする。

「Windowsの機能の有効化または無効化」を行うには・・・

Windows7以降のOSで、グループポリシーやバッチファイル等から「Windowsの機能の有効化または無効化」を行うには、DISMコマンドを使用します。DISMコマンドはWindows自動インストールキット(Windows AIK)という、Windowsを多数のPCに導入するための支援ツールの一つです。Windowsのインストール支援ツールはOSのメジャーバージョンが変わる度に大きな変更が加えられるのが常ですが、DISMコマンド自体はWindows7以降はWindows 10でも後方互換性は維持されているようです。

現在有効化または無効化されている機能の一覧を得るには以下のコマンドを実行します。

dism  /online /Get-Features

特定の機能を有効化するには以下のコマンドを実行します。

dism /online /Enable-Feature /FeatureName:[機能名]

特定の機能を無効化するには以下のコマンドを実行します。

dism /online /Disable-Feature /FeatureName:[機能名]

以下のように機能名を指定すれば、特定機能について有効化されているか取得できますが、%ERRORLEVEL%の値としては取得出来ないようです。

dism  /online /Get-Features /FeatureName:[機能名]

また依存関係を自動では解決してくれません。機能Bを有効化するために、機能Aが必要となる場合には、以下のように依存関係を意識して順番に有効化する必要があります。

dism /online /Enable-Feature /FeatureName:[機能A]
dism /online /Enable-Feature /FeatureName:[機能B]