让我先解释一下我的情况。我在下面描述的问题来自最终用户的机器,我必须使用的只是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。
答案 0 :(得分:2)
赛门铁克防病毒软件(以及许多其他安全软件供应商的软件)可能会尝试防止未经授权的参与者篡改其流程。获取其中一个进程的进程令牌可能符合条件。
也就是说,通过检查支持进程的可执行映像的路径,您可以快速验证所讨论的PID实际上是Symantec软件包的一部分。如果它们是Symantec AV软件包的一部分,您需要查看配置它以信任您的应用程序,或在运行此代码时禁用它(不推荐),或者只是忽略此类错误。