2012-04-20 17 views
6

Mam aplikację Windows Forms (C#, NET 3.5) zainstalowaną przy użyciu instalatora MSI. W tej aplikacji mam przycisk, który po naciśnięciu otwiera przeglądarkę z określonym adresem URL. UżywamC# Windows Forms nie otwiera domyślnej przeglądarki po instalacji

Process.Start(url); 

, aby otworzyć przeglądarkę. To działa dobrze podczas debugowania, ale po instalacji ma mniej niż optymalne wyniki. Na przykład.

  • Gdybym go zainstalować z opcji Tylko ja wybranych i otwiera domyślną przeglądarkę (FF) z aktualnymi ustawieniami.
  • Jeśli mogę zainstalować go z opcją Wszyscy, po naciśnięciu przycisku otwiera wersję IE z żadnej z moich ostatnich ustawień (proxy, paski narzędzi wyświetlane etc)

O ile mogę powiedz, że ten problem jest spowodowany przez użytkownika skojarzonego z aplikacją podczas instalacji.

Biorąc pod uwagę to, że użytkownicy mogą wymagać serwerów proxy i ustawień osobistych przeglądarki, a wybór "Tylko dla mnie" powinien pozostać dla użytkownika. Jaki jest najlepszy kurs akcji?

Próbowałem nazywając Process.Start (URL) z obecnym zalogowanego użytkownika za pomocą

ProcessStartInfo.UserName = Environment.UserName 

Ale to także wymaga podania hasła i prosząc o poświadczenia nie jest rozwiązaniem.

Czy masz inne sugestie, czy używam Process.Start() niepoprawnie, czy są jakieś ustawienia, które muszę wprowadzić podczas instalacji, czy jest coś, co przegapiłem?

UPDATE: Korzystanie Process Explorer jako data_smith zasugerował zauważyłem następujące:

  • Gdybym zainstalować aplikację dla każdego rozpocznie pod NT AUTHORITY \ użytkownik SYSTEM stąd nieskonfigurowanym przeglądarce.
  • Jeśli mogę zainstalować aplikacji z Just Me wybrany zaczyna pod bieżącego użytkownika

Czy istnieje sposób, nie pytając o poświadczenia, aby uruchomić aplikacji (przy rozruchu systemu Windows) w ramach bieżącego użytkownika nawet choć jest on zainstalowany dla wszystkich?

UPDATE: Po sugestii data_smith korzystania ShellExecute i sugestie here i here udało mi się rozwiązać ten problem i uzyskać pożądane zachowanie.

Głównym problemem było to, że po zakończeniu instalacji aplikacja została uruchomiona za pomocą metody Process.Start(); Ta aplikacja została uruchomiona jako użytkownik NT AUTHORITY \ SYSTEM (instalatorzy użytkowników działają pod kontrolą), dlatego wszystkie przeglądarki otwarte przez tę aplikację będą również pod użytkownikiem SYSTEM. Korzystając z sugestii od data_smith i sugestii związanych powyżej, byłem w stanie uruchomić proces pod bieżącym użytkownikiem.

Po ponownym uruchomieniu komputera aplikacja uruchamia się pod prawidłowym użytkownikiem, ponieważ jest ona konfigurowana poprzez wpisy rejestru.

+0

Czy uruchamiasz aplikację z poziomu instalatora? – ogggre

+0

Po zainstalowaniu aplikacji rozpoczyna się natychmiast i zawsze rozpoczyna się przy starcie maszyny. Znajduje się w zasobniku systemowym. – Constantin

+2

Myślę, że to, co @ogggre zapytał, czy Twoja aplikacja została uruchomiona przez instalatora? Może to być problem związany z poświadczeniami. Użyj ProcExp (by SysInternals), aby zobaczyć program macierzysty. – data

Odpowiedz

1

Zalecam uzyskanie dostępu do rejestru w celu ustalenia domyślnej przeglądarki.

//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(""); 

Próbowałem użyć tego kodu i odkryłem, że mój klucz rejestru zakończył się "- \"% 1 \ "".
Nie wiem, dlaczego tak było, ale zalecam użycie następującej pętli, aby upewnić się, że klucz kończy się we właściwym miejscu.

//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

Jak stwierdzono w pytaniu, problem nie polega na znalezieniu domyślnej przeglądarki, lecz otwiera przeglądarkę jako bieżącego użytkownika. – Constantin

+0

"Jeśli zainstaluję go z opcją Wszyscy, po naciśnięciu przycisku otwiera się wersja IE bez żadnego z moich ostatnich ustawień (proxy, paski narzędzi itp.)" - Zgodnie z tym, Constantin, problem wyraźnie polega na znalezieniu domyślna przeglądarka powiązana z bieżącym użytkownikiem. – 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

Zrobiłem samodzielną aplikację, która robi dokładnie to i zachowuje się zgodnie z oczekiwaniami. Problem pojawia się tylko wtedy, gdy aplikacja jest dołączona do instalatora i zainstalowana dla wszystkich. – Constantin

Powiązane problemy