对不起,如果这有点长wh ...请考虑一下:
我在名为公司的名称空间中有一个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);
我在机器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 +应用程序时? / p>
似乎如果IOptions是由服务器创建的那么它很好,但是如果它是由客户端创建的那么它就不是。
非常感谢任何帮助。
谢谢,
卡尔。
答案 0 :(得分:2)
我将推断一些使用DCOM的旧体验,这可能会有所帮助,也可能没有帮助。当您拒绝访问时,您必须查看计算机B上的DCOM配置参数。
在较旧的操作系统(Windows 2000)上,您将运行 dcomcnfg 。但在XP中,您可以从“控制面板” - “管理工具”运行“组件服务”。显然,在Vista下,你必须运行windows \ System32 \ comexp.msc。
进入组件服务管理时,突出显示“我的电脑”并选择“属性”。您要做的第一件事是在默认属性标签上,点击在此计算机上启用分布式COM 。此外,您可能需要在 COM安全标签中指定启动和激活以及访问权限。这样做时,您可能必须同时处理编辑限制和编辑默认值?
请注意,我认为这些是DEFAULT权限,您可能希望在应用程序列表中找到已注册的COM +应用程序,并设置特定于应用程序的访问权限,而不是机器范围的默认值。但我知道您必须检查在此计算机上启用分布式COM 复选框。
我希望这会有所帮助。
答案 1 :(得分:1)
尝试通过dcomcnfg.exe查看远程计算机上COM服务器的远程激活权限(应该打开MMC管理单元)。
-Oisin