2015-07-14 29 views
5

La mia azienda utilizza SharePoint e ADFS. Per l'utilizzo di WebDav, tuttavia, è necessario che gli utenti ottengano alcuni token che ottengono solo aprendo Internet Explorer e navigando verso due siti. Tuttavia, perderanno il token ogni ~ 30 minuti, quindi deve essere un compito ricorrente.Avvia Internet Explorer nascosto

Così ora il mio lavoro è quello di:

  • Aperte 2 siti web con IE
  • ogni 30 minuti
  • Non infastidire l'utente

La mia soluzione attuale è "un pò" lavorando ma non ne sono veramente soddisfatto. Ho solo VSExpress quindi nessun servizio.

Ho una falsa opaca minima visibile falsa Windows Form. Ho un oggetto Criteri di gruppo che copia un file EXE sul computer e quindi crea un lavoro a tempo che lo avvia ogni 30 minuti dopo il login. Tuttavia non sta funzionando, le persone hanno ancora problemi ad accedere a webdav se non eseguono manualmente l'EXE. . Inoltre ogni volta che il file EXE è in esecuzione l'applicazione corrente l'utente sta lavorando in perde il fuoco che è un pò fastidioso quando si sta digitando qualcosa e cliccare indietro nel mio codice attuale sta cercando in questo modo:

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) 
     { 
     } 
    } 

Tuttavia, Sento che c'è un modo molto più elegante per farlo. Ho sentito l'unico modo per aprire un IE nascosto è via

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

Ma con questo mi baso sulla chiave di registro che non tutti i clienti hanno.

Puoi aiutarmi ad aprire l'IE in modo affidabile e magari avere qualche suggerimento su come dovrei impostare l'attività ricorrente per iniziare ogni 30 minuti (perché penso che non stia facendo correttamente atm).

Grazie a tutti in anticipo.

EDIT:

Grazie a https://stackoverflow.com/users/5065008/daniel-waghorn io ora sostituito il bit opensite con:

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

Grazie ancora!

risposta

2

È possibile utilizzare ProcessStartInfo per creare una nuova istanza di Internet Explorer:

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); 

È possibile utilizzare Environment.SpecialFolder.ProgramFiles per ottenere il percorso di directory dei file di programma dell'utente se non si desidera hard-co de it.

Devo precisare che startInfo.WindowStyle avvierà Internet Explorer nascosto anche se in qualsiasi momento IE decide di modificare tale valore per qualsiasi motivo possa mostrare.

Idealmente se non si è vincolati all'utilizzo di Internet Explorer per ottenere i token un'altra alternativa sarebbe utilizzare il codice precedente ma target cURL o qualcosa di simile. Con questo verrà eseguito nella riga di comando che è possibile garantire di non mostrare o rubare lo stato attivo con startInfo.CreateNoWindow.

+0

Questo è un po 'quello che stavo cercando, tuttavia ho ancora dei problemi 'startInfo.FileName = @"% ProgramFiles% \ Internet Explorer \ iexplore.exe "; ' Lo sta creando a ' "% ProgramFiles% \\ Internet Explorer \\ iexplore.exe" ' Ma non riesce a trovare il file. Anche se '@" C: \ Programmi \ Internet Explorer \ iexplore.exe "' funziona ... – Asharon

+1

Spiacente sembra che 'ProcessStartInfo' non analizzi correttamente le variabili di ambiente quindi perché non funziona ma funziona con la tua versione. Puoi usare 'Environment.SpecialFolder.ProgramFiles' e concatenarlo nel tuo' NomeFile' per ottenere la cartella Programmi dell'utente, se lo desideri. –

+0

'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 = "" + sito + ""; startInfo.CreateNoWindow = true; startInfo.ErrorDialog = falso; startInfo.WindowStyle = ProcessWindowStyle.Hidden; Process.Start (startInfo); } Funziona come un incantesimo, grazie ancora! – Asharon