当前位置: 首页 > 编程语言 > C#

从服务中注销Windows中的交互式用户Share

时间:2023-04-11 10:28:42 C#

从服务中注销Windows中的交互式用户用C#编写的服务。这是问题的背景:我需要管理一组用户的计算机使用时间;当他们分配的时间到期时,我想记录他们。这是在W2K8域的上下文中。不幸的是,Windows中的登录时间控件只会断开用户与服务器资源的连接;无法通过这种方法强制终止他们的会话。我的方法是构建一个我将在域上部署的Windows服务;该服务将在每台客户端计算机上运行。该服务将定期枚举计算机上的登录用户,调用数据库以将自上次调用以来的登录时间添加到当天的总数中,如果达到最大值则将其注销(五分钟警告)。注意-这些不是终端服务会话,它们是常规的本地交互式登录。另请注意,由于Win7和Vista中的“切换用户”功能,电脑上可能会出现多次登录。我所有的客户端电脑都将运行Win7。Windows服务将作为本地系统运行,因此权限应该不是问题。我可以使用WMI通过用户名在计算机上成功构建登录用户列表。这是该代码的一个片段:ListloggedInUsers=newList();ManagementClassmc=newManagementClass("Win32_Process");ManagementObjectCollectionmoc=mc.GetInstances();foreach(ManagementObjectmoinmoc){ROOT.CIMV2.Processprocess=newROOT.CIMV2.Process(mo);字符串域,用户;单位pid;process.GetOwner(域外,用户外);pid=process.ProcessId;如果(process.Name.Trim().ToLower()=="explorer.exe")loggedInUsers.Add(user);}返回登录用户;但是,我正在努力寻找一种允许我注销所选用户会话的方法。我知道我可以关闭机器,但我不想这样——那样会终止所有用户的会话。有人有想法吗?感谢您阅读这篇冗长的文章!您可以使用以下P/Invoke调用来实现此目的。以下示例仅针对管理员权限[DllImport("wtsapi32.dll",SetLastError=true)]staticexternboolWTSLogoffSession(IntPtrhServer,intSessionId,boolbWait);[DllImport("Wtsapi32.dll")]staticexternboolWTSQuerySessionInformation(System.IntPtrhServer,intsessionId,WTS_INFO_CLASSwtsInfoClass,outSystem.IntPtrppBuffer,outuintpBytesReturned);[DllImport("wtsapi32.dll",SetLastError=true)]staticexternIntPtrWTSOpenServer([UTTypeStrMarmanshOpenServer([]StringpServerName);[DllImport("wtsapi32.dll")]staticexternvoidWTSCloseServer(IntPtrhServer);[DllImport(“wtsapi32.dll”,SetLastError=true)]staticexternInt32WTSEnumerateSessions(IntPtrhServer,[MarshalAs(Unmanaged.U4)]Int32Reserved,[MarshalAs(UnmanagedType.U4)]Int32Version,refIntPtrppSessionInfo,[MarshalAs(UnmanagedType。U4)]refInt32pCount);[DllImport("wtsapi32.dll")]staticexternvoidWTSFreeMemory(IntPtrpMemory);下面是一个示例实现,用于查找所有用户及其会话,然后注销其中一个。以上就是C#学习教程:从服务注销到Windows中交互用户的全部内容分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——usingSystem;使用System.Collections.Generic;使用System.Runtime.InteropServices;命名空间ConsoleApplication1{[StructLayout(LayoutKind.Sequential)]internalstructWTS_SESSION_INFO{publicInt32SessionID;[MarshalAs(UnmanagedType.LPStr)]publicStringpWinStationName;公共WTS_CONNECTSTATE_CLASS状态;}internalenumWTS_CONNECTSTATE_CLASS{WTSActive,WTSConnected,WTSConnectQuery,WTSShadow,WTSDisconnected,WTSIdle,WTSListen,WTSReset,WTSDown,WTSInit}internalenumWTS_INFO_CLASS{WTSInitialProgram,WTSApplicationName,WTSWorkingDirectory,WTSOEMId,WTSSessionId,WTSUserName,WTSWinStationName,WTSDomainName,WTSConnectState,WTSClientBuildNumber,WTSClientName,WTSClientDirectory,WTSClientProductId,WTSClientHardwareId,WTSClientAddress,WTSClientDisplay,WTSClientProtocolType,WTSIdleTime,WTSLogonTime,WTSIncomingBytes,WTSOutgoingBytes,WTSIncomingFrames,WTSOutgoingFrames,WTSClientInfo,WTSSessionInfo}类程序{[DllImport("wtsapi32.dll",SetLastError=true)]staticexternboolWTSLogoffSession(IntPtrhServer,intSessionId,boolbWait);[DllImport("Wtsapi32.dll")]staticexternboolWTSQuerySessionInformation(System.IntPtrhServer,intsessionId,WTS_INFO_CLASSwtsInfoClass,outSystem.IntPtrppBuffer,outuintpBytesReturned);[DllImport("wtsapi32.dll",SetLastError=true)]staticexternIntPtrWTSOpenServer([MarshalAs(UnmanagedType.LPStr)]StringpServerName);[DllImport("wtsapi32.dll")]staticexternvoidWTSCloseServer(IntPtrhServer);[DllImport(“wtsapi32.dll”,SetLastError=true)]staticexternInt32WTSEnumerateSessions(IntPtrhServer,[MarshalAs(UnmanagedType.U4)]Int32保留,[MarshalAs(UnmanagedType.U4)]Int32版本,refIntPtrppSessionInfo,[MarshalAs(UnmanagedType.U4)]refInt32pCount);[DllImport("wtsapi32.dll")]staticexternvoidWTSFreeMemory(Int指针内存);内部静态列表GetSessionIDs(IntPtr服务器){列表sessionIds=newList();IntPtrbuffer=IntPtr.Zero;整数计数=0;intretval=WTSEnumerateSessions(server,0,1,refbuffer,refcount);intdataSize=Marshal.SizeOf(typeof(WTS_SESSION_INFO));Int64当前=(int)缓冲区;if(retval!=0){for(inti=0;isessions=GetSessionIDs(server);DictionaryuserSessionDictionary=GetUserSessionDictionary(server,sessions);if(userSessionDictionary.ContainsKey(userName))returnWTSLogoffSession(server,userSessionDictionary[userName]],true);否则返回false;}privatestaticDictionaryGetUserSessionDictionary(IntPtrserver,Listsessions){DictionaryuserSession=newDictionary();foreach(varsessionIdinsessions){stringuName=GetUserName(sessionId,server);if(!string.IsNullOrWhiteSpace(uName))userSession.Add(uName,sessionId);}returnuserSession;}内部静态字符串GetUserName(intsessionId,IntPtrserver){IntPtrbuffer=IntPtr.Zero;uint计数=0;字符串用户名=string.Empty;尝试{WTSQuerySessionInformation(服务器,sessionId,WTS_INFO_CLASS.WTSUserName,输出缓冲区,输出计数);userName=Marshal.PtrToStringAnsi(buffer).ToUpper().Trim();}最后{WTSFreeMemory(缓冲区);}返回用户名;}staticvoidMain(string[]args){stringinput=string.Empty;Console.Write("请输入服务器名称:");输入=Console.ReadLine();IntPtrserver=WTSOpenServer(input.Trim()[0]=='0'?Environment.MachineName:input.Trim());try{do{Console.WriteLine("请输入L=>列出会话,G=>注销用户,END=>退出。");输入=Console.ReadLine();如果(string.IsNullOrWhiteSpace(input))继续;elseif(input.ToUpper().Trim()[0]=='L'){DictionaryuserSessionDict=GetUserSessionDictionary(server,GetSessionIDs(server));foreach(varuserSessioninuserSessionDict){Console.WriteLine(string.Format("{0}登录到{1}session",userSession.Key,userSession.Value));}}elseif(input.ToUpper().Trim()[0]=='G'){Console.Write("输入用户名:");输入=Console.ReadLine();注销用户(输入,服务器);}}while(input.ToUpper()!="END");}最后{WTSCloseServer(服务器);}}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢