0

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

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 的调用不会启动新的 Explorer,因为已经有一个。一两分钟后,如果没有打开任何窗口,此过程将自动关闭。所以我认为 Ben Voigt 是对的,“真的没有什么好的方法可以在不注销所有用户的情况下完全卸载 shell。”

4

3 回答 3

1

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

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

pushd C:\
start explorer.exe
popd

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

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

于 2010-12-20T16:05:21.657 回答
1

对于它的价值,即使在 win7 上,您的命令“start”“/d\ explorer.exe”似乎对我来说也能正常工作,如果它被杀死,它会重新启动任务栏和桌面。

但是,您实际上并不需要“开始”。您可以从批处理文件中调用“explorer.exe”,它不会阻塞。不确定这是否有所作为,但值得一试。

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

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

于 2010-12-22T00:55:46.440 回答
1

尝试替换以下行

start "" /D\ explorer.exe

有了这个

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

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

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

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

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

于 2013-02-08T19:10:24.773 回答