Отказано в активации активации сервера ServicedComponent
Я пытаюсь разработать в C# компонент, который будет вызываться и использоваться вне процесса клиентом C++. Для этого я пытаюсь реализовать его в качестве активированного сервером ServicedComponent.
Компонент выглядит следующим образом:
[assembly: ApplicationName("Sample COM")]
[assembly: ApplicationID("3967FB64-686C-4F93-B866-B011FEE9A6AA")]
[assembly: AssemblyKeyFile("SampleCOM.snk")]
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: Description("Testing ServicedComponents")]
namespace SampleCOM
{
[ComVisible(true)]
public interface ICalculator
{
double Add(double first, double second);
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("SampleCOM.Calculator")]
[Guid("AA12A3DA-51A2-4F3D-90FF-E7C00E77800D")]
public class Calculator : ServicedComponent, ICalculator
{
public double Add(double first, double second)
{
return first + second;
}
}
}
Код прекрасно компилируется (VS 2017), и я могу зарегистрировать его, используя:
regsvcs /fc SampleCOM.dll
Теперь я пытаюсь увидеть, как это работает. Для этого я использую старый, хороший код VB6.0:
Private Sub Command1_Click()
On Error GoTo ErrorHandler
Dim obj As SampleCOM.Calculator
Dim res As Double
Set obj = CreateObject("SampleCOM.Calculator")
res = obj.Add(1.2, 3.4)
MsgBox "Done " & CStr(res)
GoTo Cleanup
ErrorHandler:
MsgBox Err.Description
Cleanup:
Set obj = Nothing
End Sub
И здесь я не могу заставить это работать. Сбой CreateObject с ошибкой " Отказано в доступе" на клиенте. Это работает нормально, если я переключаюсь на активацию библиотеки, но мне нужно, чтобы он был вне процесса, поэтому сервер.
В журнале событий я вижу запись ниже:
Параметры разрешений для конкретного приложения не предоставляют разрешения локальной активации для приложения COM-сервера с CLSID {AA12A3DA-51A2-4F3D-90FF-E7C00E77800D} и APPID {3967FB64-686C-4F93-B866-B011FEE9A6AA} пользователю MYDOMAIN\ZUSER (S-1-5-21-126838783-1048989290-1062434389-134100) с адреса LocalHost (с использованием LRPC), работающего в контейнере приложения. Недоступный SID (недоступен). Это разрешение безопасности можно изменить с помощью инструмента администрирования служб компонентов.
Я не могу найти в DCOM Config соответствующее приложение {3967FB64-686C-4F93-B866-B011FEE9A6AA}.
Под приложениями COM+ есть только пример приложения COM. Но там, я не уверен, что нужно изменить, чтобы это заработало.
1 ответ
В итоге я добавил следующий атрибут:
[assembly: ApplicationAccessControl(false)]
что сделало проверку доступа Enforce для этого приложения отключенной.