我正试图找出一种方法来从使用C#编写的Windows服务注销本地Windows会话中的用户 .
以下是问题的背景:我需要管理一组用户的计算机使用时间;当他们的分配时间到期时,我想将它们记录下来 . 这是在W2K8域的上下文中 . 不幸的是,Windows中的登录时间控件只是将用户与服务器资源断开连接;没有办法强制他们的会话通过这种方法终止 .
我的方法是构建一个我将在域中部署的Windows服务;该服务将在每台客户端计算机上运行 . 服务将定期枚举计算机上的已登录用户,呼叫数据库以将自上次呼叫以来的登录时间添加到当天的总计中,如果已达到最大值,则将其注销(五分钟警告) . 注意 - 这些不是终端服务会话,它们是常规的本地交互式登录 . 另请注意,由于Win7和Vista中的“切换用户”功能,计算机上可能会有多个登录 . 我的所有客户端PC都将运行Win7 . Windows服务将作为本地系统运行,因此权限不应成为问题 .
我可以使用WMI通过用户名在计算机上成功构建登录用户列表 . 这是该代码的片段:
List<string> loggedInUsers = new List<string>();
ManagementClass mc = new ManagementClass("Win32_Process");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
ROOT.CIMV2.Process process = new ROOT.CIMV2.Process(mo);
string domain, user;
uint pid;
process.GetOwner(out domain, out user);
pid = process.ProcessId;
if (process.Name.Trim().ToLower() == "explorer.exe")
loggedInUsers.Add(user);
}
return loggedInUsers;
但是,我正在努力寻找一种方法,允许我注销所选用户的会话 . 我知道我可以关闭机器,但我不希望这样 - 这会杀死所有用户的会话 .
任何人的想法?感谢您阅读这篇冗长的帖子!
1 回答
您可以使用以下P / Invoke调用来实现此目的 . Below sample works only with Admin Rights
下面是一个示例实现,用于查找所有用户及其会话,然后注销其中一个用户 .