抱歉,如果这有点长,请考虑一下:
我在名为 Company 的命名空间中有一个 COM+ 应用程序,它公开一个名为 Server 的对象,该对象具有以下方法:
bool Server.Execute(IOptions options)
IOptions Server.CreateOptions()
IOptions 仅具有几个 bool 读/写属性,如下所示:
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);
我在机器 A 上安装 COM+ 应用程序,然后在机器 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 上执行客户端应用程序,一切正常。
如果我在计算机 B 上安装 COM+ 应用程序作为计算机 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
总而言之,为什么当客户端与 COM+ 应用程序位于同一台计算机上时,我可以实现自己的 IOptions 并在 COM+ 应用程序中使用它,但当客户端通过另一台计算机上的代理访问 COM+ 应用程序时却不能?
看起来,如果 IOptions 是由服务器创建的,那就没问题,但如果它是由客户端创建的,那就不行了。
任何帮助将不胜感激。
谢谢
卡尔。
最佳答案
我将推断一些旧的 DCOM 经验,这可能有帮助,也可能没有帮助。当您访问被拒绝时,您必须查看机器 B 上的 DCOM 配置参数。
在较旧的操作系统 (Windows 2000) 上,您将运行 dcomcnfg。但在 XP 中,您可以从控制面板 - 管理工具运行组件服务。显然,在 Vista 下,您必须运行 windows\System32\comexp.msc。
当您处于组件服务管理中时,突出显示我的电脑并选择属性。您要做的第一件事是在默认属性选项卡上,单击在此计算机上启用分布式 COM。此外,您可能需要在COM 安全选项卡中指定启动和激活和访问权限。这样做时,您可能必须同时处理编辑限制和编辑默认值?
请注意,我相信这些是默认权限,您可能希望在应用程序列表中找到您注册的 COM+ 应用程序,并设置特定于应用程序的访问权限,而不是计算机范围的默认权限。但我知道您必须选中在此计算机上启用分布式 COM 复选框。
我希望这会有所帮助。
关于c# - 为什么从代理调用 COM+ 方法时会出现 E_ACCESSDENIED?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/327805/