几周以来,我一直在尝试从提升的进程运行非提升的网络浏览器,我尝试了各种方法,复制资源管理器令牌,使用此处提到的 WinSafer API以及其他各种失败的技术。最后我决定使用微软的使用任务计划程序来运行应用程序的建议。
我使用了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 任务管理器中的提升列来确认这一点。
这里唯一的细微差别是浏览器没有作为最顶部的窗口启动,它在后台运行,我认为这与它通过任务调度程序运行的事实有关。
这给我带来了问题,尤其是现代 UI 浏览器,因为在启动页面时 Windows 不会切换到它们。我可以看到该页面已在 Chrome 中成功启动,例如,在 Windows 8 模式下运行时,但它没有切换到浏览器这一事实违背了此解决方法的全部目的。
我考虑过使用SetForegroundWindow
但遗憾的是运行一个 URL,如上面的示例或通过 explorer.exe,Process.Start 返回null
。
我想知道是否有人可以帮助我解决这个问题并能够在前台运行浏览器。
问候