イベント ログ ファイルの形式

Windows Vista 以降のイベント ログは、拡張子 .evtx という新しいフォーマットになりました。
この変更により、従来のイベント ログ拡張子 .evt 形式の互換性ですが、保存はできず、読み込みだけが可能です。
ただし、WMI の API である BackupEventLog() をプログラムで実装することで、拡張子 .evt で保存することができます。
ここで拡張子 .evt について、一つ注意事項があります。
.evt 形式ですが、従来のイベントログ形式 (.evt) と Windows Vista 以降で API BackupEventLog() で作成した .evt は
同じ拡張子でも、フォーマット形式が異なります。

  1. 旧イベントログ フォーマット形式 (拡張子 .evt)
    Windows Server 2003 までの OS で使用していたイベントログ フォーマット形式
  2. レガシー イベントログ フォーマット形式 (拡張子 .evt)
    Windows Vista 以降の OS で BackupEventLog() を使い、出力したイベントログ フォーマット形式
    このイベントログは、Windows Server 2003 までの OS では正しく読み込めないので、
    Windows Vista 以降の OS で読み込む必要がある
  3. 新イベントログ フォーマット形式 (拡張子 .evtx)
    Windows Vista 以降の OS で採用されているイベントログ フォーマット形式

同じ拡張子で、フォーマットが異なるのは悩ましいところです。
なお、拡張子 .evt のフォーマットを .evtx に変換するには、イベントビューアーで .evt を開いて、.evtx で保存するか
wevtuil.exe というコマンドラインツールを使う方法があります。

例えば、wevtuil.exe を使うなら

wevtutil epl application.evt app_new.evtx /lf:true

という具合です。

なお、新イベントログ フォーマット形式 (拡張子 .evtx) を操作するには、新しい API セットがありますので
こちらを使うようにしましょう。

イベントログは奥が非常に深いです。

環境変数あれこれ

Windows の環境変数についてです。環境変数には、システム環境変数ユーザー環境変数の 2 種類があります。
これらは、レジストリの以下の場所に格納されています。

  • システム環境変数

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

  • ユーザー環境変数

HKCU\Environment

もちろん、画面でも表示できます。

システムのプロパティ 環境変数

レジストリに書きだしているわけですから、永続化された情報になります。

コマンドプロンプトを開き、set と入力しても環境変数を表示することができます。

コマンドプロンプト_setコマンド

ユーザーが Windows にログオンすると、シェルが起動され、環境変数を読み込みます。
その際、読み込む初期値が、このレジストリにエントリーされている値というわけです。

この投稿の続きを読む

開発コラムを公開

開発コラムというコンテンツを公開しました。

第 1 弾は、Windows Ribbon Framework についてのコラムになります。 2 回ものになります。

トップページにあるメニューからも辿れますので、ぜひ、お読みください。

Administrator 権限を持っているか確認したい(その2)

たまたま見つけてしまいました。

以前、「Administrator 権限を持っているか確認したい」という記事を書いたのですが、自分でコーディングしなくても
そのものずばりの API がありました…。

Windows 2000 から使えた API のようで、内部で同じことをやっていると思います。
あわわわ。。。

セキュリティプログラムの基本

セキュリティプログラム、特に、アクセス権の制御は、結構、使われることが多いのですが、あまりまとまっている書き物を
見たことが無いのでネタにします。
大体、セキュリティプログラムは面倒なことが多い割に、いまいちよくわかならないことが多いです。私だけか…
例えば、ファイルにアクセス権を付ける、ミューテックスにアクセス権を付ける、パイプにアクセス権を付けるとかです。
Windows では、セキュリティで保護できるオブジェクトは、例えば次のようなものがあります。

オブジェクト 作成するときに使う API
ディレクトリ CreateDirectory()
CreateDirectoryEx()
ファイル CreateFile()
イベントオブジェクト CreateEvent()
ミューテックスオブジェクト CreateMutex()
ファイルマッピングオブジェクト CreateFileMapping()
ジョブオブジェクト CreateJobObject()
ネットワーク共有オブジェクト NetShareAdd()
匿名パイプ CreatePipe()
名前付きパイプ CreateNamedPipe()
プロセスオブジェクト CreateProcess()
CreateProcessAsUser()
スレッドオブジェクト CreateThread()
CreateRemoteThread()
レジストリ RegCreateKeyEx()
セマフォオブジェクト CreateSemaphore()
アクセストークン DuplicateTokenEx()
デスクトップ CreateDesktop()
プリンター AddPrinter()

これらの API のパタメーターには SECURITY_ATTRIBUTES があります。これでセキュリティを制御しているのですが、
このパラメーターを作るのが、結構、面倒っちィわけです。

今回は、API の紹介は後にして、まずは、基本ステップの紹介です。

  1. SID リストを作成して、アクセス許可 ACE とアクセス拒否 ACE を準備する。
  2. セキィリティ記述子を作成して、初期化する。
  3. ACE を保持するための DACL を作成して初期化する。
  4. ACE を DACL に追加する。
  5. DACL をセキュリティ記述子に追加する。
  6. 新規セキュリティ記述子を使い、オブジェクトを作成する。
  7. 後処理を行う。

一つ一つの内容は、それなりの量になるので、また別の記事で書きます。
上記の流れが必要なんだということだけ、まずは知っておいてください。

IP アドレスの変更をチェックする

WER 記事の最中ですが、諸事情により、急きょ、割り込み別ネタです。

Windows で IPv4 アドレスがあった場合に、変更されたことを確認する方法を紹介します。
IP Helper API の NotifyAddrChange() という API を使います。

なんとも便利な API があったりするもんです。
例えば、サービスプログラムの起動方法を “自動” にしていて OS  起動時に動き出した場合を考えてみます。
OS 起動時、割り当てられた IP アドレスが実際に有効になるのは、かなり遅いタイミングになるかと思います。
なぜかというと、まず、Windows ファイアウォールが動いてからでないと、IP アドレスの割り当ては行われません。
では、Windows ファイアウォール はいつ動き出すのかというと、WMI(Windows Management Instrumentation)
サービスが動いた後です。
では、WMI はいつ動き出すのかというと…きりがないので、この辺にしておきます。

OS 起動時、まだ、IP アドレスが有効でない場合には、localhost 127.0.0.1 が割り当てられています。
このアドレスをプログラムが使っても意味ありませんので、通常は、IP アドレスが有効になるまで”待つ”ことになるはずです。
こんなシナリオで使えそうな方法を考えてみます。上記 NotifyAddrChange() のページにあるサンプルコードは一度きりの
実行なので、これを”待つ”状態にします。

この投稿の続きを読む

Windows SDK v7.1 がアップデートされました

Visual Studio 2010 SP1 のリリースに合わせて、既存の SDK v7.1 に対するアップデートがリリースされました。
Visual C++ Team Blog より

なお、VC++ ブログや readme にあるように、インストールには順番がありますので、注意が必要です。

  1. Visual Studio 2010
  2. Windows SDK 7.1
  3. Visual Studio 2010 SP1
  4. Visual C++ 2010 SP1 Compiler Update for the Windows SDK 7.1

SDKv7.1Update_Setup1SDKv7.1Update_Setup2

SDKv7.1Update_Setup3SDKv7.1Update_Setup4

インストール時間は1、2分です。
インストールが無事に終わると、スタートメニューの “Microsoft Windows SDK v7.1” に
”Visual C++ Compilers Update ReadMe” が追加されます。

LAN ケーブルは繋がっていますか?(Part.2)

前回からの続きです。
今回は、IP Helper の GetIfTable() を使って LAN ケーブルの接続状態を調べてみます。

ネットを探してみると、GetIfTable() の情報はたくさんあるので、今回は、GetIfTable2() を使ってみます。
あまり大差はないのですが…。

なお、GetIfTable2() は、Windows Vista 以降で使える API です。
まずは、GetIfTable2() で取得できる MIB_IF_TABLE2 構造体の Description メンバーだけを使ってアダプター情報だけ
を取得してみます。

すると…

GetIftable2_一覧

やっぱり、こんな結果になりました。IPv6 情報も取得できているようです。

この投稿の続きを読む

LAN ケーブルは繋がっていますか?(Part.1)

Windows 2000 以降、メディア検出機能というものが実装されています。
この機能は、ネットワークアダプターに LAN ケーブルが接続されているのか、接続されていないのかを検出する…

メディア検出

つまり、タスクトレイにあるネットワークアイコンに表示されているのは、メディア検出機能?

この機能ですが、上記 KB にあるようにレジストリで OFF にすることができます。

HKLM\System\CurrentControlSet\Services\Tcpip\Parameters

ここに、DWORD で DisableDHCPMediaSense というエントリーを作成します。
値を 1 にすると、メディア検出機能を OFF に、0 にすると ON(デフォルト)にすることができます。
(設定変更後は再起動要) もちろん、上記は Vista 以降の OS でも有効な情報です。

では、メディア検出機能を無効にしてから、LAN ケーブルを抜いてみると…
タスクトレイのアイコンにはバツマークが表示され、ケーブルが繋がっていないことがわかります。
タスクトレイのネットワークアイコンは、メディア検出機能 ON/OFF の影響は受けないようです。

実際のところ、メディア検出機能の中心はネットワークアダプターにバインドされている TCP/IP プロトコルレイヤー
自体の動作になっています。メディア検出機能 が ON になっているときに、LAN ケーブルを 抜いてしまうと、
リンク状態は OFF になり、ネットワークアダプターにバインドされている TCP/IP プロトコルレイヤーがアンロードされ、
IP アドレスが 0.0.0.0 になってしまいます。
OFF の状態だと、リンク状態はそのまま、つまり、TCP/IP プロトコルレイヤーがそのままの状態になっているので
IP アドレスもそのままの状態です。

この投稿の続きを読む