【问题标题】:Start hidden Internet Explorer启动隐藏的 Internet Explorer
【发布时间】:2015-07-14 09:07:51
【问题描述】:

我的公司正在使用 Sharepoint 和 ADFS。然而,对于 WebDav 的使用,我们需要用户获得一些他们只能通过打开 Internet Explorer 并导航到两个站点才能获得的令牌。然而,他们每 30 分钟就会丢失一次令牌,所以它必须是一个重复的任务。

所以现在我的工作是:

  • 用 IE 打开 2 个网站
  • 每 30 分钟一次
  • 不要惹恼用户

我目前的解决方案是“有点”工作,但我对它并不满意。 我只有 VSExpress,所以没有服务。

我有一个最小化的最大不透明度可见的虚假 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 分钟启动一次的提示(因为我认为它在 atm 中没有正确执行)。

提前谢谢大家。

编辑:

感谢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);
    }

再次感谢!

【问题讨论】:

    标签: c# internet-explorer scheduled-tasks gpo


    【解决方案1】:

    你可以使用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" 有效...
    • 抱歉,ProcessStartInfo 似乎没有正确解析环境变量,因此为什么它不起作用但适用于您的版本。如果需要,您可以使用 Environment.SpecialFolder.ProgramFiles 并将其连接到您的 FileName 以获取用户的 Program Files 文件夹。
    • 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】:

    【讨论】:

    • 谢谢你的回复,我会检查你提到的帖子。
    • 我希望你能找到一些你可以使用的东西;)
    猜你喜欢
    • 2020-02-12
    • 1970-01-01
    • 2010-12-06
    • 2011-09-21
    • 2012-10-08
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多