0

インストーラー プロジェクトを追加したプロジェクトがあります。私はこれに従っていました(カスタムインストーラー

カスタム インストーラー クラスを追加しました。これの目的の 1 つは、ユーザーがログインしたときに自動起動するようにプログラムをレジストリに追加することです。Visual Studio を管理者として実行しています (Visual Studio の一番上にあるように - 注: コンピューター管理では、私は管理者ではありません)。ただし、私のラップトップは powerbroker というアプリケーションも使用しています。アプリケーションをインストールするには、右クリックして [管理者特権で実行] を選択します。昇格して実行される他の投稿を読むことは管理者と同じではなく、そこにおそらく問題があります。

とにかく問題は次のとおりです。ビジュアルスタジオでは、キーを追加するためのエラーは生成されません(コードは正常に実行されます)(これをテストするために別のアプリケーションを作成しました。

インストーラーにコードを入れて昇格して実行すると、エラーはスローされず、キーも書き込まれません-少なくともエラーが発生してインストールがロールバックされた場合....

代わりに現在のユーザーのキーを設定しようとしましたが、それはうまく機能しますが、私には役に立ちません....

管理者のメンバーであり、アクセス権も持たないローカルユーザーも作成しました。

私が理解しようとしていることを要約すると、次のとおりです。レジストリの書き込みが失敗したというエラーをスローして、インストールをロールバックするにはどうすればよいですか (コードは現在、昇格された特権の下でエラーをスローしませんが、実際には機能しないことを思い出してください)

この問題の解決策はありますか?

ありがとうダモ

C# インストーラー クラス コード

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.Reflection;
using System.IO;
using Microsoft.Win32;



namespace OffLine.Installer
{
    // Taken from:http://msdn2.microsoft.com/en-us/library/
    // system.configuration.configurationmanager.aspx
    // Set 'RunInstaller' attribute to true.

    [RunInstaller(true)]
    public class InstallerClass : System.Configuration.Install.Installer
    {
        public InstallerClass()
            : base()
        {
            // Attach the 'Committed' event.
            this.Committed += new InstallEventHandler(MyInstaller_Committed);
            // Attach the 'Committing' event.
            this.Committing += new InstallEventHandler(MyInstaller_Committing);
        }

        // Event handler for 'Committing' event.
        private void MyInstaller_Committing(object sender, InstallEventArgs e)
        {
            // **** Beta Only **** Set program to autostart
            try
            {

                RegistryKey add = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);

                add.SetValue("FactoryAuditEventNotification", "\"" + Application.ExecutablePath.ToString() + "\"");

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());             

            }

        }

        // Event handler for 'Committed' event.
        private void MyInstaller_Committed(object sender, InstallEventArgs e)
        {
            try
            {
                Directory.SetCurrentDirectory(Path.GetDirectoryName
                (Assembly.GetExecutingAssembly().Location));
                Process.Start(Path.GetDirectoryName(
                  Assembly.GetExecutingAssembly().Location) + "\\FactoryAuditEventNotification.exe");
             }
            catch 
            {
                // Do nothing... 

            }
        }

        // Override the 'Install' method.
        public override void Install(IDictionary savedState)
        {
            base.Install(savedState);
        }

        // Override the 'Commit' method.
        public override void Commit(IDictionary savedState)
        {
            base.Commit(savedState);
        }

        // Override the 'Rollback' method.
        public override void Rollback(IDictionary savedState)
        {
            base.Rollback(savedState);
        }
    }
}
4

1 に答える 1

1

私はこれがあなたのケースだと思い
ます

確認方法
コメントで提案されているように、 ProcMon util を使用すると、リダイレクトの場合の主要な読み取り/書き込み操作の結果はREPARSEになります。

于 2012-12-29T18:40:27.707 に答える