昇格されていない Web ブラウザーを昇格されたプロセスから実行するために数週間試みてきました。ここで説明した WinSafer Apiやその他のさまざまな手法を使用して、エクスプローラー トークンを複製し、さまざまなことを試しましたが、すべて失敗しました。最後に、タスク スケジューラを使用してアプリケーションを実行するという Microsoft の提案を使用することにしました。
Task Scheduler Managed Wrapperを使用しました。最初は、explorer.exe を実行して URL をコマンドとして渡そうとしましたが、うまくいかなかったため、Process.Start を使用してサイトを起動するダミーの実行可能ファイルを作成しました。
タスクの作成方法は次のとおりです。
public static void LaunchWin8BrowserThroughTaskScheduler(string sURL)
{
String RunAsUserExecPath = AppDomain.CurrentDomain.BaseDirectory + "URLLaunch.exe";
String Command = string.Format("-w \"{0}\"", sURL);
using (TaskService ts = new TaskService())
{
TaskDefinition td = ts.NewTask();
td.RegistrationInfo.Description = "URL Launch";
td.Principal.LogonType = TaskLogonType.InteractiveToken;
TimeTrigger trigger = new TimeTrigger(DateTime.Now.AddSeconds(2))
{
Enabled = true,
EndBoundary = DateTime.Now.AddSeconds(10)
};
td.Triggers.Add(trigger);
td.Actions.Add(new ExecAction( RunAsUserExecPath, Command, null));
td.Settings.StartWhenAvailable = true;
//Delete the task after 30 secs
td.Settings.DeleteExpiredTaskAfter = new TimeSpan(0,0,0,30);
ts.RootFolder.RegisterTaskDefinition("URL Launch", td, TaskCreation.CreateOrUpdate, null, null, TaskLogonType.InteractiveToken);
}
}
そして、これは私のダミー実行可能ファイルのコードです:
static void Main(string[] args)
{
if(args.Length<=1)
return;
string sCmd = args[0];
string sArg = args[1];
if(string.IsNullOrEmpty(sCmd)||string.IsNullOrEmpty(sArg))
return;
switch (sCmd)
{
case "-w":
{
Process prs = Process.Start(sArg);
}
break;
}
}
このメソッドは機能しており、ブラウザーは実際に非昇格で起動されており、Windows 8 のタスク マネージャーで [昇格] 列を確認することで確認できました。
ここでの唯一のニュアンスは、ブラウザーが最上位のウィンドウとして起動されず、バックグラウンドで実行されていることです。これは、タスク スケジューラを介して実行されているという事実に関係していると思います。
これは、ページが起動されたときに Windows がモダン UI ブラウザーに切り替えないため、特にモダン UI ブラウザーで問題を引き起こしています。たとえば、Windows 8 モードで実行しているときに Chrome でページが正常に起動されていることがわかりますが、ブラウザーに切り替えられないという事実は、この回避策の目的全体に反するだけです。
使用することを考えましSetForegroundWindow
たが、悲しいことに上記の例のような URL を実行するか、explorer.exe を介して Process.Start を返しますnull
。
誰かがこれを修正して、ブラウザをフォアグラウンドで実行できるようにしてくれるかどうか疑問に思っていました.
よろしく