5

LocalSystem アカウントで実行している Windows サービスがあり、いくつかのユーザー固有の環境変数にアクセスしようとしています。ExpandEnvironmentStrings("%AppData%") を呼び出すと、"C:\windows\system32\config\systemprofile\AppData\Roaming" が表示されます。

なりすましとユーザープロファイルの読み込みがこれを解決するはずだと考えたので、次のように呼び出しました。

  • ログオンユーザー()
  • LoadUserProfile()
  • CreateEnvironmentBlock()
  • ImpersonateLoggedOnUser()

それでも、ExpandEnvironmentStrings("%AppData%") は、"C:\Users\Username\AppData\Roaming" のようなものではなく、システム フォルダーを返します。

そこで、さらに検索を行ったところ、偽装後のチャームのように機能する SHGetFolderPath(CSIDL_LOCAL_APPDATA) に出会いました。

私の質問は、何をすべきか (つまり、SHGetFolderPath) ではなく、環境変数がサービスでどのように機能するかについてです。私の問題は次のいずれかだと思います:

  1. すべてが成功を返しますが、私の LoadUserProfile() コードにはまだ何かが欠けています。私の無知な側は、理論的には、ユーザー プロファイルを読み込むと ExpandEnvironmentStrings() が読み込まれたユーザーの値を返すようにする必要があることを私に納得させたいと思っています。

  2. いくつかの測定値に基づいて、サービスの環境変数はシステムの起動時に一度だけ読み取られるようです ( http://support.microsoft.com/kb/887693 )、私のサービスはシステム環境変数のみを認識します。

私は 2. に傾いていますが、これを確認する誰かが必要なだけなので、何かが間違っている可能性があるとは思いません。

4

1 に答える 1

7

環境変数のドキュメントは、#2が正しいことを示しています。引用、強調を追加:

すべてのプロセスには、環境変数とその値のセットを含む環境ブロックがあります。

MSDNExpandEnvironmentStringForUser()は、元の問題にアプローチすることを示しています。

于 2013-02-19T22:27:42.830 に答える