开始隐藏Internet Explorer

5
我的公司正在使用Sharepoint和ADFS。然而,为了使用WebDav,我们需要让用户获取一些令牌,他们只能通过打开Internet Explorer并导航到两个站点来获得。但是,他们将在大约30分钟后失去令牌,因此这必须是一个经常性的任务。
所以现在我的工作是:
  • 用IE打开2个网站
  • 每30分钟
  • 不要打扰用户
我的当前解决方案“有点”有效,但我并不真正满意。 我只有VSExpress,没有服务。
我有一个最小化的最大不透明度可见false Windows窗体。 我有一个GPO,它将一个EXE文件复制到计算机上,然后创建一个定时作业,在登录后每30分钟启动它。然而,这并不真正起作用,如果用户不手动运行EXE,则仍然会遇到访问webdav的问题。此外,每当EXE运行时,用户正在使用的当前应用程序就会失去焦点,这在您输入某些内容并且必须单击回来时有点烦人。 我的当前代码看起来像这样:
    private void Form1_Load(object sender, EventArgs e)
    {
        MainMethod();
    }
    private void MainMethod()
    {
        RegistryKey root = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Classes\InternetExplorer.ApplicationMedium\CLSID", false);
        if (root!=null)
        { 
            opensite();
            Application.Exit();
        }
    }
    private void opensite()
    {
        try
        {
            SHDocVw.InternetExplorer _ie1 = (SHDocVw.InternetExplorer)Activator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.ApplicationMedium"));
            SHDocVw.InternetExplorer _ie2 = (SHDocVw.InternetExplorer)Activator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.ApplicationMedium"));
            _ie1.Visible = false;
            _ie2.Visible = false;
            _ie1.Navigate("SITENAME1.html");
            _ie2.Navigate("SITENAME2.html");
            System.Threading.Thread.Sleep(10000);
            _ie1.Quit();
            _ie2.Quit();
        }
        catch(Exception e)
        {
        }
    }

然而,我认为有一种更加优雅的方法来实现这个。我听说打开隐藏的IE的唯一方法是通过

(SHDocVw.InternetExplorer)Activator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.ApplicationMedium"));

但是我依赖于注册表键,而并非所有客户端都有这个键。
你能帮我以一种可靠的方式打开IE吗?也许你有一些关于如何设置定期任务每30分钟启动的提示(因为我认为它目前没有正确执行)。
提前感谢大家。
编辑:
感谢https://stackoverflow.com/users/5065008/daniel-waghorn,现在我已经用以下代码替换了opensite的部分:
private void Form1_Load(object sender, EventArgs e)
    {
        MainMethod();
    }
    private void MainMethod()
    {
        openProc("SITE1.html");
        openProc("SITE2.html");
        Application.Exit();
    }

    private void openProc(string site)
    {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        string ProgramFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
        startInfo.FileName = ProgramFiles + @"\Internet Explorer\iexplore.exe";
        startInfo.Arguments = "" + site + "";
        startInfo.CreateNoWindow = true;
        startInfo.ErrorDialog = false;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        Process.Start(startInfo);
    }

再次感谢!

2个回答

3
您可以使用ProcessStartInfo来创建一个新的IE实例:
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = ""C:\Program Files\Internet Explorer\iexplore.exe"";
startInfo.Arguments = "" + url + "";
startInfo.CreateNoWindow = true;
startInfo.ErrorDialog = false;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(startInfo);

您可以使用Environment.SpecialFolder.ProgramFiles来获取用户的Program Files目录路径,如果您不想硬编码它。
我必须指出,startInfo.WindowStyle将启动Internet Explorer隐藏,尽管如果IE在任何时候决定出于任何原因更改该值,则可能会显示。
理想情况下,如果您没有被绑定使用Internet Explorer来获取令牌,另一种选择是使用上述代码但针对cURL或类似工具。这样它将在命令行中运行,您可以保证不会显示或窃取焦点,使用startInfo.CreateNoWindow即可。

这差不多是我想要的,但我仍然遇到麻烦。startInfo.FileName = @"%ProgramFiles%\Internet Explorer\iexplore.exe";他改成了 "%ProgramFiles%\\Internet Explorer\\iexplore.exe" 但是他找不到该文件。但是 @"C:\Program Files\Internet Explorer\iexplore.exe" 可以工作... - Asharon
1
很抱歉,看起来 ProcessStartInfo 无法正确解析环境变量,这就是为什么它不能正常工作但与您的版本一起工作的原因。如果您想要获取用户的程序文件夹,可以使用 Environment.SpecialFolder.ProgramFiles 并将其连接到您的 FileName 中。 - Daniel Waghorn
私有空白打开程序(string site) { ProcessStartInfo startInfo = new ProcessStartInfo(); string ProgramFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); startInfo.FileName = ProgramFiles + @"\Internet Explorer\iexplore.exe"; startInfo.Arguments = "" + site + ""; startInfo.CreateNoWindow = true; startInfo.ErrorDialog = false; startInfo.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(startInfo); } 非常好用,再次感谢! - Asharon

1

谢谢您的回复,我会查看您提到的帖子。 - Asharon
1
希望你能找到一些有用的东西 ;) - NickGames

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接