runadmin.cs
using System;
using System.IO;
using System.Diagnostics;
using System.Security.Cryptography;
using System.Windows.Forms;
public class RunAdmin
{
//ハッシュ取得用メソッド
static string gethash(string strFilePath){
var fs = new FileStream(strFilePath, FileMode.Open, FileAccess.Read);
byte[] sha1byte = SHA1.Create().ComputeHash(fs);
string sha1string = BitConverter.ToString(sha1byte).Replace("-","").ToUpper();
return sha1string;
}
public static void Main(string[] args)
{
//自プログラムフォルダパス取得
string ExePath = System.Reflection.Assembly.GetEntryAssembly().Location;
//自プログラムフォルダ取得
string ExeDir = Path.GetDirectoryName(ExePath);
//対象プログラム
string TargetExe = "TestApp.exe";
//対象プログラムハッシュ
string TargetHash = "B20ECB788F4AAA98A62C5AE334B3C4EE6A26D013";
//string TargetArguments = "";
//引数なし(初回起動時)
if ( args.Length == 0 ){
Process p1 = new Process();
//別ユーザーとして自プログラムを実行
p1.StartInfo.FileName = ExePath;
p1.StartInfo.Arguments = "/runadmin";
//p.StartInfo.UserName = ""
//p.StartInfo.Domain = ""
//p.StartInfo.Password = ""
p1.StartInfo.UseShellExecute = false;
p1.Start();
p1.WaitForExit();
//引数runadmin指定(2回目起動時)
} else if( args[0] == "/runadmin" ) {
string hashresult = gethash(Path.Combine(ExeDir,TargetExe));
if ( hashresult == TargetHash){
Process p2 = new Process();
//別ユーザーとして起動されたので、対象のプログラムを管理者権限で実行
//対象のファイルのファイルハッシュチェック
//自分の実行フォルダパス
p2.StartInfo.FileName = TargetExe;
p2.StartInfo.UseShellExecute = true;
p2.StartInfo.Verb = "RunAs";
//引数が必要な場合に使用
//p.StartInfo.Arguments = TargetArguments;
p2.Start();
p2.WaitForExit();
}else{
//ハッシュが登録ずみでない
MessageBox.Show("ファイルハッシュが一致しません");
}
}
}
}