аутентификация — Олицетворение в визуальном переполнении стека

Мне нужно выдать себя за другого пользователя в моем приложении 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){
}

Пользовательская функция входа возвращает true для консольного приложения c ++, но возвращает false для визуального приложения c ++. Оба проекта используют общеязыковую поддержку. Оба проекта имеют одинаковые включения и ссылки.

-1

Решение

Проблема в том, что 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);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]