Файл копируется в SysWOW64 вместо System32

Я должен скопировать утилиту psTool в папку System32, когда мое приложение работает.
Я на 64-битной Windows 7 и всякий раз, когда я пытаюсь скопировать EXE в папку system32 bit через File.CopyEXE всегда копируется в 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);

Любые предложения, что мне здесь не хватает?

РЕДАКТИРОВАТЬ

Как указано ниже в ответе, происходит перенаправление файловой системы. Я занимаюсь разработкой приложения с настройками Visual Studio по умолчанию для консольного приложения в 64-битной ОС. Я не уверен, какие настройки / переключатели должны быть сохранены во время компиляции, чтобы приложение работало как на 32-битной, так и на 64-битной ОС.
По сути, он должен просто установить копию файла в System32 только независимо от того, какая битная ОС это.
Позже в программе я должен получить доступ к утилите psTools через командную строку, которая недоступна, если я помещу ее в SysWOW64. Если я внесу изменения, чтобы использовать 32-битный cmd.exe SysWOW64, это опять-таки будет нечто, специфичное для 64-битной платформы, которое я не хочу выбирать.

Любое решение, при котором приложение может работать как на 32-битной, так и на 64-битной системе без проблем? Должен ли я изменить код (как?) Или мне нужно изменить некоторые свойства этого проекта консольного приложения (какие свойства)?

4 ответа

Решение

Вы столкнулись с проблемой перенаправления файловой системы.

Так как %windir%\System32 зарезервировано исключительно для 64-разрядных приложений, в 64-разрядных версиях Windows 32-разрядных приложений, которые пытаются получить доступ к %windir%\System32 каталог автоматически и прозрачно перенаправляется на 32-битный %windir%\SysWOW64 каталог.

Во-первых, убедитесь, что ваша программа действительно принадлежит к 64-битной системной папке. Windows делает это автоматическое перенаправление по причине. 32-битные вещи не идут в %windir%\System32 папка на 64-битных версиях Windows.

Если вы уверены, что хотите копировать данные в 64-битный системный каталог, у вас есть несколько вариантов. Возможно, проще всего просто скомпилировать вашу утилиту как 64-битное приложение. Кроме того, вы можете сообщить перенаправителю WOW64, что вы знаете, что делаете, и не выполнять перенаправление с помощью %windir%\Sysnative вместо %windir%\System32,

У меня такая же проблема. Решением является установка "цели платформы" как x64 или AnyCPU вместо x86 в свойствах проекта в Visual Studio. В этом случае путь будет "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));

введите описание изображения здесь

Я использую вспомогательное свойство в моих 32-битных приложениях, которые всегда возвращают родную папку system32. Свойство helper:

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);
    }
}

Как переменная окружения пути содержит c:\windows на обеих версиях Windows x86/x64, почему бы не положить свой инструмент в c:\windows: %windir%?

В моем случае это решит мою проблему.

Другие вопросы по тегам