前幾天分享過用 PowerShell 盤點 IIS 站台設定的小技巧,同事回報說使用時遇到鬼問題:PowerShell 找不到 C:\Windows\System32\inetsrv\Config\applicationHost.config 但檔案總管明明有看到檔案也可開啟:

乍聽以為是權限問題,但同事確認是 PowerShell 視窗是用管理者權限啟用無誤,頭一回遇到這種情形經驗不足,我跟著鬼打牆快二十分鐘,才搞懂是怎麼一回事。答案在下面這張圖裡:

文章開始的圖我刻意裁掉 PowerShell 命令視窗標題,上面圖片一對照就清楚了。兩個 PowerShell 差在下面的標題有 (x86) 是 32 位元版,上面的則是 64 位元版。32 位元版 PowerShell 看到的 C:\Windows\System32\inetsrv\Config\ 資料夾只有 Export 跟 Schema 資料夾,沒有其他檔案。

身為 Windows 老人,看到這裡應該知道是怎麼一回事了。

兩個 PowerShell 看到的目錄並不是同一個,32 位元版 PowerShell 看到的其實是 C:\Windows\SysWOW64\inetsrv\Config\,其中的確只有資料夾,沒有任何檔案:

SysWOW64 目錄用於 64 位元 Windows 為 32 位元版本程式建立的檔案系統重新導向器,%windir%\System32 目錄保留給 64 位 Windows 上的 64 位應用程式,當 32 位應用程式嘗試存取 %windir%\System32、%windir%\lastgood\system32 或 %windir%\regedit.exe 時,就會將存取重新導向至架構特定的路徑:%windir%\SysWOW64、%windir%\lastgood\SysWOW64、%windir%\SysWOW64\regedit.exe (若為 32 位元 ARM,則為 SysArm32)。
(註:Registry 也有類似設定,如下圖,讓 32/64 位環境享有自己的設定)

至於故事是怎麼發生的?同事在開始輸入 powershell 出現兩個選項,熊熊沒看清楚誤入歧途... 結案。

A case of confusion caused by mistakenly using the PowerShell x86 version to access the SysWOW64 path.


Comments

# by Chun

還有應用程式集區是中文的時候,也會出代誌哦,Get-Content 要用UTF8

# by Huang

通常要處理就二個目錄都一起處理。

Post a comment