[.NET全般]Windows Vista上で.NETアプリケーションを管理者権限で実行させる方法
Windows Vistaでは、プログラムから管理者権限が必要な操作を行おうとしても、失敗したり、不具合が発生したりすることがあります。(※)
これを回避するには、マニフェストファイルと呼ばれるファイルを編集して、アプリケーションを管理者権限で実行出来るようにする必要があります。
この記事では、簡単なプログラムを作って、管理者権限が必要な操作を低い権限で実行した場合の動作、管理者権限でアプリケーションを実行できるようにする方法、及び、その実行結果を紹介します。
★プログラムの作成
管理者権限が必要な操作として、「時刻の変更」があります。
ここでは、コンピュータの時刻を変更する簡単なWindowsフォームアプリケーションを作成します。
・画面構成
・ソースコード(C#)
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.Win32; using System.Runtime.InteropServices;
namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
//using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)] public struct SystemTime { public ushort wYear; public ushort wMonth; public ushort wDayOfWeek; public ushort wDay; public ushort wHour; public ushort wMinute; public ushort wSecond; public ushort wMiliseconds; }
[DllImport("kernel32.dll")] public static extern bool SetLocalTime( ref SystemTime sysTime);
/// <summary> /// 現在のシステム日時を設定する /// </summary> /// <param name="dt">設定する日時</param> public static bool SetNowDateTime(DateTime dt) { //システム日時に設定する日時を指定する SystemTime sysTime = new SystemTime(); sysTime.wYear = (ushort)dt.Year; sysTime.wMonth = (ushort)dt.Month; sysTime.wDay = (ushort)dt.Day; sysTime.wHour = (ushort)dt.Hour; sysTime.wMinute = (ushort)dt.Minute; sysTime.wSecond = (ushort)dt.Second; sysTime.wMiliseconds = (ushort)dt.Millisecond; //システム日時を設定する return SetLocalTime(ref sysTime); }
private void Form1_Load(object sender, EventArgs e) { timer1.Enabled = true; }
private void button1_Click(object sender, EventArgs e) { label2.Text = SetNowDateTime(new DateTime(2005, 1, 2, 0, 0, 0)) ? "成功しました。" : "失敗しました。"; textBox1.Text = DateTime.Now.ToString(); }
private void timer1_Tick(object sender, EventArgs e) { textBox1.Text = DateTime.Now.ToString(); } } } |
★最初の実行結果
デフォルトの設定では、管理者権限より低い権限で実行されますので、システム時刻を変更しようとしても失敗します。
★管理者権限で実行出来るようにする方法
管理者権限で実行できるようにするには、マニフェストファイルを書き換える必要があります。
現在のプロジェクト設定を見てみると、「マニフェストを既定の設定で埋め込みます」となっています。プロジェクト設定から直接に権限の設定を変更することは出来ませんので、新しいマニフェストファイルを作成する必要があります。
まず、新しいマニフェストファイルを追加します。
ソリューションエクスプローラでプロジェクトを選択し右クリック、[追加]-[新しい項目]と選択します。[新しい項目の追加]ダイアログボックスが表示されます。
「アプリケーションマニフェストファイル」を選択し、追加します。
すると、XMLファイルが開かれます。
このファイルの一行を次のように書き換えて保存してください。(※2)
修正前:<requestedExecutionLevel level="asInvoker" uiAccess="false" />
修正後:<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
プロジェクトのプロパティを開いてみると、作成したマニフェストファイルが指定されているのが分かります。
これで、管理者権限で実行可能にする準備は整いました。
★設定変更後の実行結果
実行時に、UACの確認ダイアログが表示されるので「許可」を選択します。
先程は失敗した時刻変更の操作が成功するのが確認できます。(※3)
※これはユーザ自身が管理者としてログインしている場合も、です。管理者としてログインしていても、通常与えられる権限は限定されたものになります。管理者権限が必要な場合は権限の昇格(elevated privileges)が必要となります。
※2因みに、属性値の詳細。
asInvoker − アプリケーションは親プロセスと同じトークン(権限)で実行します。
highestAvailable − アプリケーションは現在のユーザが取得できる最も高い特権で実行します。
requireAdministrator − アプリケーションは管理者として実行され、管理者の完全なトークンで実行されることを要求します。
※3確認後は、http://www3.nict.go.jp/cgi-bin/JST.plなどで元の時刻に戻してください。
↓↓↓有用な記事だと思ったらクリックお願いします↓↓↓
« [WPF]ツールウィンドウ作成 その1 l Home l [Flash][解析]ニコニコ動画プレーヤーのソースコードを抜く方法 »


