web-dev-qa-db-ja.com

System32ではなくSysWOW64にコピーされるファイル

アプリケーションの実行時に、psToolユーティリティをSystem32フォルダーにコピーする必要があります。
64ビットのWindows7を使用していて、File.Copyを介してexeをsystem32ビットフォルダーにコピーしようとすると、exeは常にSysWow64にコピーされます。

DestFileにブレークポイントを設定すると、パスはC:\Windows\System32として表示されますが、ファイルはそこに移動しません(sysWow64に移動します)。 Special FolderSystemX86を試しましたが、ファイルは再びsysWOW64に移動します。

string sourceFile = "C:\bin\Debug\somexe.exe"
string destFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), utilityName);
File.Copy(sourceFile, destFile, true);

私がここで見逃している提案はありますか?

[〜#〜]編集[〜#〜]

以下の回答で指摘されているように、ファイルシステムのリダイレクトが行われています。 64ビットOS上のコンソールアプリケーション用に、VisualStudioのデフォルト設定でアプリを開発しています。アプリケーションが32ビットと64ビットの両方のOSで動作するように、コンパイル中にどの設定/スイッチを保持する必要があるかわかりません。
基本的には、OSのビットに関係なく、ファイルをSystem32にコピーするように設定する必要があります。
プログラムの後半で、コマンドラインからpsToolsユーティリティにアクセスする必要がありますが、SysWOW64に配置すると使用できなくなります。 SysWOW64の32ビットcmd.exeを使用するために変更を加えると、これも64ビットプラットフォーム固有のものになりますが、これは選択したくありません。

アプリを32ビットと64ビットの両方で問題なく実行できるソリューションはありますか?コードを変更する必要がありますか(どのように?)、またはこのコンソールアプリケーションプロジェクトのいくつかのプロパティ(どのプロパティ)を変更する必要がありますか?

19
user1240679

ファイルシステムリダイレクト のファウルを実行しました。

_%windir%\System32_は64ビットアプリケーション専用に予約されているため、64ビットバージョンのWindowsでは、_%windir%\System32_ディレクトリにアクセスしようとする32ビットアプリケーションは自動的かつ透過的に32ビット_%windir%\SysWOW64_ディレクトリ。

まず、プログラムが実際に64ビットシステムフォルダーに属していることを確認します。 Windowsは、この自動リダイレクトを行うのには理由があります。 32ビットのものは64ビットバージョンのWindowsの_%windir%\System32_フォルダーに入れられません。

ものを64ビットシステムディレクトリにコピーしたいことが確実な場合は、いくつかのオプションがあります。最も簡単なのは、ユーティリティを64ビットアプリケーションとしてコンパイルすることです。または、_%windir%\Sysnative_の代わりに_%windir%\System32_を使用して、リダイレクトを実行しないように、自分が何をしているかを知っていることをWOW64リダイレクタに伝えることができます。

28
Cody Gray

私も同じ問題を抱えていました。解決策は、Visual Studioのプロジェクトプロパティで、「プラットフォームターゲット」をx86ではなくx64またはAnyCPUとして設定することです。この場合、パスは"C:\Windows\system32"になり、"C:\Windows\SysWOW64"にリダイレクトされません。これを確認するには、「C:\ Windows\SysWOW64」フォルダーにファイルを配置してから、File.Existsコマンドを使用します。ファイルがそのフォルダにあるかどうかを確認するには:

File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), sFileName));

または

File.Exists(Path.Combine(Environment.SystemDirectory, sFileName));

enter image description here

6
Computer User

パス環境変数には両方のWindowsx86/x64バージョンでc:\windowsが含まれているので、ツールをc:\windows%windir%に入れてみませんか?

私の場合、これで問題は解決します。

2
xponard

32ビットアプリケーションでヘルパープロパティを使用して、常にネイティブのsystem32フォルダーを返します。ヘルパープロパティは次のとおりです。

public static string NativeSystemPath
{
    get
    {
        if (Environment.Is64BitOperatingSystem)
        {
            return System.IO.Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.Windows),
                "Sysnative");
        }
        return Environment.GetFolderPath(Environment.SpecialFolder.System);
    }
}
2