描述:
最近有一个问题一直很烦。我开发环境里面绝大多数电脑安装了com+应用程序都可以远程激活。但有两台电脑出现了问题,返回值总是“hr= 0x80004027 已禁用包含此组件或应用程序的组件“。这两台电脑的操作系统是win2003,而且我在其中一台电脑上安装了com+客户程序,可以运行。我怀疑是安全问题,但是却找不出答案。公司还有一台win2003也安装了同样的com+应用程序,结果一切正常。下面是我的激活代码:
// 设置客户方默认安全级别
HRESULT SetClientDefaultSecurity(
LPOLESTR wszUser, // 用户名
LPOLESTR wszDomain, // 服务器名
LPOLESTR wszPassword, // 密码
REFCLSID rclsid, // 组件GUID
MULTI_QI* mqi, // 多接口数组
int nItf // 数组中接口数
)
{
HRESULT hr = 0;
IUnknown* pIUnk = 0;
//
// The COAUTHIDENTITY structure represents a username and password
//
COAUTHIDENTITY auid;
auid.User = wszUser;
auid.UserLength = wcslen(wszUser);
auid.Domain = wszDomain;
auid.DomainLength = wcslen(wszDomain);
auid.Password = wszPassword;
auid.PasswordLength = wcslen(wszPassword);
auid.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
//
// The COAUTHINFO structure specifys the authentication settings
// used while making a remote activation request from the client
// machine to server machine.
//
COAUTHINFO auinfo;
auinfo.dwAuthnSvc = RPC_C_AUTHN_WINNT;
auinfo.dwAuthzSvc = RPC_C_AUTHZ_NONE;
auinfo.pwszServerPrincName = NULL;
auinfo.dwAuthnLevel = RPC_C_AUTHN_LEVEL_CONNECT;
auinfo.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
auinfo.pAuthIdentityData = &auid;
auinfo.dwCapabilities = EOAC_NONE;
//
// Indentifies a remote machine resource to the new or enhanced
// activation functions.
//
COSERVERINFO svrinfo;
svrinfo.dwReserved1 = 0;
svrinfo.dwReserved2 = 0;
svrinfo.pAuthInfo = &auinfo;
svrinfo.pwszName = wszDomain;
hr = CoCreateInstanceEx(rclsid, 0, CLSCTX_ALL, &svrinfo, nItf, mqi);
if ( FAILED(hr) )
return hr;
pIUnk = (IUnknown*) mqi[0].pItf;
if ( pIUnk == NULL )
return hr;
IClientSecurity* pcs = 0;
hr = pIUnk->QueryInterface(IID_IClientSecurity, (void**) &pcs);
if ( FAILED(hr) )
return hr;
for (int i=0; i < nItf; i++)
{
hr = pcs->SetBlanket(mqi[i].pItf,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE,
&auid,
EOAC_NONE);
if ( FAILED(hr) )
{
pcs->Release();
return hr;
}
}
pcs->Release();
return S_OK;
}