无声Dropbox删除

时间:2010-12-18 14:11:37

标签: windows windows-7 uninstall windows-shell silent

我在Npackd中使用以下脚本来卸载Dropbox。它适用于XP和Vista,但在Windows 7/64上失败。它不显示任务栏(通常位于屏幕底部的任务栏),而是显示内容为C:/的Windows资源管理器窗口。这与Dropbox无关,因为使用基于DLL的shell扩展删除其他包也会显示相同的效果。

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

以下是从我的程序启动.bat的代码(path =“Uninstall.bat”,只定义了2个新的环境变量):

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);

为什么资源管理器认为已经存在任务栏?

EDIT2:我知道现在出了什么问题。在资源管理器被杀死后,svchost.exe进程会自动启动一个带有以下参数的新进程:/ factory,{682159d9-c321-47ca-b3f1-30e36b2ec8b9}。 GUID适用于DesktopExplorerFactory。这可能是COM服务的崩溃保护。我对explorer.exe的调用没有启动新的资源管理器,因为已经存在一个。一两分钟后,如果没有打开窗户,这个过程将自动关闭。所以我认为Ben Voigt是对的,“如果没有注销所有用户,就没有好办法完全卸载shell。”

3 个答案:

答案 0 :(得分:1)

脚本有什么问题很简单:除了Windows资源管理器之外,shell还加载到许多许多应用程序中。每个使用公共打开/保存文件对话框的应用程序都托管shell。

要解决您如何在不传递打开窗口的参数的情况下控制Windows资源管理器的工作目录的直接问题,只需设置工作目录:

pushd C:\
start explorer.exe
popd

但是这仍然不会让你可靠地删除扩展名。在没有注销所有用户的情况下,没有很好的方法可以完全卸载shell。

编辑:您的脚本是否与您杀死的原始explorer.exe运行的完整性级别相同?相同的海拔水平? shell以中等(正常)完整性级别和未升级的令牌运行,您需要匹配它。

答案 1 :(得分:1)

对于它的价值,你的命令“start”“/ d \ explorer.exe”似乎对我来说没问题,即使在win7上,它重新启动任务栏&amp;桌面,如果它被杀死。

但是,你真的不需要“开始”。您只需从批处理文件中调用“explorer.exe”,它就不会阻止。不确定这是否有所作为,但值得一试。

顺便说一句,如果它不起作用...如果你用ctrl + shift + esc启动任务管理器并执行文件 - >运行“资源管理器”,受影响的计算机上会发生什么?这会启动任务栏还是会再生成一个资源管理器窗口?如果这产生预期结果,则批处理文件或其环境可能有问题。例如,不作为当前登录用户等运行

如果没有自己进程的其他实例,资源管理器应该启动任务栏。 shell本身可能被加载到其他进程的事实无关紧要......你可以杀死所有的explorer实例,在Excel中打开一个“文件打开”对话框,然后通过从任务运行explorer.exe重启任务栏管理器。

答案 2 :(得分:1)

尝试替换以下行

start "" /D\ explorer.exe

这一个

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

这应该运行没有参数的资源管理器。

问题是运行没有完整路径的资源管理器会使用您指定的参数运行它:

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

但我不知道为什么会这样。