2

C# (.NET 4.5) で記述された Windows サービスがあります。このサービスにはuser、タイマー変数を保持するために使用されるスコープ設定があります。サービスをデバッグするには、この変数を更新する必要がuser.configあるため、サービスのファイルがどこにあるかを知る必要があります。OnStart()したがって、サービスのメソッドに次のコードを追加しました。

Logger.InfoFormat("user.config at \"{0}\"", ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath);

ログファイルにダンプされるのは、次のパスです。

C:\Windows\system32\config\systemprofile\AppData\Local\company\service.exe_Url_randomcharacters\1.0.0.0\user.config

しかし、そのファイルを開こうとすると、存在しません。Windows検索を行った後、実際のファイルは次の場所にありました。

C:\Windows\SysWOW64\config\systemprofile\AppData\Local\company\service.exe_Url_randomcharacters\1.0.0.0\user.config

どうしてこれなの?32 ビット/64 ビットの互換性マジックを想定していますが、実際のパスを取得するための正しいコード (ある場合) は何でしょうか?

役立つ場合の追加情報: サービスは Windows Server 2008 R2 64 ビット マシンで実行されており、installutil. の 32 ビット バージョンと 64 ビット バージョンのどちらinstallutilが使用されたかはわかりませんが、違いはありますか?

4

1 に答える 1

2

これは、C:\Windows\system32 が 64 ビット プロセスと 32 ビット プロセスで異なるディレクトリであるためです。32 ビット プロセスは、C:\Windows\system32 の C:\Windows\SysWOW64 のコンテンツを参照します。クレイジーですが、それが Microsoft が多くのアプリケーションでハードコードされた C:\Windows\system32 との互換性を提供し、32 ビットおよび 64 ビット プロセス用の正しいバージョンの .dll をロードできるようにすることを決定した方法です (その結果、64 ビット dll は C:\Windows にあります)。 \system32 および 32bit dll は C:\Windows\SysWOW64 にあります)。
デフォルトでサービスに使用されるローカル システム アカウントは、C:\Windows\system32 内にプロファイルを持っています。したがって、32 ビット サービスと 64 ビット サービスは、アプリケーションがデータを保存することになっている %LOCALAPPDATA% で異なるファイルを参照します。たとえば、64 ビット サービスが 32 ビット プロセスを実行する場合、子プロセスは、親プロセスが %LOCALAPPDATA% で準備したファイルを認識しません。

これにはいくつかの回避策があります。

  • 別のユーザーからサービスを開始することもできます (サービス / プロパティ / ログオン / ログオン: このアカウント) - ただし、この場合、パスワードを入力する必要があり、パスワードが変更されるか期限切れになると、サービスはパスワードまで開始できません。サービスにも変更されます。
  • %LOCALAPPDATA% の代わりに他の場所を使用してデータを保存することもできますが、これも常に受け入れられるわけではありません。
  • 設定を使用してディレクトリへのジャンクション ポイントを作成できます。したがって、32 ビット アプリケーションと 64 ビット アプリケーションは同じディレクトリを参照します。
    • 管理者として「psexec.exe -i -s cmd.exe」を実行します (psexec はSysinternal の PsTools の一部です) - システム アカウントからコマンド プロンプトが開きます (サービスのデバッグにも最適な方法です)。
    • exec "mklink /J %SystemRoot%\SysWOW64\config\systemprofile\AppData\Local\company %LOCALAPPADATA%\company"

完璧な回避策はありませんが、この狂気に対処するための比較的簡単な方法を提供します。

于 2014-09-03T16:59:02.883 に答える