Позвольте мне сначала объяснить мою ситуацию. Проблема, которую я опишу ниже, исходит от компьютера конечного пользователя, и все, с чем мне приходится работать, — это просто копия журнала событий 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
набор привилегий с использованием AdjustTokenPrivileges
API.
Позже у меня есть метод, который перечисляет запущенные процессы, а затем получает 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.
Антивирусное программное обеспечение Symantec (как и многие другие производители программного обеспечения для обеспечения безопасности) может попытаться предотвратить несанкционированное вмешательство в свои процессы. Приобретение токена процесса для одного из их процессов может быть квалифицировано.
Тем не менее, вы можете быстро проверить, что рассматриваемые PID на самом деле являются частью пакета Symantec, изучив путь к исполняемым образам, которые поддерживают процессы. Если они являются частью пакета программного обеспечения Symantec AV, вам нужно будет настроить его так, чтобы он доверял вашему приложению, или отключить его во время выполнения этого кода (не рекомендуется), или просто игнорировать ошибки этого типа.
Других решений пока нет …