Articles of dcom

从Windows到Linux的RPC

有一些(工作)的例子如何创buildRPC从Windows到Linux? 客户端应该是Windows NT应用程序,服务器是Linux。 它需要是MSRPC 。 没有Corba,没有XML-RPC,SUN-RPC等等 MSDN说: RPC可用于基于Windows操作系统的所有客户机/服务器应用程序。 它还可以用于为包括Unix和Apple等操作系统的异构networking环境创build客户端和服务器程序。 不幸的是,在谷歌上花了几个小时后,我放弃了。 我的期望: Linux节点应该安装了samba,因为它们的MSRPC实现工作。 使用IDL文件,我为客户端和服务器生成存根 客户端使用MSVC构build 服务器使用gcc与samba(或其他库)的一些包含/库构build, Linux节点必须具有这样的RPC端口映射器 有人能指出我吗?

为什么“本地启动”默认允许外部服务器,但“本地激活”不是?

我现在需要在ASP.NET处理程序中创build一个由out-proc COM服务器提供的COM对象。 所以每次我部署COM服务器,我必须启动DCOMconfiguration并更改安全设置。 具体而言,我需要确保本地用户ASPNET允许“本地启动”和“本地激活”。 我惊讶的是,当我打开相关的设置页面“本地启动”已经被允许,但“本地激活”是不允许的。 这没有任何意义 – 为什么我需要这样的权限组合?

办公自动化的DCOM失败

我开发了一个C#程序,从SQL Server数据库中提取数据,然后生成包含数据的Word文档。 我已经将该程序设置为在Windows Server 2003框中作为SSIS作业的一部分运行。 该程序以不具有pipe理权限的用户SQLSVC运行。 当我以SQLSVC身份login并运行该程序时,它将正确执行。 但是,当程序自动作为SSIS作业运行时,会冻结在以下代码行中 Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application(); 当我强制终止进程时,会生成以下错误消息。 Error Message: System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80080005. at IepGlance.Program.CreateNewIepFiles(Dictionary`2 iepDictionary, EasyIepDataContext dbContext) at IepGlance.Program.Main(String[] args) 据我所知,问题是与DCOM权限。 我已经使用dcomcnfg将所有可能的DCOM权限添加到用户SQLSVC,但是这没有帮助。 还有其他可能的解决scheme吗?

InvokeHelper()抛出Access被拒绝exception

社区,我相当有趣,同时又有很重的问题。 我有VB.NET应用程序+服务+ C + +应用程序。 C ++应用程序生成一些数据,并使用InvokeHelper()方法进行callback: InvokeHelper(0x60030000, DISPATCH_METHOD, VT_EMPTY, NULL, parms, eventType, eventValue); 第一个参数是应该调用的方法的缺点。 奇怪的做法,但这不是我的代码,我不能改变这种方式。 在服务中,我有方法标记dispid属性从C ++应用程序获取此callback。 <DispId(&H60030000)> Public Sub ServerEvent(ByVal vEventType As Integer, ByVal vEventValue As Object) RaiseEvent ControlPanelStateChange(vEventType, vEventValue) End Sub 如果我以pipe理员身份login,此代码正常工作。 但是,如果windows用户没有pipe理员权限,在调用InvokeHelper()方法之后,会发生下一个exception: application.exe中0x75B7C42D(KernelBase.dll)的第一次机会exception:0x80070005:访问被拒绝 你有什么想法? 我玩DCOM的权限,但结果是一样的。 任何帮助将是太棒了!

DCOM中的模拟如何工作?

我有一个使用OLE自动编组器的DCOM客户端和服务器应用程序。 它们在同一台PC上运行时工作正常,但是当服务器在不同的PC上不在同一个域中时,我得到E_ACCESSDENIED(0x80070005)。 使用dcomcnfgconfiguration服务器PC,以便将所有DCOM对象的访问权限授予在客户端上指定其login名和密码的用户。 ServerApp及其types库在服务器PC上注册。 types库也在客户端PC上注册。 我直接在ClientApp中指定服务器名称,所以就我所知,客户端PC上不需要configurationdcomcnfg。 CreateInstanceEx()与服务器名称,login,域和密码工作正常。 它返回IUnknown,同时在服务器PC上启动ServerApp。 但是,当我尝试QueryInterface()为服务器支持的接口,我得到E_ACCESSDENIED。 分析安全事件日志,我有两个logging: 首先,用户在ClientApp中指定的凭据成功进行networkinglogin。 当我调用CreateInstanceEx()时会发生这种情况。 接下来, 我在客户端PC上login的用户login失败。 由于两台PC不在一个域中,所以该用户对于服务器PC是未知的。 现在,为什么这个用户会login到服务器,特别是当我调用QueryInterface的所有东西? 研究CreateInterfaceEx参数,似乎有某种模拟机制正在进行。 但是谁扮演谁还不清楚。 有三个用户凭证参与: ServerApp在服务器PC上运行的用户(在dcomcnfg中configuration)。 连接时ClientApp指定的用户的用户。 用户ClientApp在客户端PC上运行的凭据。 无论你如何看待它,如果涉及#3,它是一个用户太多。 如果DCOM要在服务器PC上识别/模拟#3,为什么我需要指定#2的凭据? 到了什么地步? DCOM假冒#2似乎是合乎逻辑的,因为这是我明确指定的凭据。 但为什么第二次login尝试呢? 有人能解释一下模拟是如何工作的,而且如果有一种方法可以忽略它并以dcomcnfg中指定的用户身份运行?

什么是最接近Windows COM / DCOM的Linux世界?

比pipe道/套接字更高层次,更全面吗?

我如何configurationDCOM将我的DLL加载到一个单独的进程?

我试图强制一个现有的本地C + + ATL in-proc COM服务器到一个单独的进程。 我希望DCOM可以做到这一点,而无需更改COM服务器。 我开始使用通常的registry设置 – 我有一个HKCR \ CLSID {classId}条目和一个InProcServer32键指定.dll文件的path。 我生成了一个应用程序ID(GUID)并将其添加到这里和那里。 具体来说,我在HKCR \ CLSID {classId}下添加了一个等同于应用程序ID的string值“AppId”。 我还添加了一个HKCR \ AppId {applicationId}键和一个string值“DllSurrogate”等于一个空string。 我认为这足以迫使我的COM服务器进入一个默认的系统提供的代理。 DCOM应用程序出现在DCOMconfiguration控制台中。 但是,当我调用CoCreateInstance()或CoGetClassObject()并提供类ID和CLSCTX_LOCAL_SERVER它返回“类未注册”。 我究竟做错了什么? UPD:解决。 所采取的步骤足以使其工作,除了我编辑registry的错误的类ID由于某种原因在InProcServer32键下有相同的path – 也许这是一个COM地狱问题。