我一直在尝试几个星期来从提升的过程运行非提升的web浏览器,我尝试了各种各样的东西,重复浏览器令牌,使用WinSafer Apis mentioned here和其他各种失败的技术。最后,我决定使用Microsoft建议的使用Task Scheduler来运行应用程序。从提升的过程中在非提升的浏览器中打开网页C#
我使用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的任务管理器中的Elevated列来确认。
这里唯一的细微差别就是浏览器没有作为最顶层的窗口启动,它在后台运行,我认为它与它通过任务调度程序运行的事实有关。
这会给我带来一些问题,特别是对于现代用户界面浏览器,因为当页面启动时,Windows不会切换到它们。例如,在Windows 8模式下运行时,我可以看到该页面已成功在Chrome中启动,但它不切换到浏览器的事实恰恰违背了此解决方法的全部用途。
我考虑过使用SetForegroundWindow
,但遗憾地运行上面的例子或通过explorer.exe的URL,Process.Start返回null
。
我想知道是否有人可以帮助我解决这个问题,并能够在前台运行浏览器。
问候