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

Мне нужно скопировать утилиту psTool в папку System32 при запуске моего приложения.
Я нахожусь на 64-битной Windows 7, и всякий раз, когда я пытаюсь скопировать exe в битную папку system32 через File.Copy, exe всегда копируется на SysWow64.

Когда я устанавливаю точку останова на destFile, путь показывается как C:\Windows\System32, но файл туда не входит (идет в sysWow64). Я попробовал Special Folder SystemX86, но файл снова переходит к 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-битном без проблем? Мне нужно изменить код (как?) Или мне нужно изменить некоторые свойства этого проекта консольного приложения (какие свойства)?

Ответы

Ответ 1

Вы выполнили перенаправление файловой системы.

Поскольку %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.

Ответ 2

У меня была та же проблема. Решения заключаются в том, чтобы установить "Цель платформы" как 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));

enter image description here

Ответ 3

Я использую свойство helper в своих 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);
    }
}

Ответ 4

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

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