用户名不同的计算机之间的调用dcom[整理]

原创 2004年09月15日 14:41:00
DCOM是依赖于RPC服务的,是一种分布式远程过程(进程)调用,调用代码在远程主机上执行,使用远程主机的系统资源,因此要有远程主机所属的访问权限,一般来说访问用户应是远程主机本地用户或主机所属的域用户,所以
 
第一步是在远程主机或其域上注册(获得)一个有足够权限的用户,
第二步是使用此用户令牌激活远程COM服务器,方法是使用CoInitializeSecurity & CoCreateInstanceEx函数(见文后例子),成功激活后就得到相关请求接口的代理,此时代理并没有对远程服务器访问的权限,
第三步是为接口代理设置访问权限,方法是使用CoSetProxyBlanket函数,此后就可以使用代理指针进行方法调用了。见文后例子
以上是客户端要做的处理,至于服务器端,只要使用CoInitializeSecurity函数设置一下访问许可权限就可以了(有时客户端也要进行这一处理,比如使用了连接点),对于即存的服务器程序使用dcomcfg工具在注册表里设置也可以。
CoSetProxyBlanket函数调用例子:
*******************************
原例子:
IRecordServerLink* pRSL=(IRecordServerLink*)mq[0].pItf;
 
hr = CoSetProxyBlanket( pRSL, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL,
       RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, &caid, EOAC_NONE);
pRSL->Methods();
 
----------------------------------
修改后的例子:
hr = CoSetProxyBlanket( pAccount, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL,
       RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, &caid, EOAC_NONE);
pAccount->Deposit(x);
 
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
 
CoInitializeSecurity & CoCreateInstanceEx函数调用例子:
*********************************************************
例子1:
HRESULT hr;
hr =  CoInitialize(NULL);
ASSERT(SUCCEEDED(hr)); 
MULTI_QI qi;
qi.pIID = &IID_ICRemoteTime;
qi.hr = NULL;
qi.pItf = NULL;
COAUTHIDENTITY authidentity;
authidentity.User = L"administrator";   ////你机子的帐号
authidentity.UserLength = wcslen(authidentity.User);
authidentity.Domain = NULL;
authidentity.DomainLength = 0;
authidentity.Password = L"";          ////密码
authidentity.PasswordLength = wcslen(authidentity.User);
authidentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
COAUTHINFO authinfo = {-1, 0, 0, RPC_C_AUTHN_LEVEL_DEFAULT,
      RPC_C_IMP_LEVEL_IMPERSONATE, &authidentity, 0};
COSERVERINFO servInf;
servInf.dwReserved1 = NULL;
servInf.dwReserved2 = NULL;
// servInf.pAuthInfo = NULL;
servInf.pAuthInfo = &authinfo;
USES_CONVERSION;
servInf.pwszName = L"127.0.0.1";
hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
  RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_ACCESS_CONTROL, NULL);
ASSERT(SUCCEEDED(hr));
hr = CoCreateInstanceEx(CLSID_CRemoteTime, NULL, CLSCTX_REMOTE_SERVER, &servInf, 1, &qi);
if (FAILED(hr))
{
 TRACE(_T("CoCreateInstanceEx failed"));
 return false;;
}
if (FAILED(qi.hr))
{
 TRACE(_T("Failed to connect to server"));
 return false;;
}
//通过IUnkonwn指针去查询接口指针,返回IAccount指针
hr = pUnknown->QueryInterface(IID_ICRemoteTime,(void**)&pIRetime)
例子2:
HRESULT hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
  RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);
 
 COAUTHIDENTITY us;
 
 us.User           = m_strName.AllocSysString();
 us.UserLength     = wcslen(us.User);
 us.Password       = m_strPassword.AllocSysString();
 us.PasswordLength = wcslen(us.Password);
 us.Domain         = m_strDomain.AllocSysString();
 us.DomainLength   = wcslen(us.Domain);
 us.Flags          = SEC_WINNT_AUTH_IDENTITY_UNICODE;
 
 COAUTHINFO auth;
 
 auth.dwAuthnSvc           = RPC_C_AUTHN_WINNT;
 auth.dwAuthzSvc           = RPC_C_AUTHZ_NONE;
 auth.pwszServerPrincName  = NULL;
 auth.dwAuthnLevel         = RPC_C_AUTHN_LEVEL_CONNECT;
 auth.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
 auth.dwCapabilities       = EOAC_NONE;
 auth.pAuthIdentityData    = &us;
 
 COSERVERINFO si;
 MULTI_QI     qi;
 
 CComBSTR bstr = strComputer;
 LPWSTR name   = bstr.m_str;
 
 si.dwReserved1 = 0;
 si.pwszName    = name;
 si.pAuthInfo   = m_bAccess ? &auth : NULL;
 si.dwReserved2 = 0;
 
 IID iid = __uuidof(m_pIRemoteControl);
 qi.pIID = &iid;
 qi.pItf = NULL;
 
 do
 {
  hr = CoCreateInstanceEx(__uuidof(RemoteControl), NULL, CLSCTX_SERVER, &si, 1, &qi);
  if(FAILED(hr) || FAILED(qi.hr))
   break ;
  
  m_pIRemoteControl = (IRemoteControl *)qi.pItf;
 }while(0);
 
-----------------------------------
例子3:
HRESULT hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
  RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);
 
 COAUTHIDENTITY us;
 
 us.User           = m_strName.AllocSysString();
 us.UserLength     = wcslen(us.User);
 us.Password       = m_strPassword.AllocSysString();
 us.PasswordLength = wcslen(us.Password);
 us.Domain         = m_strDomain.AllocSysString();
 us.DomainLength   = wcslen(us.Domain);
 us.Flags          = SEC_WINNT_AUTH_IDENTITY_UNICODE;
 
 COAUTHINFO auth;
 
 auth.dwAuthnSvc           = RPC_C_AUTHN_WINNT;
 auth.dwAuthzSvc           = RPC_C_AUTHZ_NONE;
 auth.pwszServerPrincName  = NULL;
 auth.dwAuthnLevel         = RPC_C_AUTHN_LEVEL_CONNECT;
 auth.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
 auth.dwCapabilities       = EOAC_NONE;
 auth.pAuthIdentityData    = &us;
 

 MULTI_QI MultiQi={&IID_IUnknown,NULL,NOERROR}; 
 COSERVERINFO si;

 CComBSTR bstr = strComputer;
 LPWSTR name   = bstr.m_str;
 
 si.dwReserved1 = 0;
 si.pwszName    = name;
 si.pAuthInfo   = m_bAccess ? &auth : NULL;
 si.dwReserved2 = 0;
 
  hr = CoCreateInstanceEx(__uuidof(RemoteControl), NULL, CLSCTX_SERVER, &si, 1, &MultiQi);
  
 if(FAILED(hr))
 {
  MessageBox("创建对象实例失败!");
  return;
 }
   
  //通过IUnkonwn指针去查询接口指针,返回IAccount指针
 pUnknown = (IUnknown *) MultiQi.pItf;

 hr = pUnknown->QueryInterface(IID_IAccount,(void**)&pAccount);
 if(FAILED(hr))
 {
  MessageBox("没有查找的接口指针!");
  return false;
 }
 pUnknown->Release();

用户名不同的计算机之间的调用dcom

DCOM是依赖于RPC服务的,是一种分布式远程过程(进程)调用,调用代码在远程主机上执行,使用远程主机的系统资源,因此要有远程主机所属的访问权限,一般来说访问用户应是远程主机本地用户或主机所属的域用户...
  • embededvc
  • embededvc
  • 2014年01月29日 16:10
  • 1491

Delphi COM编程技术六(DCOM技术)

在Delphi中能实现远程调用的有DCOM或COM+,这两种方式实现起来非常的相似。DCOM属于旧版本的远程调用技术,非常实用,所提供的服务保存在应用程序工程中。COM+是新版本的远程调用技术,所提供...
  • zang141588761
  • zang141588761
  • 2016年04月26日 10:00
  • 658

DCOM服务端及客户端指定用户访问的安全设置

前言:对于分布式组件,在创建组件过程中常因权限问题导致出现“拒绝访问”,无法创建组件对象或使用接口。本人水平有限,只能谈些个人经验和体会,希望能抛砖引玉!   有两种方法能使得DCOM组件...
  • embededvc
  • embededvc
  • 2014年01月29日 06:04
  • 3419

DCOM 示例:演示如何远程调用 COM 对象

DCOM 示例:演示如何远程调用 COM 对象更新:2007 年 11 月DCOM 示例说明如何从运行于不同计算机上的多个客户端调用在 Windows 服务中实现的 COM 对象。它由三部分组成: D...
  • shixin_0125
  • shixin_0125
  • 2015年01月09日 14:29
  • 1560

DCOM远程调用权限设置

最近几天被搞得焦头烂额,由于原先开发的DCOM客户端程序s
  • ervinsas
  • ervinsas
  • 2014年07月02日 16:25
  • 7543

ngularJs项目实战05: 不同controller作用域之间通信的方式

不同controller作用域之间通信的方式详解
  • lai_xu
  • lai_xu
  • 2015年11月03日 10:42
  • 2497

OPC DCOM配置的一点经验

最近做了一个小项目,功能很简单,就是编写一个OPC客户端软件实现从OPC服务器上获取数据然后转存到DB中。项目虽小但是值得考虑的地方仍不少,所谓麻雀虽小,五脏俱全。...
  • rizhaolutong
  • rizhaolutong
  • 2014年03月03日 22:07
  • 4000

不同VLAN之间通信的原理

在划分VLAN后,不同VLAN之间不能直接进行二层通信。如果要实现VLAN间通信,可以采取以下3种方案之一。 1.三层VLANIF接口方案 这是一种通过计算机网络体系结构中第三层(网络层)来实现V...
  • u013903472
  • u013903472
  • 2015年07月19日 10:33
  • 7358

在DCOM 中不存在WORD、EXCEL等OFFICE组件

最近在做一个关于office转存PDF的Web项目。开发过程一切顺利。 起初在网上找到一些Word,PPT转PDF的代码。很好用。一切顺利项目开发成功。在这里需要说明一点,PPT中会存在流媒体内...
  • hanaixia2007
  • hanaixia2007
  • 2016年08月04日 11:47
  • 983

【三层架构】——COM/DCOM初识

背景:在学习三层架构的时候,知道三层分为UI层(表现层)、BLL层(业务逻辑层)、DAL层(数据访问层),相对于传统的二层架构(客户端和数据库)来说,多了一个中间层BLL(业务逻辑层),处于UI层和D...
  • zt15732625878
  • zt15732625878
  • 2016年03月23日 16:08
  • 1470
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用户名不同的计算机之间的调用dcom[整理]
举报原因:
原因补充:

(最多只允许输入30个字)