注销时停止Windows服务

时间:2012-10-17 11:39:58

标签: c# .net windows-services

我们的项目中有一个服务运行,我们需要它来获取注销命令。我们可以通过我们的控制台发送命令,但控制台是一个无法运行的独立程序。它不一定需要停止,但它确实需要获得某种命令。服务中是否有任何可以捕获注销事件的内容?

[10/17/12 10:45] - 该服务作为本地系统运行。

[10/17/12 12:07] - 我添加了以下方法,但是当我注销或进入计算机时我没有得到任何输出,即使我使用此消息成功写入日志我会尝试再次重建我的解决方案,但想在这里发布,以防我做错了。

protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
        WriteToDebugLog(new string[] { "OnSessionChange()",
                                        DateTime.Now.ToLongTimeString() + " - Session change notice received: " + changeDescription.Reason.ToString() + "  Session ID: " + changeDescription.SessionId.ToString(),
                                       "Information" });
        base.OnSessionChange(changeDescription);
}

3 个答案:

答案 0 :(得分:1)

不幸的是,服务不能按用户运行,而是系统范围内的服务。您可以修改服务以检测用户何时注销,但在用户再次登录时不会再次启动它。作为替代方案,您可以使用第二个服务来监控登录活动(使用@rene指出的OnSessionChanged)并根据此开始/停止第一个服务。

这有点棘手,你必须安装第二个服务,我更喜欢使用脚本的更简单的解决方案。

的PowerShell

您可以使用两个PowerShell脚本,这是为了启动服务:

Start-Service -name "YourServiceName"

这是为了停止服务:

Stop-Service -name "YourServiceName"

要配置要执行的脚本,请查看here。简而言之,您必须在HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System!RunUserPSScriptsFirst中更改策略配置,以便在需要时运行脚本。

"旧"外壳

您没有被迫使用PowerShell,可以使用shell命令来启动/停止服务:

sc start YourServiceName

sc stop YourServiceName

有关如何在注销时执行批处理文件(或命令)的信息,请参阅this post。简而言之,您必须为HKCU\Software\Policies\Microsoft\Windows\System\Scripts\Logoff添加一个条目以便注销,并HKCU\Software\Policies\Microsoft\Windows\System\Scripts\Logon进行登录(但是有很多不同的地方可以放置脚本进行登录)。

答案 1 :(得分:0)

添加群组策略会有帮助吗?如果您使用的是Windows 7,请单击“开始”,编写“组策略”,然后单击“编辑组策略”选项。从那里,转到用户配置> Windows设置>脚本(登录/注销)

在此处,您可以添加启动或停止服务的脚本

答案 2 :(得分:0)

您可以让您的服务始终有效并检查特定用户是否已登录,请查看此SO答案如何检查已登录的用户

https://stackoverflow.com/a/7065660/351383