2012-04-11 69 views
14

當我的應用程序運行時,我必須將psTool實用程序複製到System32文件夾。
我在64位Windows 7上,每當我嘗試通過File.Copy將exe複製到system32位文件夾時,exe總是被複制到SysWow64。將文件複製到SysWOW64而不是System32

當我在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位操作系統上的控制檯應用程序的Visual Studio的默認設置開發應用程序。我不確定編譯時必須保留哪些設置/開關,以便該應用程序可以在32位和64位操作系統上運行。
基本上,它應該只設置將文件複製到System32,而不管它是什麼位的操作系統。
在程序的後面,我必須通過命令行訪問psTools實用程序,如果我將它放在SysWOW64中,該命令行不可用。如果我進行更改,要使用SysWOW64的32位cmd.exe,這將再次是64位平臺特定的,我不想選擇。

任何可以使應用程序在32位和64位上均可正常運行的解決方案?我是否必須修改代碼(如何?),還是必須修改此控制檯應用程序項目的某些屬性(哪些屬性)?

+1

爲什麼你首先從system32複製它,PsTools套件的哪個工具是你試圖運行的? – 2012-04-11 19:10:34

+0

將其複製到'system32',而不是將其複製。 'pskill'是該實用程序的名稱。 – user1240679 2012-04-12 04:11:00

+1

你讓我接觸到/來自錯字。但是,您仍然沒有回答問題**爲什麼**您將'pskill'複製到'system32'文件夾中,而不是從別處運行它(並且在必要時將其添加到系統'PATH'變量中) – 2012-04-12 05:57:58

回答

22

您已經與file system redirection發生衝突。

因爲%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重定向程序您知道自己在做什麼,而不執行重定向。

+0

我不知道如何在上面的代碼中做上面的'Sysnative'事情。我試着通過'run'對話框打開'%windir%\ Sysnative',但是這並沒有打開任何目錄。 – user1240679 2012-04-11 09:22:10

+1

@user:您必須從** 32位應用程序**訪問目錄。不言而喻,Windows資源管理器不是64位版本的Windows上的32位應用程序。也許[這些說明](http://ovidiupl.wordpress.com/2008/07/11/useful-wow64-file-system-trick/)會有幫助嗎? – 2012-04-11 16:02:35

+0

我明白,當32位應用程序嘗試訪問64位的System32時,會執行此重定向。但是,在開發應用程序時,我沒有做任何事情,這使得我的應用程序有32位。平臺目標也被設置爲「任何CPU」。應用程序在32位操作系統上的行爲不是32位,在64位操作系統上的行爲不是64位,這應該通過只訪問'System32'文件夾來解決問題。儘管在64位操作系統上爲64位應用命名'System32'非常奇怪。我仍然無法辨別出我的應用程序需要更改哪些具體內容。 : -/ – user1240679 2012-04-11 16:47:50

1

由於道路環境在變量包含c:\windows在Windows的x86/x64操作系統的版本, 爲什麼不把你的工具到c:\windows%windir%

在我的情況下,這解決了我的問題。

5

我有同樣的問題。解決方案是在Visual Studio的項目屬性中將「平臺目標」設置爲x64或AnyCPU,而不是x86。在這種情況下,路徑將爲"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

2

我用我的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); 
    } 
} 
相關問題