2012-04-20 13 views
6

Ho un'applicazione Windows Form (C#, NET 3.5) installata utilizzando un programma di installazione MSI. In questa applicazione ho un pulsante che quando premuto apre un browser con un URL specifico. Io usoC# Windows Forms non apre il browser predefinito dopo l'installazione

Process.Start(url); 

per aprire il browser. Funziona bene durante il debug, ma dopo l'installazione ha risultati non ottimali. Per esempio.

  • Se lo installo con le opzioni Just Me selezionate apro il mio browser predefinito (FF) predefinito con le impostazioni correnti.
  • Se lo installo con l'opzione Tutti, quando si preme il pulsante di si apre una versione di IE con una qualsiasi delle mie recenti impostazioni (proxy, le barre degli strumenti visualizzata etc)

Per quanto posso questo problema è causato dall'utente associato all'applicazione durante l'installazione.

Considerando che gli utenti possono richiedere i proxy e le impostazioni del browser personale e che la scelta di Just Me, Everyone deve rimanere all'utente. Qual è il miglior corso di azione?

Ho provato a chiamare Process.Start (URL) con l'attuale utente connesso utilizzando

ProcessStartInfo.UserName = Environment.UserName 

ma richiede anche una password e chiedere le credenziali non è un'opzione.

Avete altri suggerimenti, sto usando Process.Start() in modo errato, ci sono impostazioni che devo fare durante l'installazione, c'è qualcosa che mi è sfuggito?

UPDATE: Utilizzando Process Explorer come data_smith suggerito ho notato quanto segue:

  • Se installo l'applicazione per tutti inizierà sotto l'autorità \ utente SYSTEM NT quindi il browser non configurato.
  • Se installo l'applicazione con Just Me selezionato inizia sotto l'utente corrente

C'è un modo, senza chiedere le credenziali, per rendere l'inizio dell'applicazione (in fase di avvio di Windows) con l'utente corrente anche sebbene sia installato per tutti?

UPDATE: A seguito di un suggerimento di data_smith utilizzare ShellExecute ei suggerimenti here e here sono stato in grado di risolvere il problema e ottenere il comportamento desiderato.

Il problema principale era che quando l'installatore terminava l'applicazione veniva avviata con Process.Start(); Ciò ha avviato l'applicazione come utente di NT AUTHORITY \ SYSTEM (gli installatori degli utenti sono in esecuzione), pertanto tutti i browser aperti da questa applicazione si troverebbero anche in SYSTEM user. Utilizzando il suggerimento di data_smith e i suggerimenti collegati sopra, ho potuto avviare il processo con l'utente corrente.

Dopo il riavvio del computer, l'applicazione viene avviata con l'utente corretto poiché viene configurata tramite le voci del Registro di sistema.

+0

Eseguire l'applicazione dall'installatore? – ogggre

+0

Dopo l'installazione dell'applicazione, viene avviato immediatamente e viene sempre avviato all'avvio della macchina. Si trova nella barra delle applicazioni. – Constantin

+2

Penso che sia stato chiesto @ogggre, la tua applicazione è stata lanciata dall'installatore? Questo potrebbe essere un problema legato alle "credenziali". Usa ProcExp (da SysInternals) per vedere il genitore del tuo programma. – data

risposta

1

Si consiglia di accedere al Registro di sistema per determinare il browser predefinito.

//Create a registry key to read the default browser variable 
RegistryKey reader = Registry.ClassesRoot.OpenSubKey(@"http\shell\open\command"); 
//Determine the default browser 
string DefaultBrowser = (string)reader.GetValue(""); 

Ho provato ad utilizzare questo codice, e ha scoperto che la mia chiave di registro è conclusa con "- \" % 1 \ "".
Non so perché fosse lì, ma mi raccomando di usare il seguente loop per assicurarmi che la chiave finisca nel posto giusto.

//If the path starts with a ", it will end with a " 
if (DefaultBrowser[0] == '"') 
{ 
    for (int count = 1; count < DefaultBrowser.Length; count++) 
    { 
     if (DefaultBrowser[count] == '"') 
     { 
      DefaultBrowser = DefaultBrowser.Remove(count + 1); 
      count = DefaultBrowser.Length + 22; 
     } 
    } 
} 
//Otherwise, the path will end with a ' ' 
else 
{ 
    for (int count = 0; count < DefaultBrowser.Length; count++) 
    { 
     if (DefaultBrowser[count] == ' ') 
     { 
      DefaultBrowser = DefaultBrowser.Remove(count + 1); 
      count = DefaultBrowser.Length + 22; 
     } 
    } 
} 
+0

Come indicato nella domanda il problema non è trovare il browser predefinito, sta aprendo il browser come utente corrente. – Constantin

+0

"Se lo installo con l'opzione Everyone, quando premo il pulsante si apre una versione di IE senza alcuna delle mie impostazioni recenti (proxy, barre degli strumenti visualizzate ecc.)" - Secondo Constantin, il problema è chiaramente il trovare il browser predefinito associato all'utente corrente. – Jack

0
using System.Diagnostics; 
using System.Windows.Forms; 

namespace WindowsFormsApplication13 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, System.EventArgs e) 
    { 
     // Add a link to the LinkLabel. 
     LinkLabel.Link link = new LinkLabel.Link(); 
     link.LinkData = "http://www.dotnetperls.com/"; 
     linkLabel1.Links.Add(link); 
    } 

    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
    { 
     // Send the URL to the operating system. 
     Process.Start(e.Link.LinkData as string); 
    } 
    } 
} 
+1

Ho creato un'applicazione standalone che fa esattamente questo e si comporta come desiderato. Il problema sorge solo quando l'applicazione è in bundle con un programma di installazione e installata per tutti. – Constantin

Problemi correlati