Почему я получаю E_ACCESSDENIED, вызывая метод COM + от прокси? - PullRequest
2 голосов
/ 29 ноября 2008

Извините, если это немного надульно ... учтите:

У меня есть приложение COM + в пространстве имен с именем Компания , которое предоставляет объект с именем Сервер , который имеет следующие методы:

bool Server.Execute(IOptions options)

IOptions Server.CreateOptions()

IOptions просто имеет несколько логических свойств чтения / записи следующим образом:

IOptions.Option1 (bool)

IOptions.Option2 (bool)

Я создаю клиентское приложение со следующим кодом:

Company.Server s = new Company.Server();

Company.IOptions serverOptions = s.CreateOptions();

serverOptions.Option1 = false;
serverOptions.Option2 = true;

s.Execute(serverOptions);

Я устанавливаю приложение COM + на компьютер A, а затем запускаю клиент на компьютере A, и все в порядке.

Затем я изменяю клиентское приложение, чтобы оно создавало собственную реализацию IOptions следующим образом:

public class ClientOptions : Company.IOptions
{
    public bool Option1 { get; set; }
    public bool Option2 { get; set; }
}

Company.Server s = new Company.Server();

ClientOptions clientOptions = new ClientOptions();

clientOptions.Option1 = false;
clientOptions.Option2 = true;

s.Execute(clientOptions);

Опять же, я выполняю клиентское приложение на компьютере A, и все хорошо.

Если я устанавливаю приложение COM + на компьютер B в качестве прокси-сервера на компьютер A, а затем выполняю клиент, я получаю ошибку E_ACCESSDENIED при вызове:

s.Execute(clientOptions);

Вот сводка кода, выполняющегося на машине B, обращающейся к машине A

Company.Server s = new Company.Server();

Company.Options serverOptions = s.CreateOptions()

serverOptions.Option1 = false;
serverOptions.Option2 = true;

s.Execute(serverOptions); // this is fine

ClientOptions clientOptions = new ClientOptions();

clientOptions.Option1 = false;
clientOptions.Option2 = true;

s.Execute(clientOptions); // this causes the error

Подводя итог, почему я могу реализовать свои собственные IOptions и использовать их в приложении COM +, когда клиент находится на той же машине, что и приложение COM +, но не когда клиент обращается к приложению COM + через прокси-сервер на другой машине? 1029 *

Кажется, что если IOptions был создан сервером, то это нормально, но если он создан клиентом, то это не так.

Любая помощь будет принята с благодарностью.

Спасибо

Карл.

Ответы [ 2 ]

2 голосов
/ 29 ноября 2008

Я собираюсь экстраполировать некоторый более старый опыт работы с DCOM, который может или не может быть полезным. Когда вам отказывают в доступе, вы должны посмотреть параметры конфигурации DCOM на компьютере B.

В старых ОС (Windows 2000) вы запускаете dcomcnfg . Но в XP вы запускаете Службы компонентов из Панели управления - Администрирование. Под Vista, по-видимому, вы должны запустить windows \ System32 \ comexp.msc.

Когда вы находитесь в администрировании служб компонентов, выделите Мой компьютер и выберите свойства. Первое, что вам нужно сделать, это на вкладке Свойства по умолчанию , нажать Включить распределенный COM на этом компьютере . Кроме того, вам может понадобиться указать Запустить и активировать и Доступ Разрешения на вкладке COM Security . При этом вам, возможно, придется иметь дело как с правками, так и правками по умолчанию?

Обратите внимание, что я считаю, что это разрешения DEFAULT, и вы можете захотеть найти свое зарегистрированное приложение COM + в списке приложений и установить права доступа для конкретного приложения, а не настройки по умолчанию для всей машины. Но я знаю, что вы должны установить флажок Включить распределенный COM на этом компьютере .

Надеюсь, это поможет.

1 голос
/ 29 ноября 2008

Попробуйте посмотреть разрешения удаленной активации COM-сервера на удаленном компьютере через dcomcnfg.exe (должен открыть оснастку MMC).

-Oisin

...