Всем привет!
Суть проблемы. Есть приложение, которое запускается под специально созданной локальной учетной записью Windows Z1 в виде службы Windows. Оно при своей работе использует несколько COM-объектов, внутрипроцессных и внепроцессных. В норме внепроцессные запускаются посредством системного DllHost.exe и все прекрасно. Однако, требуется некоторые из них запустить под другой учетной записью, скажем, Z2. Делаю с помощью Wizard-а ATL шаблон сервиса (службы), в нем модифицирую код функции Run():
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
// If you are running on NT 4.0 or higher you can use the following call
// instead to make the EXE free threaded.
// This means that calls come in on a random RPC thread
// HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
_ASSERTE(SUCCEEDED(hr));
// This provides a NULL DACL which will allow access to everyone.
CSecurityDescriptor sd;
sd.InitializeFromThreadToken();
// Мой код, который, если верить статье Владислава Чистякова "Защита в DCOM/COM+", полностью отключает защиту
hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);
CoUninitialize();
}
В настройках "Службы компонентов\...\Настройка DCOM" даю права на работу с этим сервисом на всех закладках Z1, указываю, что запускаться он будет под Z2. Запускаю сервис с COM-объектом, а потом основной сервис. При попытке получить интерфейс CoCreateInstance возвращает -2147024891 (0x80070005), что оначает "Отказано в доступе".
Что происходит и что делать???
С уважением, Андрей.