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

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

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

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

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

【问题讨论】:

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

标签: windows-xp registry logout runonce


【解决方案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

      【讨论】:

      • 正如我在 stackoverflow 中询问的,而不是超级用户,我正在寻找编程解决方案
      【解决方案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”)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-04-10
            • 2012-07-20
            • 1970-01-01
            • 2013-09-07
            • 1970-01-01
            • 2014-10-08
            • 1970-01-01
            • 2012-03-29
            相关资源
            最近更新 更多