Извините, если это немного долго насмехается ... подумайте об этом:
У меня есть приложение 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);
Я снова запускаю клиентское приложение на машине А, и все в порядке.
Если я устанавливаю приложение 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 + через прокси на другом компьютере?
Кажется, что если IOptions был создан сервером, тогда все в порядке, но если он создан клиентом, то это не так.
Любая помощь будет принята с благодарностью.
Спасибо,
Карл.





Попробуйте посмотреть разрешения удаленной активации COM-сервера на удаленном компьютере через dcomcnfg.exe (должен открыться MMC snapin).
-Oisin
Я собираюсь экстраполировать некоторый предыдущий опыт работы с DCOM, который может оказаться полезным, а может и не оказаться. Когда вы получаете отказ в доступе, вам нужно посмотреть параметры конфигурации DCOM на машине B.
В более старых ОС (Windows 2000) вы должны запустить dcomcnfg. Но в XP вы запускаете службы компонентов из Панели управления - Администрирование. Под Vista, видимо, придется запускать windows \ System32 \ comexp.msc.
Когда вы находитесь в администрировании служб компонентов, выделите «Мой компьютер» и выберите свойства. Первое, что вам нужно сделать, это на вкладке Свойства по умолчанию нажать Включить распределенный COM на этом компьютере. Кроме того, вам может потребоваться указать разрешения Запустить и активировать и Доступ на вкладке COM Безопасность. При этом вам, возможно, придется иметь дело как с Edit Limits, так и с Edit Defaults?
Обратите внимание: я считаю, что это разрешения ПО УМОЛЧАНИЮ и что вы можете найти свое зарегистрированное приложение COM + в списке приложений и установить права доступа для конкретного приложения, а не значения по умолчанию для всей машины. Но я знаю, что вы должны установить этот флажок Включить распределенный COM на этом компьютере.
Надеюсь, это поможет.
Я подозреваю, что Декер и Ойсин находятся на правильном пути в отношении разрешений, поскольку фактически машина A выполняет код с машины B, но какие права доступа установить для меня - загадка.