2010-12-18 4 views
0

私はNpackdで次のスクリプトを使用してDropboxをアンインストールします。 XPとVistaでは動作しますが、Windows 7/64では動作しません。タスクバー(通常画面の一番下にあるもの)を表示するのではなく、C:/という内容のWindows Explorerウィンドウを表示します。 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 

は私のプログラム(パス=「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); 

なぜExplorerはタスクバーがすでにあると思うのでしょうか?

EDIT2:今何が間違っているのか分かります。 Explorerが終了すると、svchost.exeプロセスによって、/ factory、{682159d9-c321-47ca-b3f1-30e36b2ec8b9}のパラメータを持つ新しいファイルが自動的に開始されます。 GUIDはDesktopExplorerFactory用です。これは、おそらくCOMサービスのクラッシュ防御です。 explorer.exeへの私の呼び出しは、新しいエクスプローラが既に存在するので、新しいエクスプローラを起動しません。 1〜2分後に、このウィンドウが開かれていなければ、このプロセスは自動的に閉じられます。だから私はBen Voigtが正しいと思う。「すべてのユーザーからログオフせずにシェルを完全にアンロードする方法は本当にない。

答えて

1

スクリプトの問題は非常に単純です。シェルはWindowsエクスプローラのほかに多くのアプリケーションに多くの個のアプリケーションに読み込まれます。一般的なファイルの保存/保存ダイアログを使用するすべてのアプリケーションは、シェルをホストします。

pushd C:\ 
start explorer.exe 
popd 

しかし、これはまだあなたが確実に削除させません:だけの作業ディレクトリを設定するウィンドウを開き、引数を渡さずに、Windowsエクスプローラの作業ディレクトリを制御する方法のあなたの即時の質問に対処するには

拡張。すべてのユーザーをログオフせずにシェルを完全にアンロードする方法はありません。

EDIT:あなたが殺した元のexplorer.exeと同じ完全性レベルでスクリプトが実行されていますか?標高は同じですか?シェルは中程度(正常)の整合性レベルと不安定なトークンで動作しますので、これに合わせる必要があります。

+0

pushd/popd do not help残念ながら – kaboom

+0

私はすでにWindowsエクスプローラの作業ディレクトリを制御する方法を知っています。私の質問では "/ D \"を参照してください。私の質問はWindows 7だけです。 – kaboom

+0

@kaboom:編集 –

1

あなたのコマンド "start" "/ d \ explorer.exe"はwin7でもうまく動作しているようですが、デスクトップが殺された場合はタスクバー&を再起動します。

しかし、実際には「開始」は必要ありません。バッチファイルから "explorer.exe"を呼び出すだけで、ブロックされません。違いがあるのか​​どうかは分かりませんが、試してみる価値があります。

ところで、うまくいかない場合は...ctrl + shift + escでタスクマネージャを起動し、「ファイル」 - >「エクスプローラ」を実行すると、影響を受けるコンピュータではどうなりますか?これはタスクバーを開始するのでしょうか、それとも、再びエクスプローラウィンドウを生成しますか?期待される結果が得られた場合は、バッチファイルまたはその環境に問題がある可能性があります。現在ログオンしているユーザーなどで実行されていないなどです。

独自のプロセスのインスタンスがない場合、エクスプローラはタスクバーを開始する必要があります。シェル自体が他のプロセスに読み込まれる可能性はありません...エクスプローラのすべてのインスタンスを強制終了し、Excelで「ファイルを開く」ダイアログを表示し、タスクからexplorer.exeを実行してタスクバーを再起動しますマネージャー。

+0

他のプロセスでロードされているシェルについての私の主張は、エクスプローラを再起動することとはまったく関係ありませんが、他のアプリケーションではFile Openダイアログが避けるシェル拡張の削除に関係します。 –

+0

意味があります。残りのものはどうですか? – martona

+0

彼の振る舞いを再現することはできませんが、彼のアンインストールスクリプトが管理者トークンで実行されているか、ログインしていないユーザーがプログラムファイル領域からファイルを削除できなかったと思います。あるいは、デスクトップ/タスクバーになるかどうかを決定するときに、エクスプローラのプロセスが殺されていても、まだ死んでいるとは限りません。 –

1

は、パラメータなしでエクスプローラを実行する必要があり、この1

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

これで次の行に

start "" /D\ explorer.exe 

を交換してください。

事は完全なパスなしでエクスプローラを実行すると、指定したパラメータでそれを実行していることである:

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

が、私はこれがなぜ起こるか見当もつかない。