2010-12-18 128 views
0

我使用Npackd下面的腳本來卸載Dropbox。它適用於XP和Vista,但在Windows 7/64上失敗。它不顯示任務欄(通常位於屏幕底部的任務欄),而是顯示內容爲C:/的Windows資源管理器窗口。這不是Dropbox相關的,因爲使用基於DLL的外殼擴展刪除其他包也會顯示相同的效果。沉默Dropbox刪除

Uninstall.exe /S _?=%CD% 
taskkill /f /fi "IMAGENAME eq explorer.exe" 
del DropboxExt.13.dll 
del DropboxExt64.13.dll 
rem start explorer from the root directory so it does not lock this one 
start "" /D\ explorer.exe 

該腳本有什麼問題?如何修改它以在Windows 7上正常工作?

謝謝

編輯:我真的很厭倦這個問題。下面的批處理文件仍然可以正常工作開始作爲一個普通用戶或「系統管理員」:

taskkill /f /fi "IMAGENAME eq explorer.exe" 
ping -n 5 127.0.0.1 
pushd \ 
rem runas /trustlevel:0x20000 
start "" /D\ explorer.exe 
popd 

下面是從我的節目(PATH =「Uninstall.bat」,只有2個新的環境變量啓動的.bat代碼被定義):

QDir d = this->getDirectory(); 
QProcess p(0); 
p.setProcessChannelMode(QProcess::MergedChannels); 
QStringList params; 
p.setWorkingDirectory(d.absolutePath()); 
QString exe = d.absolutePath() + "\\" + path; 
for (int i = 0; i < env.count(); i += 2) { 
    p.processEnvironment().insert(env.at(i), env.at(i + 1)); 
} 
p.start(exe, params); 

在QT/qprocess_win.cpp相應的代碼:

DWORD dwCreationFlags = CREATE_NO_WINDOW; 
dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT; 
STARTUPINFOW startupInfo = { sizeof(STARTUPINFO), 0, 0, 0, 
          (ulong)CW_USEDEFAULT, (ulong)CW_USEDEFAULT, 
          (ulong)CW_USEDEFAULT, (ulong)CW_USEDEFAULT, 
          0, 0, 0, 
          STARTF_USESTDHANDLES, 
          0, 0, 0, 
          stdinChannel.pipe[0], stdoutChannel.pipe[1], stderrChannel.pipe[1] 
}; 
success = CreateProcess(0, (wchar_t*)args.utf16(), 
         0, 0, TRUE, dwCreationFlags, 
         environment.isEmpty() ? 0 : envlist.data(), 
         workingDirectory.isEmpty() ? 0 : (wchar_t*)QDir::toNativeSeparators(workingDirectory).utf16(), 
         &startupInfo, pid); 

爲什麼瀏覽器認爲已經有一個任務欄?

編輯2:我知道現在出了什麼問題。在資源管理器被殺死後,一個新的自動啓動由svchost.exe進程使用以下參數:/ factory,{682159d9-c321-47ca-b3f1-30e36b2ec8b9}。 GUID適用於DesktopExplorerFactory。這可能是COM服務的防撞保護。我的電話explorer.exe不會啓動一個新的資源管理器,因爲已經有一個。一兩分鐘後,如果沒有窗戶打開,此過程將自動關閉。所以我認爲Ben Voigt是對的,「沒有完全卸載shell而沒有註銷所有用戶的真正方法。」

回答

1

這段腳本有什麼問題很簡單:除了Windows資源管理器外,shell已加載到許多許多應用程序中。每個使用公共打開/保存文件對話框的應用程序都託管該shell。

爲了解決你如何控制Windows資源管理器的工作目錄沒有通過打開一個窗口參數直接的問題,只需設置工作目錄:

pushd C:\ 
start explorer.exe 
popd 

但是,這仍然不會讓你可靠地刪除延期。在沒有註銷所有用戶的情況下完全卸載shell真的沒有好方法。

編輯:您的腳本運行在與您殺死的原始explorer.exe相同的完整性級別上嗎?相同的海拔高度?外殼運行中(正常)完整性級別和未降級的標記,你需要匹配這個。

+0

pushd/popd不會幫助不幸 – kaboom 2010-12-20 17:04:38

+0

我也已經知道如何控制Windows資源管理器的工作目錄:請參閱我的問題中的「/ D \」。我的問題只是關於Windows 7. – kaboom 2010-12-20 17:14:24

+0

@kaboom:請參閱編輯 – 2010-12-20 22:59:55

1

爲什麼它的價值,你的命令「開始」「/ d \ explorer.exe」似乎工作正常,即使在win7上,它會重新啓動任務欄&桌面,如果它已被殺死。

但是,你並不需要「開始」。你可以從批處理文件中調用「explorer.exe」,它不會阻塞。不知道這是否有所作爲,但值得一試。

順便說一句,如果它不工作......如果你用ctrl + shift + esc調出任務管理器並執行File-> Run「explorer」,受影響的計算機上會發生什麼?這是否啓動任務欄,或者它會再次產生一個資源管理器窗口?如果這產生了預期的結果,批處理文件或其環境可能有問題。比如沒有以當前登錄的用戶身份運行等。

如果沒有其他自身進程的其他實例,資源管理器應該啓動任務欄。事實上,shell本身可能被加載到其他進程並不重要...你可以殺死所有的資源管理器實例,在Excel中有一個「文件打開」對話框,並且仍然通過從任務運行explorer.exe來重新啓動任務欄經理。

+0

我關於在其他進程中加載​​的shell的觀點實際上與重新啓動資源管理器沒有任何關係,但是涉及刪除shell擴展,而其他應用程序中的「文件打開」對話框將會阻止該擴展。 – 2010-12-22 01:00:39

+0

有道理。那剩下的東西呢? – martona 2010-12-22 01:43:37

+0

我也無法重現他的行爲,但我猜測他的卸載腳本正在使用管理員令牌運行(否則它無法從Program Files區域刪除文件)而不是登錄的用戶。或者,當新的決策者決定是否將成爲桌面/任務欄時,被殺死的瀏覽器進程還沒有完全死亡。 – 2010-12-22 13:06:02

1

試着用這一個

start "" /D\ %SystemRoot%\explorer.exe 

這來替換下面的行

start "" /D\ explorer.exe 

應該不帶參數運行資源管理器。

的事情是,如果沒有完整的路徑運行資源管理器與您指定的參數運行它:

/factory,{682159d9-c321-47ca-b3f1-30e36b2ec8b9} 

,但我不知道爲什麼會這樣。