4

私のアプリケーションには、更新するメイン アプリケーションと同じフォルダにある「updater.exe」という別のアプリを介した組み込みの自己更新システムがあります。最新バージョンをダウンロードし、古いバージョンを終了し (実行中の場合)、上書きします。

問題は、updater.exe にアクセスするには、管理者権限で updater.exe を実行する必要があることです。C:\Program Files\MyApp

これまでのところ、メイン アプリは管理者権限で (UAC を使用して) updater.exe を実行しますが、問題が発生します。

アップデート完了後、新しくインストールしたバージョンを自動で起動させたい。何だと思う?もちろん、メインアプリも管理者権限で実行されます。シナリオは単純です:

Main app[running as user] --> Updater App[run as admin] --> Main app[ADMIN again]

私のアプリケーションがMy.Settingsオブジェクトを使用しているという理由だけで、管理者として実行すると、保存されているすべての設定が失われます。これは、通常、通常は常に通常のユーザーとして開始され、ご存知のようにMy.Settingsオブジェクトuser-sensiviteであるためです。

このような問題を修正するにはどうすればよいですか? 検索しましたが、「通常のユーザーとして実行」に関連するものは見つかりませんでしたが、常に管理者として実行されているため、非常に簡単です。

一方、正直なところ、アップデータ アプリはどのユーザーがそれを開始したかを知ることができないため、そのようなことはあり得ないと思います。それともできますか?私がここに欠けているものはありますか?

私が正しければ、My.Settings を使用せずに Windows レジストリを使用してユーザー設定を保存する唯一のオプションですか?

今までありがとう。

4

1 に答える 1

3

子プロセスを "昇格解除" する 1 つの方法は、エクスプローラーを使用して子プロセスを開始することです。これは通常、通常の Windows ユーザーで機能するはずです。ただし、エクスプローラー自体が管理者特権で実行されている場合、起動しようとしているアプリも同様です。次の理由により、エクスプローラーが管理者特権で実行されている可能性があります。

  • アクティブなユーザーは管理者です (管理者特権を持つユーザーだけではありません)。
  • Explorer.exeコマンドウィンドウから(再)起動されました...あなたがそれを手に入れ、昇格して実行しています

...そしておそらく他の人。

これは、デフォルトの権限でアプリを起動すると考えた方がよいでしょう。昇格されたエクスプローラーを実行すると昇格された新しいインスタンスが開始されますが、元の最初のメイン アプリインスタンスも昇格されて実行されます。

チェックボックスを使用して昇格するかどうかを選択して、同じアプリを起動するコードをテストします。

Dim proc = New Process
proc.StartInfo.UseShellExecute = True
proc.StartInfo.WindowStyle = ProcessWindowStyle.Normal
proc.StartInfo.WorkingDirectory = mypath

If chkAdmin.Checked Then                    ' run this app as admin
    proc.StartInfo.FileName = myApp
    proc.StartInfo.WorkingDirectory = mypath
    proc.StartInfo.Verb = "runas"           ' run "me" as admin
    proc.StartInfo.Arguments = ""
Else                                        ' run explorer w/app as arg
    ' de-elevate new app instance to run de-elevated
    proc.StartInfo.FileName = Path.Combine(windir, "explorer.exe")  
    proc.StartInfo.Verb = ""                ' important!
    proc.StartInfo.Arguments = myApp        ' send the child app name as arg
End If

proc.Start()

この画像は結果を示しています。

ここに画像の説明を入力

フォームの上部にあるラベルは、そのアプリが管理者特権で実行されているかどうかを示します。各アプリ インスタンスは、その前のインスタンスによって開始されました。

2 番目のウィンドウは昇格して実行されます。次のインスタンスを開始したとき、As Adminのチェック ボックスはチェックされていませんでした。その結果、3 番目のインスタンスはエクスプローラー経由で開始され、管理者特権で実行されていません。#5 から #4 も同様です。

于 2015-06-10T01:39:30.110 に答える