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

2016-02-19 17:40 14 1 收藏

下面这个用户名不同的计算机之间的调用dcom教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

【 tulaoshi.com - 编程语言 】

  DCOM是依赖于RPC服务的,是一种分布式远程过程(进程)调用,调用代码在远程主机上执行,使用远程主机的系统资源,因此要有远程主机所属的访问权限,一般来说访问用户应是远程主机本地用户或主机所属的域用户,所以

  第一步是在远程主机或其域上注册(获得)一个有足够权限的用户,

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  第二步是使用此用户令牌激活远程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();

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  ----------------------------------

  修改后的例子:

  

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();

来源:http://www.tulaoshi.com/n/20160219/1615777.html

延伸阅读
标签: 电脑入门
一、前言 随着计算机技术的发展,各种外部设备也在不停的发展,用户可以根据自己的要求,选择不同的硬件配置,并组成自己的硬件系统。这时,将用户的硬件设备信息记录下来,以便在系统启动时能够明确硬件的系统配置和用户对硬件参数的设置,以保证计算机正常运行的参数设置称为系统参数设定。 其实,将计算机的配件组装在一起,只是组装了硬...
声明: DeclareFunctionSetComputerNameLib"kernel32"Alias"SetComputerNameA"(ByVallpComputerNameAsString)AsLong 使用: NewName="HelloWorld" SetComputerNameNewName->
1、致命的异常终止决不允许 2、以这个次序编写:用户手册、说明书、帮助、源代码 3、除非你使用Risk Factor Analysis (RFA),否则一个程序将花费双倍你认为开发所需的时间---重复工作 4、编码工作量应该不超过开发工作的百分之二十 5、测试应该至少占工程的百分之三十 6、注释应该至少要占源代码的百分之二十 ...
标签: 电脑入门
要进入BIOS设置,在系统启动时敲DEL键(或启动时第一屏上提示的键,通常的提示是:Press Delete to setup,或其他类似的句子)。如果的BIOS不能访问或者你不能进入CMOS设置,你就需要下载TweakBIOS,该软件不但会使你能极为简便地访 问CMOS,还能使你可以访问一些你以前不能访问的COMS设置项。 我们首先来看默认设置中被打开,但却被人工修改...
以远程计算机上的用户身份访问Com+应用 DELPHI程序员开发com+应用的速度是非常快的,其主要原因是其较好地封装了com+的windows底层功能,开发人员通过较为简单的类继承就避开了复杂的com+底层技术细节,使开发人员将精力放在应用本身的功能上面。Delphi在封装com+应用时采取了许多折衷,在保留通用性的同时也避开了一些实现起来困难但是应...

经验教程

587

收藏

48
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部