代码之家  ›  专栏  ›  技术社区  ›  Carl

为什么从代理调用COM+方法时会被E_u AccessDenied?

  •  2
  • Carl  · 技术社区  · 16 年前

    抱歉,如果这是一个有点长的抱怨…考虑一下:

    我在一个名为 单位 公开一个名为 服务器 有以下方法:

    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机上执行客户端,一切正常。

    然后,我修改客户端应用程序,以便它创建自己的ioption实现,如下所示:

    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+应用程序作为计算机A的代理安装到计算机B上,然后执行客户端,则在调用以下对象时会收到E_AccessDenied错误:

    s.Execute(clientOptions);
    

    下面是在访问机器A的机器B上执行的代码摘要

    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是由服务器创建的,那么就没问题,但是如果ioptions是由客户端创建的,那么就没有问题。

    任何帮助都将不胜感激。

    谢谢,

    卡尔。

    2 回复  |  直到 13 年前
        1
  •  2
  •   Howard Pinsley    16 年前

    我将推断一些与DCOM有关的旧经验,这些经验可能有帮助,也可能没有帮助。当访问被拒绝时,必须查看计算机B上的DCOM配置参数。

    在旧操作系统(Windows2000)上,您可以运行 组件服务 . 但是在xp中,您可以从控制面板(管理工具)运行组件服务。显然,在vista下,必须运行windows\system32\comexp.msc。

    在“组件服务管理”中,突出显示“我的计算机”并选择“属性”。你要做的第一件事就是 默认属性 Tab,点击 在此计算机上启用分布式COM . 另外,您可能需要指定 启动并激活 通路 中的权限 COM安全性 制表符。执行此操作时,可能需要同时处理编辑限制和编辑默认值?

    请注意,我相信这些是默认权限,您可能希望在应用程序列表中找到已注册的COM+应用程序,并设置特定于应用程序的访问权限,而不是计算机范围的默认权限。但我知道你得检查一下 在此计算机上启用分布式COM 复选框。

    我希望这能有帮助。

        2
  •  1
  •   x0n    16 年前

    尝试通过dcomcnfg.exe查看COM服务器在远程计算机上的远程激活权限(应打开MMC管理单元)。

    -奥辛