我厌倦了尝试实例化一个远程对象。
使用dcomcnfg,对所有Windows 7,相同的工作组PC启用访问权限。
CoInitializeEx(0,COINIT_APARTMENTTHREADED);
CoInitializeSecurity(0, -1, NULL, NULL,RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
COAUTHINFO ca = {0};
ca.dwAuthnSvc = RPC_C_AUTHN_WINNT;
ca.dwAuthzSvc = RPC_C_AUTHZ_NONE;
ca.dwAuthnLevel = RPC_C_AUTHN_LEVEL_DEFAULT;
ca.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
COAUTHIDENTITY id = {0};
ca.pAuthIdentityData = &id;
id.User = (USHORT*)<username>;
id.UserLength = length;
id.Password = (USHORT*)<password>;
id.PasswordLength = pwdlength;
id.Domain = (USHORT*)L"WORKGROUP";
id.DomainLength = 9;
id.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
COSERVERINFO c = {0};
c.pwszName = L"192.168.10.3";
c.pAuthInfo = &ca;
MULTI_QI res = {0};
res.pIID = &TheIID;
HRESULT hr = CoCreateInstanceEx(TheCLSID,0,CLSCTX_REMOTE_SERVER,&c,1,&res);
始终是E_ACCESSDENIED。顺便说一句,这个示例(http://support.microsoft.com/kb/259011)的工作原理。但我找不到它的来源。
服务器还调用具有相同级别的CoInitializeSecurity()。
当定位Windows XP计算机时,CoCreateInstanceEx()返回S_OK,但未创建服务器。在定位Windows 7时,E_ACCESSDENIED。
任何线索? 此外,工作样品不使用U + P.也许我应该尝试一个匿名电话?
答案 0 :(得分:0)
我有它的工作......
我对您的代码示例有一些观察:
在CoInitializeSecurity中对SOLE_AUTHENTICATION_LIST使用NULL;我使用与CoCreateInstanceEx
您使用RPC_C_AUTHN_LEVEL_DEFAULT;我使用RPC_C_AUTHN_LEVEL_CONNECT
希望这会有所帮助。我可以建议您将DCOM作为标签添加到您的问题中...这将向您显示DCOM相关问题。这也帮助了我。
SEC_WINNT_AUTH_IDENTITY authIdent;
std::wstring domain = string_cast<std::wstring>(commandLineOptions["domain"].as<std::string>());
std::wstring username = string_cast<std::wstring>(commandLineOptions["username"].as<std::string>());
std::wstring password = string_cast<std::wstring>(commandLineOptions["password"].as<std::string>());
authIdent.Domain = reinterpret_cast<unsigned short*>(const_cast<wchar_t*>(domain.c_str()));
authIdent.DomainLength = wcslen(reinterpret_cast<const wchar_t*>(authIdent.Domain));
authIdent.User = reinterpret_cast<unsigned short*>(const_cast<wchar_t*>(username.c_str()));
authIdent.UserLength = wcslen(reinterpret_cast<const wchar_t*>(authIdent.User));
authIdent.Password = reinterpret_cast<unsigned short*>(const_cast<wchar_t*>(password.c_str()));
authIdent.PasswordLength = wcslen(reinterpret_cast<const wchar_t*>(authIdent.Password));
authIdent.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
/*
SOLE_AUTHENTICATION_INFO authInfo[2];
authInfo[0].dwAuthnSvc = RPC_C_AUTHN_WINNT;
authInfo[0].dwAuthzSvc = RPC_C_AUTHZ_NONE;
authInfo[0].pAuthInfo = &authIdent;
authInfo[1].dwAuthnSvc = RPC_C_AUTHN_GSS_KERBEROS;
authInfo[1].dwAuthzSvc = RPC_C_AUTHZ_NONE;
authInfo[1].pAuthInfo = &authIdent;
SOLE_AUTHENTICATION_LIST authList;
authList.cAuthInfo = 2;
authList.aAuthInfo = authInfo;
*/
SOLE_AUTHENTICATION_INFO authInfo[1];
authInfo[0].dwAuthnSvc = RPC_C_AUTHN_WINNT;
authInfo[0].dwAuthzSvc = RPC_C_AUTHZ_NONE;
authInfo[0].pAuthInfo = &authIdent;
SOLE_AUTHENTICATION_LIST authList;
authList.cAuthInfo = 1;
authList.aAuthInfo = authInfo;
HRESULT hr = CoInitializeSecurity(
nullptr, // pVoid
-1, // cAuthSvc
nullptr, // asAuthSvc
nullptr, // pReserved1,
RPC_C_AUTHN_LEVEL_CONNECT, // dwAuthnLevel,
RPC_C_IMP_LEVEL_IMPERSONATE, // dwImpLevel,
&authList, // pAuthList,
EOAC_NONE, // dwCapabilities,
nullptr); // pReserved3
答案 1 :(得分:0)
我的错误类没有在我的xp机器上注册,而相同的代码在Windows Server 2003上运行正常
IGPM *pGPM = NULL;
hr = CoCreateInstance(CLSID_GPM, NULL, CLSCTX_INPROC_SERVER, IID_IGPM , (LPVOID*)&pGPM);