相关疑难解决方法(0)

Windows服务如何执行GUI应用程序?

我编写了一个Windows服务,允许我远程运行和停止应用程序.这些应用程序使用CreateProcess运行,这对我有用,因为它们中的大多数只执行后端处理.最近,我需要运行将GUI呈现给当前登录用户的应用程序.如何在C++中编码以允许我的服务找到当前活动的桌面并在其上运行GUI?

c++ winapi windows-services

45
推荐指数
4
解决办法
8万
查看次数

使用Process Explorer中的"结束进程"防止用户进程被终止

我注意到无法从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 process

17
推荐指数
2
解决办法
1万
查看次数

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

我正试图找出一种方法来从使用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)

但是,我正在努力寻找一种方法,允许我注销所选用户的会话.我知道我可以关闭机器,但我不希望这样 - 这会杀死所有用户的会话.

任何人的想法?感谢您阅读这篇冗长的帖子!

c# windows-services logoff

12
推荐指数
1
解决办法
1万
查看次数

标签 统计

c++ ×2

windows-services ×2

c# ×1

logoff ×1

process ×1

winapi ×1

windows ×1