Запустите скрытый Internet Explorer

моя компания использует Sharepoint и ADFS. Однако для использования WebDav нам нужно, чтобы пользователи получили некоторые токены, которые они получают, только открыв Internet Explorer и перейдя на два сайта. Однако они будут терять токен каждые ~ 30 минут, поэтому это должно быть повторяющееся задание.

Итак, теперь моя работа состоит в том, чтобы:

  • Откройте 2 веб-сайта с помощью IE
  • каждые 30 минут
  • Не раздражайте пользователя

Мое текущее решение "вроде" работает, но я не очень им доволен. У меня есть только VSExpress, поэтому никаких служб.

У меня минимальная максимальная непрозрачность, видимая ложная форма Windows. У меня есть объект групповой политики, который копирует EXE-файл на компьютер, а затем создает задание по времени, которое запускает его каждые 30 минут после входа в систему. Однако на самом деле это не работает, у людей по-прежнему возникают проблемы с доступом к webdav, если они не запускают EXE вручную. Кроме того, всякий раз, когда 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);
    }

Спасибо еще раз!


person Asharon    schedule 14.07.2015    source источник


Ответы (2)


Вы можете использовать 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.

person Daniel Waghorn    schedule 14.07.2015
comment
Это как раз то, что я искал, однако я все еще сталкиваюсь с проблемой startInfo.FileName = @"%ProgramFiles%\Internet Explorer\iexplore.exe"; Он добирается до "%ProgramFiles%\\Internet Explorer\\iexplore.exe" Но не может найти файл. Хотя @"C:\Program Files\Internet Explorer\iexplore.exe" работает... - person Asharon; 14.07.2015
comment
Извините, похоже, что ProcessStartInfo неправильно анализирует переменные среды, поэтому он не работает, но работает с вашей версией. Вы можете использовать Environment.SpecialFolder.ProgramFiles и соединить его с FileName, чтобы получить папку Program Files пользователя, если хотите. - person Daniel Waghorn; 14.07.2015
comment
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); } Работает как шарм, еще раз спасибо! - person Asharon; 14.07.2015