【问题标题】:Exit process created with CreateProcessWithLogonW on logout注销时使用 CreateProcessWithLogonW 创建的退出进程
【发布时间】:2012-06-21 22:08:36
【问题描述】:

在用户登录时,我在 C# 中使用 CreateProcessWithLogonW 以管理员身份启动进程。

当用户现在注销时,程序并没有关闭。

我希望它在使用 CreateProcessWithLogonW 启动它的用户注销时关闭。我该怎么做?

我无法让执行 CreateProcessWithLogonW 的进程保持运行,因此以管理员身份启动的程序必须自行终止。

【问题讨论】:

  • 它是 Windows 服务吗?
  • 不,它不是 Windows 服务。

标签: c# logout


【解决方案1】:

如果发出 CreateProcessWithLogonW 的应用程序仍在运行,您可以检测 Windows 何时开始注销并关闭子应用程序。 例如使用SystemEvents.SessionEnding Event

【讨论】:

  • 不,以管理员身份启动程序后,它不再运行。在其中使用 SystemEvents.SessionEnding 时,我没有收到任何事件。
  • 如何在登录时启动 C# 应用程序?是否可以让它保持运行,以便它会得到 SessionEnding 事件并向子应用程序发送一些信号
  • 不,我无法确定它会继续运行。此外,从启动程序中终止应用程序将不起作用,因为它以更高的权限运行。它需要被自己杀死。
【解决方案2】:

我通过使用 http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspx 示例 2 中描述的 HiddenForm 解决了这个问题。
这最初用于 Windows 服务,但也适用于没有 GUI 的 Windows 窗体应用程序。在没有 GUI 的应用程序(也包括控制台应用程序、Windows 服务)中无法获得 SessionEnding 事件的原因是它是通过仅分配给每个打开的窗口(基本上)的 Windows 消息泵发送的。

有关 Windows 消息的更多信息,请阅读这篇文章:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644927%28v=vs.85%29.aspx

要让这个示例真正不可见(在 xp 中),您还需要

this.ShowInTaskbar = false;
this.WindowState = FormWindowState.Minimized;
this.Visible = false;

在 HiddenForm.InitializeComponent() 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2022-07-07
    • 2013-05-10
    • 1970-01-01
    相关资源
    最近更新 更多