2011-12-07 128 views
4

我已經創建了一個自解壓縮的7-Zip文件。其中包含一個CMD文件,其中7-Zip在解壓縮文件上運行。此cmd讀取註冊表並執行一些進一步的活動(對此特定問題不重要)。Windows Server 2008 64位的7-Zip執行權限

在Windows Server 2003 32位中,此行爲工作得很好。但是,在Windows Server 2008框中進行測試表明,由7-Zip啓動的cmd無權讀取註冊表。更具體地說,它可以讀取一些區域(Windows當前版本),而不是其他(其他軟件密鑰)。

如果我把這個cmd文件自己運行(從7-Zip提取它的臨時文件夾運行它),一切運行良好。

使用UAC「以管理員身份運行」會產生相同的問題,禁用UAC似乎沒有幫助。

我不知道配置文件的任何7-Zip選項,它告訴它升級權限,或類似的東西。有什麼我在這裏失蹤?在Windows Server 2008或64位版本的操作系統中,註冊表訪問是否更加鎖定?我如何確保我的EXE文件可以將正確的權限傳遞給它所啓動的命令?

+1

你有使用'<運行特權/>'安裝XML文件中的元素? [http://izpack.org/documentation/installation-files.htm](http://izpack.org/documentation/installation-files.html) –

回答

6

由於7-Zip文件是32位可執行文件,因此您的命令腳本在32位上下文中運行。其中一個後果是某些註冊表位置被重定向。有關更多詳細信息,請參見MSDN

您可以通過尋找一個環境變量,PROCESSOR_ARCHITEW6432檢測WOW64的環境,你可以通過運行在c:\windows\sysnative發現cmd.exe副本返回原生64位環境。

這兩條線在您的命令文件的頂部應該做的伎倆:

if defined PROCESSOR_ARCHITEW6432 c:\windows\sysnative\cmd.exe /c %~pf0 %* 
if defined PROCESSOR_ARCHITEW6432 goto :eof 
+0

你先生是個巫師!我從未偶然發現過這個答案,非常感謝! –

+0

嘿哈利,我發現在win2k3 64位這個伎倆不起作用。是的,我已經看到sysnative不存在那裏,我需要交換到system32 \ cmd.exe,但是當我的腳本重新運行時,它仍然檢測到PROCESSOR_ARCHITEW6432。當我運行system32 \ cmd.exe時,我自己的工作,但這裏的交換似乎失敗。任何想法是什麼? –

+0

不,這不起作用,這仍然是32位版本。我現在唯一能想到的解決方案是編寫一個64位應用程序來爲您重新啓動命令文件,並將其包含在程序包中。如果您將此作爲新問題發佈(「32位cmd.exe如何在Windows 2003 x64中啓動64位cmd.exe?」),有人可能會想到一個更明智的答案。 –

相關問題