Удаление Silent Dropbox - PullRequest
       40

Удаление Silent Dropbox

0 голосов
/ 18 декабря 2010

Я использую следующий скрипт в 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 из моей программы (путь = "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 не запускают новый проводник, поскольку он уже есть.Через минуту или две этот процесс будет автоматически закрыт, если окна не открыты.Поэтому я считаю, что Бен Фойгт прав, и «на самом деле нет хорошего способа полностью разгрузить оболочку без выхода из системы всех пользователей».

Ответы [ 3 ]

1 голос
/ 22 декабря 2010

Как бы то ни было, ваша команда "start" "/ d \ explorer.exe", кажется, работает нормально для меня даже на win7, она перезапускает панель задач и рабочий стол, если она была убита.

Однако вам не нужно "начинать". Вы можете просто вызвать «explorer.exe» из командного файла, он не будет блокироваться. Не уверен, что это имеет значение, но стоит попробовать.

Кстати, если он не работает ... что произойдет на зараженном компьютере, если вы откроете диспетчер задач с помощью ctrl + shift + esc и выполните File-> Run "explorer"? Запускает ли это панель задач, или она снова выдаст окно обозревателя? Если это приводит к ожидаемым результатам, возможно, что-то не так с командным файлом или его окружением. Например, если он не запущен как зарегистрированный пользователь и т. Д.

Проводник должен запустить панель задач, если вокруг него нет других экземпляров собственного процесса. Тот факт, что сама оболочка может быть загружена в другие процессы, не имеет значения ... вы можете уничтожить все экземпляры проводника, открыть диалоговое окно «Открытие файла» в Excel и все же перезапустить панель задач, запустив explorer.exe из задачи менеджер.

1 голос
/ 08 февраля 2013

Попробуйте заменить следующую строку

start "" /D\ explorer.exe

с этим

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

Это должно запустить проводник без параметров.

Дело в том, что запущенный проводник без полного пути запускает его с указанными вами параметрами:

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

но я понятия не имею, почему это происходит.

1 голос
/ 20 декабря 2010

Что не так со сценарием, довольно просто: оболочка загружается во многие многие приложения, кроме только Windows Explorer.Оболочка содержит каждое приложение, которое использует общие диалоговые окна открытия / сохранения файла.

Чтобы ответить на ваш непосредственный вопрос о том, как управлять рабочим каталогом Проводника Windows без передачи аргументов, открывающих окно, просто установите рабочий каталог:

pushd C:\
start explorer.exe
popd

Но это все равно не позволит вам надежно удалить расширение.На самом деле нет хорошего способа полностью выгрузить оболочку без выхода из системы всех пользователей.

РЕДАКТИРОВАТЬ: Ваш сценарий работает на том же уровне целостности, что и исходный файл explorer.exe, который вы убили?Тот же уровень высоты?Оболочка работает со средним (нормальным) уровнем целостности и неизмененным токеном, вам нужно соответствовать этому.

...