6

MSIインストーラーを使用してWindowsフォームアプリケーション(C#、NET 3.5)をインストールしています。このアプリケーションには、押すと特定のURLでブラウザを開くボタンがあります。私が使う

Process.Start(url);

ブラウザを開きます。これはデバッグ時には問題なく機能しますが、インストール後は最適な結果が得られません。例えば。

  • Just Meオプションを選択してインストールすると、現在の設定でデフォルトのブラウザ(FF)が開きます。
  • [Everyone]オプションを指定してインストールした場合、ボタンを押すと、最近の設定(プロキシ、表示されたツールバーなど)がないバージョンのIEが開きます。

私の知る限り、この問題はインストール時にアプリケーションに関連付けられたユーザーが原因で発生します。

ユーザーがプロキシと個人用ブラウザの設定を必要とする可能性があること、およびJust Meを考慮に入れると、Everyoneの選択はユーザー次第である必要があります。アクションのベストコースは何ですか?

現在ログインしているユーザーでProcess.Start(url)を呼び出してみました

ProcessStartInfo.UserName = Environment.UserName

ただし、パスワードも必要であり、資格情報を要求することはできません。

他に何か提案はありますか、Process.Start()を誤って使用していますか、インストール中に行う必要のある設定はありますか、見逃したものはありますか?

更新: data_smithが提案したようにProcess Explorerを使用すると、次のことに気づきました。

  • Everyone用のアプリケーションをインストールすると、NT AUTHORITY \ SYSTEMユーザーの下で起動するため、未構成のブラウザーになります。
  • Just Meを選択してアプリケーションをインストールすると、現在のユーザーの下で起動します

クレデンシャルを要求せずに、すべてのユーザーにインストールされている場合でも、現在のユーザーの下で(Windowsの起動時に)アプリケーションを起動する方法はありますか?

更新: ShellExecuteを使用するためのdata_smithによる提案と、ここここでの提案に従って、問題を解決し、目的の動作を得ることができました。

主な問題は、インストーラーが終了すると、アプリケーションがProcess.Start()で開始されることでした。これにより、NT AUTHORITY \ SYSTEMユーザー(インストーラーが実行されるユーザー)としてアプリケーションが開始されたため、このアプリケーションによって開かれるすべてのブラウザーもSYSTEMユーザーの下にあります。data_smithからの提案と上記のリンクされた提案を使用することで、現在のユーザーの下でプロセスを開始することができました。

コンピュータが再起動された後、これはレジストリエントリを介して構成されているため、アプリケーションは正しいユーザーの下で起動します。

4

2 に答える 2

1

レジストリにアクセスして、デフォルトのブラウザを決定することをお勧めします。

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

このコードを使用してみたところ、レジストリキーが「-\ "%1\"」で終わっていることがわかりました。
なぜそこにあったのかわかりませんが、次のループを使用して、キーが正しい場所で終了するようにすることをお勧めします。

//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;
        }
    } 
}
于 2012-04-23T01:19:05.143 に答える
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);
    }
    }
}
于 2012-04-22T15:13:58.947 に答える