Разрешение подключения к .NET COM серверу с несоответствующим уровнем целостности

У меня проблема с настройкой клиент-сервер на основе COM. COM-сервер написан на C # (.NET 4.0) и работает как (зарегистрированный) локальный сервер.

В зависимости от того, какое приложение подключается к серверу, другие клиенты получатServer execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)

Основная проблема объясняетсяздесь (в разделе COM есть информация о целостности), Насколько я понимаю, это вызвано тем, что приложение с повышенными правами создает сервер с более высоким уровнем целостности. Когда затем подключается другое приложение без повышенных прав, ему не разрешается подключаться к тому же экземпляру. То же самое происходит, когда приложение с повышенными правами создает процесс с последующим подключением к приложению с повышенными правами.

Я пытался реализовать решение, описанное настраница: изменение реестра для установки дескриптора безопасности, который должен позволять всем клиентам подключаться. Eстьпример кода в C ++, но это делает то же самое в .NET:

// Security Descriptor with NO_EXECUTE_UP
var sd = new RawSecurityDescriptor("O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)");
byte[] securityDescriptor = new Byte[sd.BinaryLength];
sd.GetBinaryForm(securityDescriptor, 0);

RegistryKey key = Registry.ClassesRoot.OpenSubKey("AppID\\{APP-ID-GUID}", true);
if (key == null)
{
    key = Registry.ClassesRoot.CreateSubKey("AppID\\{APP-ID-GUID}");
}

using (key)
{
    key.SetValue("LaunchPermission", securityDescriptor, RegistryValueKind.Binary);
}

Однако это не дает желаемого эффекта. Когда второй клиент пытается создать экземпляр рассматриваемого объекта, Windows пытается запустить отдельный экземпляр моего COM-сервера, но сервер предотвращает запуск двух экземпляров от одного и того же пользователя. Учитывая установленные разрешения, я бы не ожидал, что второй экземпляр будет запущен в первую очередь.

Так как одно из клиентских приложений работает на Medium IL, а другое на High IL, я также экспериментировал с вариантамиобязательный ярлык, лайк:

O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;ME)
O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)(ML;;NX;;;ME)(ML;;NX;;;HI)

Я также пытался установитьROTFlags ключ реестра в 0x1 (ROTFLAGS_ALLOWANYCLIENT), как предлагается на странице, по-прежнему без изменений в поведении.

Я установил, что значение реестра LaunchPermission каким-то образом используется. Я не могу определить, где он читается с помощью Process Monitor, но когда я используюdcomcnfg.exe Инструмент для установки того же ключа, я могу заставить сервер не загружаться, отказывая в разрешениях на запуск.

Я хотел бы отметить, что мой серверный процесс не требует повышения прав. Как сделать так, чтобы процессы с повышенными и не повышенными правами могли подключаться к одному экземпляру сервера?

Ответы на вопрос(1)

Ваш ответ на вопрос