Разрешение на активацию сервера ServicedComponent отклонено - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь разработать в 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} пользователю SID MYDOMAIN \ ZUSER (S-1-5-21-126838783-1048989290-1062434389-134100) с адреса LocalHost (с помощью LRPC), работающего в контейнере приложения. Недоступный SID (недоступен).Это разрешение безопасности можно изменить с помощью инструмента администрирования служб компонентов.

Я не могу найти в DCOM Config соответствующее приложение {3967FB64-686C-4F93-B866-B011FEE9A6AA} .

Существует только Пример приложения COM ниже Приложения COM + .Но там я не уверен, что нужно изменить, чтобы это заработало.

1 Ответ

0 голосов
/ 25 сентября 2018

Я закончил тем, что добавил следующий атрибут:

[assembly: ApplicationAccessControl(false)]

, что сделало Принудительное выполнение проверок доступа для этого приложения отключено.

...