Windows XPでログアウトする前にプログラムを実行する方法は?
-
11-07-2019 - |
質問
" RunOnceEx"の逆バージョンを探しています。
RunOnceExは、ユーザーのシェル(desktop& taskbar)が開始する前に何らかのプログラムを実行します。 runonceexが完了するまで、ログインの進行は継続しません。
まったく同じことをしたいが、ユーザーがログアウトしたい。 彼女がログアウトすると、実行中のすべてのプログラムがシャットダウンし、シェル(デスクトップ&タスクバー)を離れ、「プログラムがこの瞬間に実行されることを願っています」、最後にログアウトします。
" mobsync.exe"それをしています。しかし、どこでどのようにすればよいのかわかりません。
解決
これを現在のユーザーに対してのみ実行するには、WMIを使用して、シャットダウン/ログアウトが発生したときに情報を取得します。
小さなC#(またはWMIを使用できる他の言語)アプリケーションまたはvbsスクリプトを記述して、 Win32_ComputerShutdownEvent WMIイベントをリッスンします。
この質問には、C#アプリの例があります:ログオフイベントを取得システム
他のヒント
警告、 こちら 、 gpedit.msc
を使用すると、 すべてユーザーのログオフスクリプトを構成できます。
そのスクリプトが1人のユーザーのみに必要な場合は、レジストリで直接 HKCU
と HKLM
の両方で宣言する必要があります。
google for meの最初の結果で見つかった
プログラムを実行するには、スクリプトを作成して実行し、グループポリシーを使用して強制できます。 グループポリシーエディターで、[ユーザーの構成]-> [Windowsの設定]-> [スクリプト(ログオン/ログオフ)
実行中のプログラムでログオフ時にコードを実行する場合は、 WM_QUERYENDSESSION
メッセージをフックして、 ENDSESSION_LOGOFF
lParam 値を探す必要があります。 >(0x80000000)。
この lParam
の値をテストすることは重要です。他の値は「強制終了」を示しているためです。 -つまり、コードの実行が許可される前にプロセスが強制終了される場合があります。実際、ほとんどのシャットダウン/セッション終了メッセージは、最後の最後のクリーンアップコードを実行する機会を与えることのみを目的としており、長時間実行されるアクションで応答するのは安全ではありません。しかし、この特定の組み合わせは問題ないはずです。
注: WM_QUERYENDSESSION
メッセージへの応答として、実際に別のプロセスを実行しようとしたことはありません。シャットダウン中に行うように、ウィンドウマネージャーがこれを許可しない可能性があります。試してみてください。
.NET環境にいる場合(指定しなかった場合)、より簡単な方法は、イベントハンドラーを Microsoft.Win32.SystemEvents.SessionEnding
イベントに追加することです。
必要なのは、 GINA 。 WlxIsLogoffOk でカスタムコマンドを実行できます。ユーザーがログオフを開始すると呼び出される関数
適切なGINA dllを作成したら、ここで登録できます: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ @GinaDLL
ニーズに合った実装を次に示します(コマンドを指定できるLogoffレジストリキーを提供します)。 http://wwwthep.physik.uni-mainz.de/~ frink / newgina_pre09 / readme.html
VonCとTFDがすでに述べたように、グループポリシーエディターはレジストリを操作するための別の方法にすぎません。
gpeditで変更(Userconfig-Windows Settings-Scripts)を行い、その後 [HKEY_CURRENT_USER \ Software \ Policies \ Microsoft \ Windows \ System \ Scripts]のレジストリを見てください
直接それを行う方法を見つけます。
PCにも(ドメインにハングアップ)、ユーザーとマシン用のサブフォルダーを持つ隠しフォルダー C:\ WINDOWS \ System32 \ GroupPolicy
があります。両方とも、シャットダウンおよびスタートアップと呼ばれる追加のサブフォルダーを持っています。これらを使用することもできます。
単一の(または任意の)ユーザーのためにシンプルで作業が必要な場合は、たとえばC ++またはC#で簡単なアプリケーションを作成できます。
最も簡単なのは、トレイにC#を(トレイコンポーネントをフォームに追加するだけで)使用し、 FormClosing イベントのイベントハンドラーを登録することです。次のようになります。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason != CloseReason.UserClosing)
{
// It's not the user closing the application,
// Let's do whatever you want here, for example starting a process
Process notePad = new Process();
notePad.StartInfo.FileName = "notepad.exe";
notePad.StartInfo.Arguments = "ProcessStart.cs";
notePad.Start();
}
}
したがって、アプリケーションはWindowsまたはユーザーで起動されます。 (少しのメモリを使用して)待機し、システムがシャットダウンしたとき、またはユーザーがログオフしたときなどに(上記の" CloseReason"をチェックして)何かをします。