我正试图找出一种方法来从使用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;
Run Code Online (Sandbox Code Playgroud)
但是,我正在努力寻找一种方法,允许我注销所选用户的会话.我知道我可以关闭机器,但我不希望这样 - 这会杀死所有用户的会话.
任何人的想法?感谢您阅读这篇冗长的帖子!