-1

Je dois emprunter l'identité d'un utilisateur différent dans mon application C++. J'utilise le code suivant pour cela.Usurpation d'identité dans le visuel C++

 try { 

     IntPtr tokenHandle = IntPtr(0); 
     bool returnValue = LogonUser(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &tokenHandle); 

     if (false == returnValue) { 
      int ret = Marshal::GetLastWin32Error(); 
      throw gcnew System::ComponentModel::Win32Exception(ret); 
     } 

     WindowsIdentity^ newId = gcnew WindowsIdentity(tokenHandle); 
     WindowsImpersonationContext^ impersonatedUser = newId->Impersonate(); 

     //TODO access file with impersonated user rights 

     impersonatedUser->Undo(); // Stop impersonating the user. 
     if (tokenHandle != IntPtr::Zero) CloseHandle(tokenHandle); // Free the tokens. 
    } 
    catch(Exception^ ex){ 
    } 

La fonction utilisateur de connexion renvoie true pour l'application de console C++, mais renvoie false pour l'application visuelle C++. Les deux projets utilisent un support d'exécution de langage commun. Les deux projets ont les mêmes inclusions et références.

+0

Qu'en est-il ne fonctionne pas? – Mark

+0

pour l'opération d'ouverture de session d'application console renvoie true, mais pour l'application Visual C++ renvoie false. –

+0

Avez-vous exécuté les deux avec le même utilisateur? De MSDN: "Si la fonction échoue, elle renvoie zéro. Pour obtenir des informations d'erreur étendues, appelez GetLastError." Qu'est-ce que GetLastError renvoie? – willll

Répondre

0

Le problème est visuel projet C++ est le projet win32. Il contient déjà la fonction d'ouverture de session. Donc, je n'ai pas besoin de fonctions d'emprunt d'identité .net. Le code suivant a fixé mon problème.

 HANDLE tokenHandle = INVALID_HANDLE_VALUE; 
     bool returnValue = LogonUser(L"username", L"domain", L"password", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &tokenHandle); 

     if (false == returnValue) { 
      int ret = GetLastError(); 
      throw gcnew System::ComponentModel::Win32Exception(ret); 
     } 

     bool res = ImpersonateLoggedOnUser(tokenHandle); 

     //Access file here 

     CloseHandle(tokenHandle);