OpenProcessToken因本地系统服务的ERROR_ACCESS_DENIED而失败

时间:2014-02-19 21:58:34

标签: c++ c windows winapi antivirus

让我先解释一下我的情况。我在下面描述的问题来自最终用户的机器,我必须使用的只是Windows事件日志的副本。我无法访问机器本身来运行任何调试测试。

现在问题。我有一个我创建的服务应用程序:

SC_HANDLE hScService = CreateService(hScManager, 
    L"MyServiceID", 
    L"My Service Name",
    SERVICE_ALL_ACCESS, 
    SERVICE_WIN32_OWN_PROCESS, 
    SERVICE_AUTO_START, 
    SERVICE_ERROR_NORMAL,
    SrvcPath,
    NULL, NULL, NULL, NULL, _T(""));

稍后,服务流程会使用SE_DEBUG_NAME API设置AdjustTokenPrivileges权限。

后来我有一个枚举正在运行的进程的方法,后来使用代码来获取进程LUID:

//'pProcIDs' = list of process IDs obtained from EnumProcesses()

for(UINT i = 0; i < nNumProc; i++)
{
    DWORD dwProcID = pProcIDs[i];

    //Skip obvious system processes
    if(dwProcID != 0 &&
        dwProcID != 4)
    {
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcID);
        if(hProcess)
        {
            HANDLE hTokenHandle;
            if(::OpenProcessToken(hProcess, TOKEN_QUERY, &hTokenHandle))
            {
                TOKEN_STATISTICS ts;
                DWORD dwcbSz = 0;
                if(::GetTokenInformation(hTokenHandle, TokenStatistics, &ts, sizeof(ts), &dwcbSz))
                {
                    //And so on...
                }
                else
                {
                    //Handle error here
                }

                ::CloseHandle(hTokenHandle);
            }
            else
            {
                //***Here's where I get my error in question***
            }

            ::CloseHandle(hProcess);
        }
        else
        {
            //Handle error here
        }
    }
}

当我在自己的开发计算机上运行上面的代码时,它运行得很好。 请注意,这些计算机在没有安装任何AVP或其他第三方软件的情况下运行操作系统的“库存”副本。

我从运行Windows 7 Professional计算机的客户(即Active Directory域的成员)收到的事件日志副本有3个进程,当我从其上调用ERROR_ACCESS_DENIED时,它返回OpenProcessToken上面的代码。它们的PID只是常规值,例如1824,2760,5024(重启后显然会发生变化。)

有没有人知道为什么会这样?我是否需要为我的服务设置其他权限?

PS。从事件日志中我可以看出有问题的工作站安装了一些Symantec Antivirus产品,从这一行判断:

  

加载了新的病毒定义文件。版本:140217066。

1 个答案:

答案 0 :(得分:2)

赛门铁克防病毒软件(以及许多其他安全软件供应商的软件)可能会尝试防止未经授权的参与者篡改其流程。获取其中一个进程的进程令牌可能符合条件。

也就是说,通过检查支持进程的可执行映像的路径,您可以快速验证所讨论的PID实际上是Symantec软件包的一部分。如果它们是Symantec AV软件包的一部分,您需要查看配置它以信任您的应用程序,或在运行此代码时禁用它(不推荐),或者只是忽略此类错误。