2012-04-11 17 views
14

Muszę skopiować narzędzie psTool do folderu System32, gdy uruchomiona jest moja aplikacja.
Jestem na 64-bitowym systemie Windows 7 i zawsze, gdy próbuję skopiować plik exe do folderu system32 bit poprzez File.Copy, exe zawsze zostanie skopiowany do SysWow64 zamiast tego.Pobieranie pliku skopiowanego do SysWOW64 zamiast System32

Po umieszczeniu punktu przerwania na destFile ścieżka jest wyświetlana jako C:\Windows\System32, ale plik tam nie wchodzi (przechodzi do sysWow64). Próbowałem Special FolderSystemX86, ale plik ponownie przechodzi do sysWOW64.

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

Jakieś sugestie, czego tu brakuje?

EDIT

Jak wskazano poniżej odpowiedź, nie ma systemu plików Przekierowanie odbywa. Zajmuję się tworzeniem aplikacji z domyślnymi ustawieniami Visual Studio dla aplikacji konsolowej na 64-bitowym systemie operacyjnym. Nie jestem pewien, jakie ustawienia/przełączniki muszą być przechowywane podczas kompilacji, aby aplikacja działała zarówno na 32-, jak i 64-bitowym systemie operacyjnym.
Zasadniczo powinien po prostu ustawić kopiowanie pliku na System32 tylko bez względu na to, jaki jest to system operacyjny.
Później w programie, muszę uzyskać dostęp do narzędzia psTools za pomocą wiersza poleceń, który jest niedostępny, jeśli umieszczę go w SysWOW64. Jeśli dokonam zmiany, aby użyć 32-bitowego cmd.exe SysWOW64, będzie to znowu coś specyficznego dla platformy 64-bitowej, której nie chcę wybierać.

Jakieś rozwiązanie, które może sprawić, że aplikacja będzie działać bez żadnych problemów zarówno w wersji 32-bitowej, jak i 64-bitowej? Czy muszę zmodyfikować kod (jak?) Lub czy muszę zmodyfikować niektóre właściwości tego projektu aplikacji konsolowej (jakie właściwości)?

+1

Dlaczego kopiujesz to z systemu32, które narzędzie zestawu PsTools próbujesz uruchomić? –

+0

Skopiuj go do 'system32', nie kopiuj go z. 'pskill' to nazwa narzędzia. – user1240679

+1

Masz mnie na do/z literówki. Jednak nadal nie odpowiedziałeś na pytanie ** dlaczego ** kopiujesz 'pskill' do folderu' system32' zamiast po prostu uruchamiać go z innego miejsca (i jeśli to konieczne, dodajesz je do zmiennej systemowej 'PATH') –

Odpowiedz

22

Wystąpił problem z numerem file system redirection.

Ponieważ %windir%\System32 jest zarezerwowana wyłącznie dla aplikacji 64-bitowych na 64-bitowych wersjach systemu Windows, aplikacje 32-bitowe, które próbują uzyskać dostęp do katalogu %windir%\System32 są automatycznie i przejrzysty przekierowany do 32-bitowej %windir%\SysWOW64 katalogu.

Najpierw upewnij się, że program faktycznie należy do 64-bitowego folderu systemowego. System Windows wykonuje to automatyczne przekierowanie z jakiegoś powodu. Pliki 32-bitowe nie są umieszczane w folderze %windir%\System32 w 64-bitowych wersjach systemu Windows.

Jeśli masz pewność, że chcesz skopiować zawartość do 64-bitowego katalogu systemowego, masz kilka opcji. Najłatwiej jest po prostu skompilować narzędzie jako aplikację 64-bitową. Możesz też poinformować administratora przekierowania WOW64, że wiesz, co robisz, a nie przekierować, używając %windir%\Sysnative zamiast %windir%\System32.

+0

Nie jestem pewien, jak zrobić powyższą rzecz 'Sysnative' w powyższym kodzie. Próbowałem przez okno dialogowe 'run', aby otworzyć'% windir% \ Sysnative', ale to nie otwiera żadnego katalogu. – user1240679

+1

@user: Musisz uzyskać dostęp do katalogu z ** aplikacji 32-bitowej **. Nie trzeba dodawać, że Eksplorator Windows nie jest aplikacją 32-bitową w 64-bitowych wersjach systemu Windows. Być może [te instrukcje] (http://ovidiupl.wordpress.com/2008/07/11/useful-wow64-file-system-trick/) byłyby pomocne? –

+0

Rozumiem, że to przekierowanie jest wykonywane, gdy 32-bitowa aplikacja próbuje uzyskać dostęp do systemu System32 w 64-bitowym formacie. Jednak nie robiłem nic podczas rozwijania, które powinno sprawić, że moja aplikacja będzie 32-bitowa. Cel platformy jest również ustawiony na "Dowolny CPU". Czy aplikacja nie zachowuje się jak wersja 32-bitowa w systemie 32-bitowym i 64-bitowym w 64-bitowym systemie operacyjnym, co powinno rozwiązać problem, uzyskując dostęp tylko do folderu 'System32'. Bardzo dziwne jest jednak nazywanie 'System32' dla aplikacji 64-bitowych na 64-bitowym systemie operacyjnym. Nadal nie jestem w stanie określić, co konkretnie muszę zmienić w mojej aplikacji. : -/ – user1240679

1

Jako zmienną environnement ścieżka zawiera c:\windows na obu wersjach Windows x86/x64, dlaczego nie wprowadza narzędzie do c:\windows: %windir%?

W moim przypadku to rozwiązuje mój problem.

5

Miałem ten sam problem. Rozwiązaniem jest ustawienie "celu platformy" jako x64 lub AnyCPU zamiast x86 we właściwościach projektu w Visual Studio.W tym przypadku ścieżka będzie "C:\Windows\system32" i nie będzie przekierowywać do "C:\Windows\SysWOW64" Możesz to sprawdzić, umieszczając dowolny plik w folderze "C: \ Windows \ SysWOW64", a następnie użyj polecenia File.Exists, aby sprawdzić, czy plik znajduje się w tym folderze:

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

Albo

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

enter image description here

2

używam właściwość pomocnik w mojej aplikacji 32-bitowych, które zawsze zwraca folder natywną system32. Właściwość pomocnicza to:

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); 
    } 
} 
Powiązane problemy