我编写了一个Windows服务,允许我远程运行和停止应用程序.这些应用程序使用CreateProcess运行,这对我有用,因为它们中的大多数只执行后端处理.最近,我需要运行将GUI呈现给当前登录用户的应用程序.如何在C++中编码以允许我的服务找到当前活动的桌面并在其上运行GUI?
我注意到无法从Process Explorer中杀死GoogleToolbarNotifier.exe.它返回"拒绝访问".它以用户身份运行,运行"正常"优先级,并从Program Files运行.
他们是如何做到的呢?
我认为可能有一种方法可以修改ACL,或者将进程标记为"关键",但我似乎找不到任何东西.
更新:
我找到了一个很好的挖掘答案.@Alex K.是正确的,因为该进程已删除PROCESS_TERMINATE权限,但我想在代码中提供答案:
static const bool ProtectProcess()
{
HANDLE hProcess = GetCurrentProcess();
EXPLICIT_ACCESS denyAccess = {0};
DWORD dwAccessPermissions = GENERIC_WRITE|PROCESS_ALL_ACCESS|WRITE_DAC|DELETE|WRITE_OWNER|READ_CONTROL;
BuildExplicitAccessWithName( &denyAccess, _T("CURRENT_USER"), dwAccessPermissions, DENY_ACCESS, NO_INHERITANCE );
PACL pTempDacl = NULL;
DWORD dwErr = 0;
dwErr = SetEntriesInAcl( 1, &denyAccess, NULL, &pTempDacl );
// check dwErr...
dwErr = SetSecurityInfo( hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pTempDacl, NULL );
// check dwErr...
LocalFree( pTempDacl );
CloseHandle( hProcess );
return dwErr == ERROR_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud) 我正试图找出一种方法来从使用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)
但是,我正在努力寻找一种方法,允许我注销所选用户的会话.我知道我可以关闭机器,但我不希望这样 - 这会杀死所有用户的会话.
任何人的想法?感谢您阅读这篇冗长的帖子!