0

%AppData% パスを取得する方法など、同様の質問がたくさんあることを知っています

しかし、私のものは異なります:

1.私は2つのアカウントを持っています:

Admin- Administrator account
Test- Non-Administrator account

2.管理者としてVS2013を使用してプロジェクトを実行すると、プロジェクトには昇格された権限が必要になります。次に、次のコード スニペットを使用して appdata パスを取得します。

TCHAR szPath[MAX_PATH];
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, szPath)))
{
    //....
}

しかし、 の実際の値szPathは、私が望んでいたものではC:\Users\Admin\AppData\Roamingありません。C:\Users\Test\AppData\Roaming

誰もそれを行う方法を知っていますか? 前もって感謝します。

4

1 に答える 1

1

問題の根本的な原因は、VS を「管理者」アカウントとして実行していることです。それを続ける限り、%AppData% はそのアカウントの appdata フォルダーを指します。驚きはありません。

したがって、アプローチを変更する必要があります。いくつかのオプション:

  1. %APPDATA% への固定依存関係を削除できます。自動的にしないでください。それをいくつかの構成ファイルに入れて、そこからパスを読み取ります。その後、任意のアカウントでアプリを実行し、任意のパスを参照するように構成できます
  2. フラグを追加して、デバッグ/リリースモードなどでその構成ファイルをオン/オフにすることができます
  3. VSは昇格モードで管理者として実行されます-OK、それを使用してアプリをコンパイルします。次に、通常のアカウントでアプリを実行/デバッグ/テストします。VS はユーザー X として実行でき、アプリはユーザー Y として実行できます。X は管理者であるため、VS は引き続き Y のプロセスに接続/デバッグできます。最も簡単な例: F5 を使用して実行とデバッグを停止し、debug/attach-to とアプリを手動で使用する
  4. ほとんどの場合、VS は「管理者」を実行する必要はありません。おそらく、昇格されたコンテキストで実行する必要があります。アカウントが管理者グループなどにあることを確認してから、昇格をオンにしてVSを自分として実行します。すべてが問題なければ、アカウントとして「管理者権限」で実行されます。
  5. なぜVSを昇格させる必要があるのですか? それは正常ではありません。誰が言ったとしても、99.9% の場合は間違っています。「VS を昇格させる必要がある」場合の最も一般的なケースは、誰かが COM コンポーネントで作業し、COM 自動登録を使用する場合です。管理者権限がないと COM コンポーネントを再登録/登録解除できないため、VS を管理者として実行してください。違う。そのコンポーネントを登録解除/登録し、昇格を要求するようにマークし、ビルド前/ビルド後のステップまたは msbuild タスクに追加する小さなバッチ/exe/スクリプトを作成すると、VS は魔法のように再びユーザー レベルで実行し続けることができます。

など..多くのオプションがあります.すべては、方法論で何を変更したいかによって異なります..

4 つ目について: このことを試してください - スタート メニューで「コマンドライン」(cmd.exe) へのショートカットを見つけてください。それを右クリックします。「管理者として実行」オプションが表示されます (「他のユーザーとして実行..」ではありません) 使用します。コンソールが開いたら、次のように記述echo %APPDATA%して、それが何であるかを確認します。あなたの appdata を指す必要がありますが、ウィンドウのタイトル バーにはAdministrator:CommandPrompt警告情報が表示されます。今書いてstart cmd.exeください。昇格が子プロセスに伝播することを証明する別の管理コンソールがポップアップするはずです。新しいコンソールで APPDATA を確認してください。それはまだあなたのものであるはずです。それはただのテストでした。

コンソールが機能し、昇格変数と環境変数が伝達された場合は、VisualStudio アイコンで [管理者として実行] を直接選択することもできます。それだけです。

于 2016-04-01T07:58:01.670 に答える