C#

C# イベントログに出力するには?(管理者に昇格させる)

.NETのプログラムから、System.Diagnostics.EventLogクラスを使うことでWindowsのイベントログにログを取得・出力することができます。

 

イベントログを取得するプログラム

下記のようなコードになります。

static void Main(string[] args)
{
    string logName = "Application";
    string machineName = ".";
    EventLog log = new EventLog(logName, machineName);
    StringBuilder sb = new StringBuilder();

    foreach (EventLogEntry entry in log.Entries)
    {
        sb.Length = 0;
        sb.Append("Type = ");
        sb.Append(entry.EntryType);
        sb.Append(" Source = ");
        sb.Append(entry.Source);
        sb.Append(" Time = ");
        sb.Append(entry.TimeGenerated);
        Console.WriteLine(sb.ToString());
    }
    Console.ReadLine();
}

 

ビルドして、実行するとイベントログがコンソールに表示されます。

 

イベントログを出力するプログラム

同じく、下記のようにちょっとしたコードを書けばいいだけ・・・のはずが

 

static void Main(string[] args)
{
    try
    {
        if (!EventLog.SourceExists("MySource"))
        {
            EventLog.CreateEventSource("MySource", "Application");
        }
        EventLog log = new EventLog();
        log.Source = "MySource";
        log.WriteEntry("Testing");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

 

ビルドして、そのまま実行しても’System.Security.SecurityException’という例外が発生してイベントログに出力できません。

 

ところが

このビルドしたプログラム(exeファイル)を右クリックしてから「管理者として実行」で実行すると、そのままイベントログに出力できます。

これは、マイクロソフトのサイトにもこう書かれています。

 

「Windows Vista 以降のユーザーアカウント制御 (UAC) が有効になっている OS で管理者権限を持たないアカウント、あるいは [管理者として実行] しない場合、SecurityException が発生します。回避するには実行ファイルを [管理者として実行] する、アプリケーション マニフェストを設定し、アプリケーションの実行時に管理者権限への昇格プロンプトを表示させる方法があります。」

 

という機能によるもので、この

アプリケーション マニフェストを設定し、アプリケーションの実行時に管理者権限への昇格プロンプトを表示させる

ことで管理者権限への昇格を行う必要性があります。

 

アプリケーションマニフェスト

Visual Studioを使用している場合、このプロジェクトに「アプリケーションマニフェスト」と呼ばれるファイルを追加します。

  1. プロジェクトを選択して右クリック
  2. [追加]メニューをクリック
  3. [新しい項目…]をクリック
  4. 「Visual C#アイテム」の「全般」の中にある”アプリケーションマニフェストファイル”を選択
  5. [追加]ボタンを押します。

関係個所だけ抜粋しました。

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- UAC マニフェスト オプション
             Windows のユーザー アカウント制御のレベルを変更するには、
             requestedExecutionLevel ノードを以下のいずれかで置換します。

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            requestedExecutionLevel 要素を指定すると、ファイルおよびレジストリの仮想化が無効にされます。
            アプリケーションが下位互換性を保つためにこの仮想化を要求する場合、この要素を
            削除します。
        -->
        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>

<!-- ファイルは続きます -->

 

この中にある”requestedExecutionLevel”タグ(19行目付近)のlevel属性の値を”asInvoker”から”requireAdministrator”に変更するだけです。

変更後、ビルドするとexeファイルに盾マークもつけてくれます。

ビルドして実行すると下記のような画面が出ます。

 

「異なる資格情報で再起動」を選ぶとVisual Studioが再起動して、管理者として実行できるようになります。

 

気を付けてほしいこと

この「異なる資格情報で再起動」をするとVisual Studioで実行している分には、普通に見えますが、ビルドしたexeファイルで実行するときは、「ユーザーアカウント制御(UAC)のダイアログ」は表示されます。

 

タイトルとURLをコピーしました