2

アプリケーションがプログラムファイルの下のどこかから実行されているかどうかを確認するための信頼できる方法はありますか?

ユーザーがアプリケーションをインストールしてローカルマシン上のファイルをプログラムする場合、VistaおよびWin7での仮想化を回避するために、書き込み可能なファイルを別の場所に配置する必要があります。ただし、ネットワークディスクにインストールする場合は、ユーザー間で共有アクセスできるように、これらのファイルをインストール時に保持する必要があります。

今日、起動パスとの文字列比較を行いますCSIDL_PROGRAM_FILESが、これは非常に信頼性の低い方法であることがわかります。

そこにスマートなソリューションはありますか?'IsRunningFromProtectedFolder()'-私が知らないAPIはありますか?プログラムファイルと同じ問題を引き起こす他のフォルダはありますか?

4

3 に答える 3

3

これは、ユーザーが好きな場所にインストールでき、チェックが失敗する可能性があるため、あまり良い考えではありません。代わりに、ユーザーがアプリをインストールするときにチェックボックスをオンにして、アプリをローカルにインストールするかサーバーにインストールするかを決定します。

于 2009-12-10T08:51:35.300 に答える
0

UACフォルダーの仮想化の処理にも問題があることがわかったので、回避策を提案しますが、うまくいくはずです。

これは、昇格されたプロセスが仮想化されたもの(CMIIW)ではなく、常に元のコピーを使用するという仮定に基づいています。また、あなたが処理したセットアップが昇格して実行されたと思います

アイデアは、メインインストーラーが実行する必要のある「一般的な」プロセス(昇格されていないレガシー)を作成することです。このプロセスにより、ユーザーが選択したフォルダーに、両方のプログラムが認識している名前と内容のファイル名が作成されます(たとえば、test73819704.bin)。フォルダが仮想化されている場合、このファイルはユーザーVirtualStoreに表示され、元のファイルには表示されないようにする必要があります(インストーラーの観点と特権の観点から)。

したがって、選択したC:\ Program_Files_But_Not_NecessicallyおよびProcess-1(昇格)の場合

  • プロセス1は、ファイルC:\ Program_Files_But_Not_Necessarily\test73819704.binがないことを確認します
  • 標高なしでProcess-2を起動します
  • プロセス2は、C:\ Program_Files_But_Not_Necessarily \ test73819704.binを作成し、それが実際に存在するかどうかを確認します。存在する場合は、適切な戻りコードで返されます。存在しない場合は、「失敗した」コードで返されます。
  • プロセス1はプロセス2を待機し、結果を分析します。良ければ、C:\ Program_Files_But_Not_Necessarily \ test73819704.binをチェックし、存在する場合は「ビンゴ!仮想化は発生しませんでした」、存在しない場合は「悪い、他のストレージの場所を見つけましょう」に進みます。Process-2のコードが「失敗」した場合は、ユーザーにエラーメッセージを表示します。

残念ながら、現時点ではテストできませんでしたが、動作するはずであり、この背後にロジックがあります。Process-2では、メインプログラムの動作をエミュレートするだけです)

于 2009-12-10T13:34:22.750 に答える
0

ユーザーはどこにでもインストールできます...

ユーザーがデフォルトを採用し、プログラムファイルにインストールされている場合、ドキュメントと設定/ユーザーに書き込む必要があると想定します。それ以外の場合は、ソフトウェアが存在するディレクトリの下のフォルダにデータを書き込みます。もちろん、これでも問題が発生する可能性があります。インストールにより、デフォルトを選択しない場合は、実際に別のデータの場所を選択できます。

その上、それは単純なiniファイルの変更とデータを移動するためのコピーです。

起動時に、SHGetFolderPath(CSIDL_PROGRAM_FILES)から取得した値を実行可能ファイルが含まれているパスの先頭と比較することにより、ProgramFilesディレクトリにいるかどうかを検出します。

于 2012-04-11T02:57:23.917 に答える