-1

내 C++ 응용 프로그램에서 다른 사용자로 가장해야합니다. 나는 이것에 다음 코드를 사용하고있다.Visual 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){ 
    } 

로그온 사용자 함수는 C++ 콘솔 응용 프로그램에 대해 true를 반환하지만 Visual C++ 응용 프로그램에 대해서는 false를 반환합니다. 두 프로젝트 모두 공용 언어 런타임 지원을 사용하고 있습니다. 두 프로젝트 모두 포함 및 참조가 동일합니다.

+0

어떻게 작동하지 않습니까? 콘솔 응용 프로그램 로그온 작업의 경우 – Mark

+0

이 true를 반환하지만 Visual C++ 응용 프로그램의 경우 false를 반환합니다. –

+0

두 사용자를 동일한 사용자로 실행 했습니까? MSDN에서 : "함수가 실패하면 0을 반환하고 확장 된 오류 정보를 얻으려면 GetLastError를 호출하십시오." GetLastError가 반환하는 것은 무엇입니까? – willll

답변

0

문제는 Visual C++ 프로젝트는 win32 프로젝트입니다. 이미 로그온 기능이 있습니다. 따라서 .net 가장 기능이 필요하지 않습니다. 다음 코드는 my isue를 수정했습니다.

 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);