2

Visual Studio 2005 に組み込まれている MSI ビルダーを使用する C# アプリケーションがあります。

MSI を使用して (CD 経由で) アプリケーションをターゲット コンピューターに展開した後、(特権ユーザーとして) デスクトップ ショートカットを起動すると、プログラムが期待どおりに実行されます。しかし、ログアウトしてから特権のないユーザーとして再度ログインしてアプリケーションを実行しようとすると、コンピューターは MSI を修正/構成する必要があるため、MSI の検索を開始します。もちろん、MSI が再び見つからないため、これは失敗します。

ただし、Program Files 内のアプリケーションのフォルダを参照し、ショートカットをデスクトップにコピーして、まったく問題なく実行できます。

どうすればこれを回避できますか? 運がなければこれを回避しようとして、多くの設定を変更しました。

編集: InstallAllUsers=True が設定されています。

4

5 に答える 5

6

ここで説明するように、Visual Studioは、MSIファイルを使用してすべてのファイルとレジストリ値が存在することを確認する「アドバタイズされたショートカット」のみを作成できます。

同じリンクで解決策を見つけることができます。MSIデータベースを編集して、プロパティテーブルに値を追加します。テストしました。値が「1」の「 DISABLEADVTSHORTCUTS 」を追加するだけです。

これを追加するには、 WindowsインストーラSDKの一部であるORCAツールを使用できます。これは手動の方法です...そして私はあなたがそれを気に入らないと思います。

そこでさらに調べてみると、Window Installer SDKが提供するコマンドラインとVBSスクリプトを使用して、これを実行できることがわかりました。

Cscript WiRunSQL.vbs Test.msi "INSERT INTO `Property` (`Property`.`Property`,`Property`.`Value`) VALUES ('DISABLEADVTSHORTCUTS',1)"

このスクリプトを実行するには、セットアッププロジェクトのビルド後のイベントを設定する必要があります(「通常の」プロジェクトとは少し異なります。ここを参照してください)。

それは私にとって非常にうまくいきます!

追加リソース:
MSIプロパティテーブルリファレンス
コマンドラインでMSIを編集

于 2009-07-22T15:37:00.380 に答える
0

2010年6月の編集:私が作成したMSIは、WindowsXPのVS2005でした。同じMSIを使用してVistaでインストール/アンインストールしようとしたとき、アンインストールはあまりクリーンではありませんでした。範囲や原因を評価していませんが、さらに調査せずにVistaでこのソ​​リューションを使用することはお勧めしません。

元の投稿:

回避策(少しのハック)は私の目的には十分に機能しますが、問題の実際の解決策はまだ見つかりません。私は他のサイトで提案を見つけました(私が再びそれを見つけることができるならば、私はそれへのリンクを投稿します)。

2つの機能を持つVBSファイルを作成しました。1つはショートカットを作成し、もう1つは必要に応じてディレクトリ構造を作成します。ファイルが実行されると、開発者が適切と考える回数だけMakeShortcutが呼び出されます。

2番目のVBSファイルも同じように機能しますが、ショートカットが削除されます。

インストールフォルダーのカスタムアクション([セットアッププロジェクト]、[表示]、[カスタムアクション]を右クリック)の一部として最初のファイルを呼び出します。アンインストールフォルダの2番目を呼び出します。

問題は、2つのVBSファイルがプログラムの残りの部分と同様にターゲットディレクトリにインストールされることです。それらを取り除く方法はおそらくありますが、私はそれらがそこにとどまるのを本当に気にしません。繰り返しになりますが、これはちょっとしたハックであり、私が望んでいたほどエレガントではありませんが、より良い解決策が見つかるまでは十分に機能します。

誰かがそれらを使用したい場合に備えて、2つのファイルを次に示します。

'CREATE SHORTCUTS.VBS

MakeShortcut "%AllUsersProfile%\Start Menu\Programs\My Prog Folder", _
             "My Prog", _
             "%ProgramFiles%\My prog\prog.exe"


Function MakeShortcut (location, text, target)

    Dim objShortcut
    Dim objShell
    Dim expLocation

    Set objShell = CreateObject("WScript.Shell")
    expLocation  = objShell.ExpandEnvironmentStrings(location)
    expTarget    = objShell.ExpandEnvironmentStrings(target)

    MakeDirectory(expLocation)

    set objShortcut = objShell.CreateShortcut(expLocation & "\" & text & ".lnk") 
    objShortcut.TargetPath = expTarget
    objShortcut.Save
End Function


Function MakeDirectory (newPath)

    Dim objFSO
    Dim arrPath
    Dim length
    Dim count
    Dim path

    Set objFSO = CreateObject("Scripting.FileSystemObject")

    If objFSO.FolderExists(newPath) Then    
        Exit Function
    End If

    path = ""
    count = 0
    arrPath = split(newPath, "\")
    length = ubound(arrPath)
    While count <= length 
        path = path + arrPath(count) + "\"
        count = count + 1
        If Not objFSO.FolderExists(path) Then 
            objFSO.CreateFolder(path)
        End If
    Wend
End Function

SHORTCUTS.VBSを削除する

DeleteShortcut "%AllUsersProfile%\Start Menu\Programs\My Prog Folder", _
               "My Prog.lnk", _
               True


Function DeleteShortcut (location, shortcut, delLoc)

    Dim objShortcut
    Dim objShell
    Dim expLocation

    Set objShell = CreateObject("WScript.Shell")
    Set objFSO   = CreateObject("Scripting.FileSystemObject")
    expLocation  = objShell.ExpandEnvironmentStrings(location)

    DeleteDirectory(expLocation)

    If objFSO.FileExists(expLocation) Then
       objFSO.DeleteFile expLocation & "\" & shortcut
    End If 

    If delLoc = True Then
        DeleteDirectory location
    End If

End Function


Function DeleteDirectory (path)

    Dim objFSO

    Set objFSO = CreateObject("Scripting.FileSystemObject")

    If objFSO.FolderExists(path) Then  
        objFSO.DeleteFolder path, True
    End If
End Function
于 2009-04-02T20:21:43.610 に答える
0

MSI がレジストリ エントリを HKCU に書き込むと、新しいユーザーがアプリを初めて実行したときに、Windows インストーラーはそのユーザーのエントリが存在しないことを認識し、作成を試みます。Windows インストーラーがこれに元の MSI ファイルが必要であると考える理由はわかりません (C:\Windows\Installer のスタブで十分なはずですが、そうではないようです)。

いずれにせよ、ショートカットの置き換えは完全なショートカットではありません。これは、COM コンポーネントの呼び出しなどの他の操作が、宣伝されたショートカットが呼び出すのと同じ自己修復プロセスを呼び出す可能性があるためです。

于 2009-09-22T20:32:59.370 に答える
0

基本的に、デスクトップ ショートカットは、Windows インストーラーの回復力チェックをトリガーする特別なショートカットであり、不足しているファイル、フォルダー、およびレジストリ エントリを復元しようとします。

ほとんどの場合、欠落しているユーザーごとのレジストリ エントリ (HKCU または HKCR) がいくつかあるため、Windows インストーラはそれらを再作成するために MSI を見つけようとします。

于 2009-03-10T02:42:35.117 に答える
0

通常、インストール時に「全員」または「自分だけ」のオプションがあります。みなさんもぜひチェックしてみてください。msi をビルドするときに、それをデフォルトとして設定することもできます。

補足として、古いバージョンの MS Office にも同じ問題がありました (おそらくまだ発生しています。最近のバージョンを確認する必要はありませんでした。つまり、解決策がないことを意味している可能性があります)。私が小さなコンピューター ショップで働いていた頃は、新しいビルドをセットアップするときは常に最初のユーザー アカウントを作成し、一度手動で Office を起動して、ユーザーの邪魔にならないようにしていました。

于 2009-03-09T20:05:48.380 に答える