以其他用户身份登录时实例化COM对象

时间:2014-09-22 15:51:54

标签: windows com

我们正在尝试与在提供COM接口的Windows XP盒上运行的应用程序进行交互。当非作为服务运行的应用程序作为与我们的测试代码相同的Windows用户运行时,我们能够实例化COM接口并对其进行调用而不会出现任何问题。我们正在使用一个简单的实例化:

using ServerLib;
...
ServerLib.ServerObject server = new ServerObject();

但是,当我们以不同的用户身份登录同一台计算机,因此服务器和应用程序在不同的进程空间下运行,并尝试运行相同的代码时,我们会收到错误消息:

An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll
Additional information: Retrieving the COM class factory for component with CLSID {BE8BD673-1442-449F-B56D-A7CC00DA1B0E} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).

系统事件查看器中的条目提供了一个线索:

The server {BE8BD673-1442-449F-B56D-A7CC00DA1B0E} did not register with DCOM within the required timeout.

Windows事件日志条目也提供了一些线索,但没有答案:

  1. 已创建新流程:
    新进程ID:3168
    图像文件名:C:\ BIN \ server.exe
    创建者进程ID:3348
    用户名:USERNAME
    域名:DOMAIN
    登录ID:(0x0,0x3E7)

  2. 为进程分配了主令牌。
    分配流程信息:
    进程ID:3348
    图像文件名:C:\ WINDOWS \ system32 \ winlogon.exe
    用户名:USERNAME
    域名:DOMAIN
    登录ID:(0x0,0x3E7)
    新工艺信息:
    进程ID:3168
    图像文件名:C:\ BIN \ server.exe
    用户名:CallingUser
    域名:DOMAIN
    登录ID:(0x0,0x217579E)

  3. 进程已退出:
    进程ID:3168
    图像文件名:C:\ BIN \ server.exe
    用户名:CallingUser
    域名:DOMAIN
    登录ID:(0x0,0x217579E)

  4. 我们还尝试了一些替代的实例化技术,比如这个尝试并附加到现有流程:

    ServerLib.ServerObject foo = (ServerLib.ServerObject)System.Runtime.InteropServices.Marshal.GetActiveObject("Server.ServerObject");
    

    这会出现以下错误:

    An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll
    Additional information: Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
    

    我们怀疑这个问题围绕着这样一个事实:我们的测试代码是在与托管COM接口的代码不同的登录名下运行的。我们不知道的是如何设置配置以允许我们使这项工作。托管COM接口的服务器是单例,并且无法启动副本以通过我们的客户端软件处理COM请求。

    在同一台计算机上获取客户端应用程序需要哪些步骤,但是在不同的进程空间下实例化COM接口并调用.exe文件主机中的方法?

0 个答案:

没有答案