请教DCOM的客户端和组件端如何配置 请教DCOM的客户端和组件端如何配置?初学COM,敬请帮助。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 转录一部分: 使用DCOM,客户端和服务器要如何进行网络配置? 由 Romain 于 October 15, 1999 21:50:47:正文内容: 1,确认你的COMPONENT不是in-process dll2,确认你的95能用DCOM,看一下:HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\OLE\的ENABLEDCOM 是否为Y。3确认你的95和NT能够网络通讯。4,修改你的Component注册CODE,用CLSCTX_ALL: CoRegisterClassObject(clsid,***,CLSCTX_ALL,***,***)5,客户端call CoCreateInstance时,用CLSCTX_ALL or CLSCTX_REMOTE_SERVER.6,如果还不行,则CALL COM时,干脆写上你的SERVER名,用:CoCreateInstanceEx(CLSID,NULL,CLSCTX_REMOTE_SERVER,&ServerInfo,1,&mqi);其中ServerInfo是:COSERVERINFO ServerInfo;memset(&ServerInfo,0,sizeof(ServerInfo));ServerInfo.pwszName=L"MyRemoteServer";7,如果还不行,估计是Security问题,但出现的错误已不是"can't find RPC server". 现在产生的问题是,系统提示没有访问权限。然后我到服务器端查看系统事件,提示:2002/05/26 17:26:09 启动DCOM 服务器的访问被拒绝服务器 {B693798-10BF-430C-A26F-E6DEE2EB9BA} 用户名 Unavailable/Unavailable SID=Unavailable.那么应该在服务器上怎样配置安全配置呢?thank you! 第一步:如果你建立组件时候使用的是exe,则在组件的实现类的构造函数中加入初始化安全性函数调用,如下:HRESULT hr = 0;hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);如果建立组件时使用的是exe(Service),则在组件的实现类中,你可以看见一个名为CServiceModule的类,在他的Run函数中,使用如下的代码替换原来函数中的相应部分: CSecurityDescriptor sd; sd.InitializeFromThreadToken();/* hr = CoInitializeSecurity(sd, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);*/hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);注意,注释部分是系统原来生成的函数,我们不使用它,注释下面的是我们的。第二步:在调用组件的客户端服务程序中,进行如下编码:CoInitialize(NULL);HRESULT hr = 0;第一步:如果你建立组件时候使用的是exe,则在组件的实现类的构造函数中加入初始化安全性函数调用,如下:HRESULT hr = 0;hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);如果建立组件时使用的是exe(Service),则在组件的实现类中,你可以看见一个名为CServiceModule的类,在他的Run函数中,使用如下的代码替换原来函数中的相应部分: CSecurityDescriptor sd; sd.InitializeFromThreadToken();/* hr = CoInitializeSecurity(sd, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);*/hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);注意,注释部分是系统原来生成的函数,我们不使用它,注释下面的是我们的。第二步:在调用组件的客户端服务程序中,进行如下编码:CoInitialize(NULL);HRESULT hr = 0;hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);此后,必须使用CoCreateInstanceEx创建组件,进行如下设置:COAUTHIDENTITY AuthorIdentity;AuthorIdentity.Domain = L"工作组";AuthorIdentity.DomainLength = wcslen(L"工作组");AuthorIdentity.User = L"服务器端的一个用户名称";AuthorIdentity.UserLength = wcslen(L"服务器端的一个用户名称");AuthorIdentity.Password = L"相应用户密码";AuthorIdentity.PasswordLength = wcslen(L"相应用户密码");AuthorIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;COAUTHINFO AuthorInfo;AuthorInfo.dwAuthnSvc = RPC_C_AUTHN_WINNT;AuthorInfo.dwAuthzSvc = RPC_C_AUTHN_NONE;AuthorInfo.pwszServerPrincName = NULL;AuthorInfo.dwAuthnLevel = RPC_C_AUTHN_LEVEL_CONNECT;AuthorInfo.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;AuthorInfo.pAuthIdentityData = &AuthorIdentity;AuthorInfo.dwCapabilities = EOAC_NONE;COSERVERINFO ServerInfo;ServerInfo.dwReserved1 = 0;ServerInfo.dwReserved2 = 0;ServerInfo.pAuthInfo = &AuthorInfo;ServerInfo.pwszName = L"组件所在的服务器名称";第三步:在存放组件的服务器上,建立一个用户,比如test,隶属于Users,密码:1234。第四步:在服务器上注册组件,假设你的组件名字是atltest.exe,生成组件时候,在工程目录下面有一个atltestps.mk文件,你应该使用nmake -f atltestps.mk生成一个atltestps.dll文件。注册如下:atltest.exe /regserverregsvr32 atltestps.dll第五步:使用dcomcnfg.exe配置组件:在“应用程序”中,选中你的组件,选择“属性”,在弹出的对话框中,选择“安全性”,选中“使用自定义访问权限”,然后选择“编辑”,将Everyone用户添加进来; 然后,再选择“使用自定义启动权限”,选择“编辑”,将Everyone用户添加进来。这样,就OK了。 诸位同仁上下班,在路上花费多长时间。在路上都干些什么? MFC的CTabCtrl里的子窗口怎么控制CTabCtrl外面的控件? 关于CoInitializeEx(NULL, COINIT_MULTITHREADED)的问题,痛苦中。。 tcp zerowindow的问题 求救...VC/MFC odbc连接数据库添加记录异常如何处理 有谁了解manifest文件的 Edit控件保存上次文字问题? 有哪位大虾能详细介绍一下CHtmlView的用法。谢谢! 如何编写midi的程序? 各位高手小弟有一问题,请指教是c++ VC6 IDE的简单问题
正文内容: 1,确认你的COMPONENT不是in-process dll
2,确认你的95能用DCOM,
看一下:
HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\OLE\
的ENABLEDCOM 是否为Y。
3确认你的95和NT能够网络通讯。
4,修改你的Component注册CODE,用CLSCTX_ALL:
CoRegisterClassObject(clsid,***,CLSCTX_ALL,***,***)
5,客户端call CoCreateInstance时,用CLSCTX_ALL or
CLSCTX_REMOTE_SERVER.
6,如果还不行,则CALL COM时,干脆写上你的SERVER名,
用:CoCreateInstanceEx(CLSID,NULL,CLSCTX_REMOTE_SERVER,
&ServerInfo,1,&mqi);
其中ServerInfo是:
COSERVERINFO ServerInfo;
memset(&ServerInfo,0,sizeof(ServerInfo));
ServerInfo.pwszName=L"MyRemoteServer";
7,如果还不行,估计是Security问题,但出现的错误已不是"can't find RPC server".
提示:
2002/05/26 17:26:09
启动DCOM 服务器的访问被拒绝
服务器 {B693798-10BF-430C-A26F-E6DEE2EB9BA}
用户名 Unavailable/Unavailable SID=Unavailable.那么应该在服务器上怎样配置安全配置呢?
thank you!
如果你建立组件时候使用的是exe,则在组件的实现类的构造函数中加入初始化安全性函数调用,如下:HRESULT hr = 0;
hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);如果建立组件时使用的是exe(Service),则在组件的实现类中,你可以看见一个名为CServiceModule的类,在他的Run函数中,使用如下的代码替换原来函数中的相应部分: CSecurityDescriptor sd;
sd.InitializeFromThreadToken();
/*
hr = CoInitializeSecurity(sd, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
*/
hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);注意,注释部分是系统原来生成的函数,我们不使用它,注释下面的是我们的。第二步:
在调用组件的客户端服务程序中,进行如下编码:
CoInitialize(NULL);
HRESULT hr = 0;
第一步:
如果你建立组件时候使用的是exe,则在组件的实现类的构造函数中加入初始化安全性函数调用,如下:HRESULT hr = 0;
hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);如果建立组件时使用的是exe(Service),则在组件的实现类中,你可以看见一个名为CServiceModule的类,在他的Run函数中,使用如下的代码替换原来函数中的相应部分: CSecurityDescriptor sd;
sd.InitializeFromThreadToken();
/*
hr = CoInitializeSecurity(sd, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
*/
hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);注意,注释部分是系统原来生成的函数,我们不使用它,注释下面的是我们的。第二步:
在调用组件的客户端服务程序中,进行如下编码:
CoInitialize(NULL);
HRESULT hr = 0;
hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);
此后,必须使用CoCreateInstanceEx创建组件,进行如下设置:COAUTHIDENTITY AuthorIdentity;
AuthorIdentity.Domain = L"工作组";
AuthorIdentity.DomainLength = wcslen(L"工作组");
AuthorIdentity.User = L"服务器端的一个用户名称";
AuthorIdentity.UserLength = wcslen(L"服务器端的一个用户名称");
AuthorIdentity.Password = L"相应用户密码";
AuthorIdentity.PasswordLength = wcslen(L"相应用户密码");
AuthorIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;COAUTHINFO AuthorInfo;
AuthorInfo.dwAuthnSvc = RPC_C_AUTHN_WINNT;
AuthorInfo.dwAuthzSvc = RPC_C_AUTHN_NONE;
AuthorInfo.pwszServerPrincName = NULL;
AuthorInfo.dwAuthnLevel = RPC_C_AUTHN_LEVEL_CONNECT;
AuthorInfo.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
AuthorInfo.pAuthIdentityData = &AuthorIdentity;
AuthorInfo.dwCapabilities = EOAC_NONE;COSERVERINFO ServerInfo;
ServerInfo.dwReserved1 = 0;
ServerInfo.dwReserved2 = 0;
ServerInfo.pAuthInfo = &AuthorInfo;
ServerInfo.pwszName = L"组件所在的服务器名称";第三步:
在存放组件的服务器上,建立一个用户,比如test,隶属于Users,密码:1234。第四步:
在服务器上注册组件,假设你的组件名字是atltest.exe,生成组件时候,在工程目录下面有一个atltestps.mk文件,你应该使用nmake -f atltestps.mk生成一个atltestps.dll文件。注册如下:
atltest.exe /regserver
regsvr32 atltestps.dll第五步:
使用dcomcnfg.exe配置组件:在“应用程序”中,选中你的组件,选择“属性”,在弹出的对话框中,选择“安全性”,选中“使用自定义访问权限”,然后选择“编辑”,将Everyone用户添加进来; 然后,再选择“使用自定义启动权限”,选择“编辑”,将Everyone用户添加进来。这样,就OK了。