-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){ 
    } 

Logon user関数は、C++コンソールアプリケーションではtrueを返しますが、Visual C++アプリケーションではfalseを返します。どちらのプロジェクトも共通言語ランタイムサポートを使用しています。どちらのプロジェクトも同じインクルードとリファレンスを持っています。

+0

どうしますか。コンソールアプリケーションのログオン操作の場合は – Mark

+0

がtrueを返しますが、Visual C++の場合はfalseを返します。 –

+0

同じユーザーで両方を実行しましたか? MSDNから: "関数が失敗した場合、ゼロを返します。拡張エラー情報を取得するには、GetLastErrorを呼び出します。" GetLastErrorが返すのは何ですか? – willll

答えて

0

問題はVisual C++プロジェクトはwin32プロジェクトです。すでにログオン機能が含まれています。したがって、.netの偽装機能は必要ありません。次のコードは私の問題を解決しました。

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