如何在 Windows XP 上注销之前运行我的程序?

Posted

技术标签:

【中文标题】如何在 Windows XP 上注销之前运行我的程序?【英文标题】:How to run my program on before logout on windows XP? 【发布时间】:2010-09-24 08:45:30 【问题描述】:

我正在寻找“RunOnceEx”的反向版本。

RunOnceEx 确实在用户的 shell(桌面和任务栏)启动之前运行了一些程序。在 runonceex 完成之前,登录进度不会继续。

我想做完全相同的事情,但在用户注销时。 当她/他注销时,所有正在运行的程序都关闭,离开shell(桌面和任务栏),然后“我希望我的程序在这一刻执行”,最后注销。

我认为这是可能的,因为“mobsync.exe”正在这样做。但我找不到在哪里以及如何做。

【问题讨论】:

我要求一种“可编程”的方式 - 我可以在安装过程中设置它或在应用程序中设置一个选项。组策略很棒,但它不能解决要求。微软是否对“mobsync.exe”进行硬编码? 正如@VonC 所说,只需添加一些注册表项。这有多难! 您在寻找 C/C++ 或 .NET 的解决方案吗?此外,mobsync.exe 是一个 Microsoft 程序,并且很可能使用注册表项,就像您拒绝的所有答案一样。 【参考方案1】:

警告,正如here 所说,gpedit.msc 将允许您为所有用户配置一个注销脚本

如果您只需要一个用户的脚本,您需要直接在注册表中声明它,在HKCUHKLM 中。

【讨论】:

【参考方案2】:

要仅为当前用户运行此功能,您可以使用 WMI 在发生关机/注销时获取信息。

您可以编写一个小型 C#(或任何其他可以使用 WMI 的语言)应用程序或 vbs 脚本来监听 Win32_ComputerShutdownEvent WMI 事件。

可以在此问题中找到示例 C# 应用程序:Get Log off event from system

【讨论】:

【参考方案3】:

在谷歌的第一个结果中为我找到

要执行一个程序,您可以创建一个脚本来运行它并使用组策略来执行它。 在组策略编辑器中导航到用户配置-->Windows 设置-->脚本(登录/注销)

more information here

【讨论】:

正如我在 *** 中询问的,而不是超级用户,我正在寻找编程解决方案【参考方案4】:

如果您希望正在运行的程序在注销时执行代码,那么您应该挂钩 WM_QUERYENDSESSION 消息并查找 ENDSESSION_LOGOFF (0x80000000) 的 lParam 值。

测试这个lParam 值很重要,因为其他值表示“强制关闭” - 即您的进程可能在您的代码被允许运行之前被终止。事实上,大多数关闭/会话结束消息只是为了让您有机会运行最后一分钟的清理代码,并且对长时间运行的操作进行响应并不安全;但是这种特殊的组合应该没问题。

注意:我从未尝试实际运行单独的进程来响应WM_QUERYENDSESSION 消息。窗口管理器可能会禁止这样做,就像在关机期间一样。试试看,我猜。

如果您在 .NET 环境中(您没有指定),更快的方法是将事件处理程序添加到 Microsoft.Win32.SystemEvents.SessionEnding 事件。

【讨论】:

【参考方案5】:

您需要的是GINA 的实现。您可以在WlxIsLogoffOk 函数中运行自定义命令,该函数在用户启动注销时调用

创建正确的 GINA dll 后,您可以在此处注册它:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\@GinaDLL

这是一个可能满足您需求的实现(它提供了一个注销注册表项,您可以在其中指定您的命令): http://wwwthep.physik.uni-mainz.de/~frink/newgina_pre09/readme.html

【讨论】:

+1,因为这是一个合法的答案,但我认为为这个人想要完成的事情实施 GINA dll 太过分了。【参考方案6】:

正如 VonC 和 TFD 已经提到的,组策略编辑器只是操纵注册表的另一种方式。

只需使用 gpedit 进行更改(在用户配置 - Windows 设置 - 脚本中),然后查看[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts] 的注册表 了解如何直接做到这一点。

在我的电脑上(挂在域中)还有一个隐藏文件夹C:\WINDOWS\System32\GroupPolicy,其中包含用于用户和机器的子文件夹。两者都有额外的子文件夹,称为 Shutdown 和 Startup。也许你也可以使用这些。

【讨论】:

【参考方案7】:

如果您需要简单的东西并为单个(或任何)用户工作,您可以使用 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”)。

【讨论】:

以上是关于如何在 Windows XP 上注销之前运行我的程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的 VB.net 程序在 Windows XP 上运行?

如何在 xp 和 windows 7 上运行 SWT 应用程序

如何在 Windows XP 上运行 nAudio?

如何在 Windows 中从我的 VS2008/C++ 应用程序中执行一个程序来替换调用者并在 xp/vista/7 上运行?

如何在同一个 Windows XP 机器上同时运行 python 2.6 和 3.0?

在Windows XP上系统锁定/解锁时触发事件