CoCreateInstanceEx renvoie S_OK avec des informations d’identification non valides sur Win2003

J’écris une application client qui est connectée à distance à un serveur. Je dois usurper l’identité de l’utilisateur avec lequel mon client va travailler.

Ceci est l’extrait de mon code:

COAUTHIDENTITY coAuthIdentity, *pCoAuthIdentity; COAUTHINFO coAuthInfo; CComBSTR bstrDomain(domain), bstrServer(server); CComBSTR bstrUser(user), bstrPassword(password); CComBSTR bstrServerPrincName(domain); bstrServerPrincName.Append(L"\\"); bstrServerPrincName.Append(server); coAuthIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; coAuthIdentity.Domain = (USHORT *)bstrDomain.m_str; coAuthIdentity.DomainLength = bstrDomain.Length(); coAuthIdentity.Password = (USHORT *)bstrPassword.m_str; coAuthIdentity.PasswordLength = bstrPassword.Length(); coAuthIdentity.User = (USHORT *)bstrUser.m_str; coAuthIdentity.UserLength = bstrUser.Length(); pCoAuthIdentity = &coAuthIdentity; *ppCoAuthIdentity = pCoAuthIdentity; coAuthInfo.dwAuthnSvc = RPC_C_AUTHN_DEFAULT; // Have COM negotiate the best authentication service coAuthInfo.dwAuthzSvc = RPC_C_AUTHZ_NONE; coAuthInfo.pwszServerPrincName = bstrServerPrincName; coAuthInfo.dwAuthnLevel = RPC_C_AUTHN_LEVEL_DEFAULT; coAuthInfo.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE; coAuthInfo.pAuthIdentityData = &coAuthIdentity; coAuthInfo.dwCapabilities = EOAC_NONE; COSERVERINFO coServerInfo; ::memset(&coServerInfo, 0, sizeof(COSERVERINFO)); coServerInfo.pwszName = bstrServer; coServerInfo.dwReserved1 = 0; coServerInfo.pAuthInfo = &coAuthInfo; coServerInfo.dwReserved2 = 0; MULTI_QI multiQI = { &__uuidof(IServer), 0, 0 }; TCHAR name [MAX_COMPUTERNAME_LENGTH + 1]; DWORD size = sizeof(name); DWORD dwServer = CLSCTX_SERVER; if (::GetComputerName(name, &size) != 0) { if (_wcsicmp(name, coServerInfo.pwszName)) dwServer = CLSCTX_REMOTE_SERVER; else dwServer = CLSCTX_LOCAL_SERVER; } else { DWORD dwError = GetLastError(); return HRESULT_FROM_WIN32(dwError); } hr = CoCreateInstanceEx( __uuidof(IServer), NULL, dwServer, &coServerInfo, 1, &multiQI); 

Mon problème se produit lorsque mon client et mon serveur sont installés sur le même ordinateur. Dans Windows 2003, lorsque je transmets les informations d’identification d’un utilisateur (valide ou non valide) à mon serveur, la fonction CoCreateInstanceEx renvoie toujours S_OK.

Le problème est que l’utilisateur utilisé du côté serveur n’est pas celui qui a été emprunté, mais l’utilisateur qui a lancé mon processus client.

Avec Windows 2008, cela fonctionne correctement. Des idées?

Merci d’avance.

C’est intéressant. http://msdn.microsoft.com/en-us/library/aa913628.aspx

Peut-être utiliser des valeurs de registre au lieu de valeurs d’authentification explicites? CoInitializeSecurity étant appelé ailleurs? Seule chose que je puisse penser.