2015-07-14 2 views
5

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

Так что теперь моя работа заключается в следующем:

  • Open 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 минут (потому что я думаю, что это не делает это правильно atm).

Благодарим вас заблаговременно.

EDIT:

Благодаря 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

Вы можете использовать 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, чтобы получить путь к каталогу программных файлов пользователя, если вы не хотите использовать жесткий диск это.

Я должен указать, что startInfo.WindowStyle запустит Internet Explorer, но если в любой момент IE решит изменить это значение по любой причине, он может показать.

В идеале, если вы не привязаны к использованию Internet Explorer для получения токенов, другой альтернативой было бы использование вышеуказанного кода, но цель cURL или что-то подобное. При этом он будет запускаться в командной строке, которую вы можете гарантировать, чтобы не показывать или украсть фокус с помощью startInfo.CreateNoWindow.

+0

Это своего рода то, что я искал, однако я все еще сталкиваюсь с проблемами 'startInfo.FileName = @"% ProgramFiles% \ Internet Explorer \ iexplore.exe "; ' Он делает это ' '% ProgramFiles% \\ Internet Explorer \\ iexplore.exe" ' Но он не может найти файл. Хотя '@" C: \ Program Files \ Internet Explorer \ iexplore.exe "' works ... – Asharon

+1

Извините, похоже, что 'ProcessStartInfo' не анализирует переменные среды правильно, поэтому почему это не работает но работает с вашей версией. Вы можете использовать 'Environment.SpecialFolder.ProgramFiles' и объединить его в свое' FileName', чтобы получить папку Program Files пользователя, если хотите. –

+0

'private void openProc (строка сайта) { ProcessStartInfo startInfo = new ProcessStartInfo(); string ProgramFiles = Environment.GetFolderPath (Environment.SpecialFolder.ProgramFiles); startInfo.FileName = ProgramFiles + @ "\ Internet Explorer \ iexplore.exe"; startInfo.Arguments = "" + сайт + ""; startInfo.CreateNoWindow = true; startInfo.ErrorDialog = false; startInfo.WindowStyle = ProcessWindowStyle.Hidden; Process.Start (startInfo); } ' Работает как очарование, еще раз спасибо! – Asharon

Смежные вопросы