1. 程式人生 > >Windows系統System32目錄的訪問許可權問題

Windows系統System32目錄的訪問許可權問題

    最近做一個WOW64的更新程式,32位的應用程式跑在64位的系統上,32位的應用程式依賴於一個64位的驅動,做更新時驅動檔案也要同時更新。

    可是更新程式執行完成後,沒有任何的拋錯,但是位於%systemroot%/system32/drivers下的驅動檔案卻死活替換不了,很奇怪。

    寫了個簡單的Bat指令碼,除去一大堆的判斷,核心就是:
if exist %systemroot% (
        echo %systemroot%\System32\drivers >> C:\test.txt
        xcopy "%DRIVER_FILE_PATH%
" %systemroot%\System32\drivers /Y echo %errorlevel% >> C:\test.txt )
    手動執行是OK的,驅動檔案能正常的拷貝到%systemroot%/system32/drivers目錄,C:\test.txt輸出
    C:\Windows\System32\drivers
    0

    排除了當前使用者環境變數不存在systemroot的可能性。
    修改更新程式,讓更新程式呼叫該指令碼,然後以管理員使用者執行,C:\test.txt輸出為
    C:\Windows\System32\drivers
    0

    但是驅動檔案沒有拷貝到%systemroot%/system32/drivers中。
    感覺跟手動執行沒有什麼差別?問題到底出在哪裡呢?

    更新程式是WOW64,那麼它執行指令碼時執行的xcopy程式應該是SysWOW64下的xcopy.exe,而不是System32下的xcopy.exe,排除使用者許可權問題後,手動執行和更新程式執行應該只有這一點差別。

    恢復環境,將System32下的xcopy.exe拷貝到指令碼所在目錄,然後執行指令碼,C:\test.txt輸出為
    C:\Windows\System32\drivers
    0
    驅動檔案成功拷貝到%systemroot%/system32/drivers中

    恢復環境,將SysWOW64下的xcopy.exe拷貝到指令碼所在目錄,然後執行指令碼,C:\test.txt輸出為
    C:\Windows\System32\drivers
    0
    但是驅動檔案沒有拷貝到%systemroot%/system32/drivers中,跟預想的一樣,將目標資料夾改為%systemroot%/system32,xcopy返回0,但是檔案還是沒有真正的複製過去。

    查看了一下屬性,System32的所有者是Administrator,為什麼32位的xcopy往其中拷貝檔案有問題(且xcopy沒有返回錯誤),而64位的xcopy拷貝是OK的呢?看來WOW64還是有很多未知的坑,等待挖掘!

    原來執行在Windows 64位系統上的32位程式往System32拷貝檔案時,系統預設重定向到對應的SysWOW64目錄。