【问题标题】:QueryInterface fails with E_ACCESSDENIEDQueryInterface 失败并显示 E_ACCESSDENIED
【发布时间】:2011-06-28 07:36:46
【问题描述】:

以下方法是 DCOM 服务器方法。 COM 客户端和服务器在不同的 WinXP 机器上运行。 COM客户端调用RegisterClient方法注册回调接口。问题是QueryInterface 方法失败,错误代码为E_ACCESSDENIED。问题的原因可能是什么?

STDMETHODIMP CGEMExtension::RegisterClient(IUnknown** ppGEMExtensionEvents, int* nClientId, int* nResult)
{
    HRESULT  hRes = (*ppGEMExtensionEvents)->QueryInterface(IID_IGEMExtension,(void**)&pUnknown);
    return hRes;
}

【问题讨论】:

    标签: c++ com dcom


    【解决方案1】:

    当您收到 E_ACCESSDENIED 时,表示您有权限问题(不要浪费时间在防火墙或注册上 - 前者会引发错误,告诉您服务不可用,后者会告诉您课程是未注册左右)。 COM 依赖于 Windows 权限,所以这是你应该关注的。

    在您的情况下,如果我理解正确,服务器实际上会调用客户端,以获得正确的接口。为此,运行服务器的用户应该在客户端拥有正确的权限。一些建议:

    1. 正如 daramarak 建议的那样,让服务器和客户端使用相同的域用户,或使用相同密码的相同本地用户。
    2. 在客户端,将this setting 设置为“经典”。
    3. 使用DCOMCNFG 向服务器用户(如果客户端知道)授予额外权限。

    【讨论】:

    • +1 非常好的答案,我建议使用 alt。 1 让一切正常工作,并在一切正常运行时使用 dcomcnfg 进行配置,您还可以使用 dcom api 中包含的安全功能来获取正确的权限。
    • 我们有两台 DCOM 服务器。 QueryInterface 方法在 DCOM 服务器 A 上运行良好。在这种情况下,客户端对象是使用 CoCreateInstance 方法创建的。在失败的情况下,对象是使用 CComObject::CreateInstance(&pExtensionSink) 创建的。会是这个原因吗
    • @Maanu 我不知道。其他一切都一样吗?我认为问题出在服务器端,但我可能会遗漏一些东西。我不确定这是否适合您的情况,但请在调用 QueryInterface 之前尝试在 ppGEMExtensionEvents 上set a security blanket。首先在客户端上硬编码一些本地管理员的用户名和密码,如果可行,请按照自己的方式找到一个真正灵活的解决方案。
    • @eran 你的 DCOMCNFG 链接失效了
    • @daramarak,该链接对我仍然有效。对你来说它还是死了吗?
    【解决方案2】:

    这可能是因为另一台计算机上的正确权限错误。检查这一点的最简单方法是使用 secpol (本地策略、审核策略、打开登录事件和对象访问的日志记录)打开日志记录,然后您可以查看您是否正在尝试访问另一台计算机。

    如果您只是在测试,那么我建议您在组件服务中的 com 对象上使用“以交互式用户身份运行”设置,并确保您在两台机器上拥有相同的用户和相同的密码。然后,您必须在客户端计算机上以普通用户身份运行。也可以将用户设置为普通用户。

    作为调试 DCOM 连接的一般建议:关闭所有防火墙等以确保连接正常,然后一一开启安全措施,确保打开正确的端口和正确的用户拥有正确的权限。

    【讨论】:

      【解决方案3】:

      我给你我的经验,即使它可能并不直接适用于你的具体情况。

      在 64 位的 Windows 7 上,我有一个用 x64 编译的 exe 和一个用 32 位编译的 dll。

      COM 对象存在于 dll 中。

      exe(由“普通”用户启动)创建 COM 对象(在同一台计算机上)请求IUnknown,并且创建成功。然后 exe 通过QueryInterface 请求不同的接口,并以E_ACCESSDENIED 失败。

      如果我“以管理员身份”启动 exe,那么 QueryInterface 将返回 S_OK

      我没有进一步调查,我怀疑有一些关于 32 位 - 64 位交互的政策。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        • 2015-12-31
        • 2021-12-10
        • 2020-02-08
        • 2011-05-21
        • 2012-05-04
        相关资源
        最近更新 更多