Main impersonatewrapper cpp error wtsqueryusertoken error 1008

Main impersonatewrapper cpp error wtsqueryusertoken error 1008 This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions. Answered by: Question I have a windows service which is set to start automatically at system boot. As part of its startup routine, I need to create a process with the token of […]

Содержание

  1. Main impersonatewrapper cpp error wtsqueryusertoken error 1008
  2. Answered by:
  3. Question
  4. How To Fix TeamViewer Error 1008
  5. Description of Teamviewer Error Code 1008
  6. Why Runtime Error 1008 Occurs?
  7. Typical Teamviewer Error Code 1008 Errors
  8. Root of Teamviewer Error Code 1008 Problems
  9. WTSQueryUserToken выдает ошибку 1008 даже при работе под LocalSystem
  10. 5 способов исправить ошибку события 1020 1008 Ошибка Microsoft-Windows-Perflib в Windows 10 (01.16.23)
  11. YouTube видео: 5 способов исправить ошибку события 1020 1008 Ошибка Microsoft-Windows-Perflib в Windows 10

Main impersonatewrapper cpp error wtsqueryusertoken error 1008

This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.

Answered by:

Question

I have a windows service which is set to start automatically at system boot. As part of its startup routine, I need to create a process with the token of the interactive user. So I get the session id, either by enumerating all sessions and checking which one is active, or using the WTSGetActiveConsoleSessionId api. However, if team viewer [version 14] is running , I get the same session id using both methods, and both session ids fail when using WTSQueryUserToken with error 1008.

This happens ONLY at time of booting the system. Any other time, it works ok even if Team viewer is running. That is, there are no problems if I start the service manually after the system has booted.

Please let me know how I can bypass this issue. Thanks. https://social.msdn.microsoft.com/Forums/ie/en-US/3fc2175b-ee6f-43e2-8fd8-c039680ca069/wtsqueryusertoken-failed-on-a-remote-desktop-session?forum=windowssecurity

suggests the following

» Again, WTSGetActiveConsoleSessionId returns the session id of the session bound to the physical machine.

If you’re connecting using remote desktop, the session you’re getting is remote (i.e. not bound to the physical machine).

And since there can be more than one remotely connected user in some configurations, there’s no API that returns *the* remotely connected session id.

Assuming you’re on a client SKU of Windows (where only one session can be active at a time), you can enumerate all sessions (using WTSEnumerateSessions) and look for the active one in the returned array. «

However, I found that both methods [enumerate sessions and WTSQueryUserToken return the same session id , which fails with error 1008]

Источник

How To Fix TeamViewer Error 1008

Error Number: Error 1008
Error Name: Teamviewer Error Code 1008
Error Description: Error 1008: TeamViewer has encountered a problem and needs to close. We are sorry for the inconvenience.
Developer: TeamViewer
Software: TeamViewer
Applies to: Windows XP, Vista, 7, 8, 10, 11

Description of Teamviewer Error Code 1008

Teamviewer Error Code 1008 is a standard sort of runtime error. When it comes to TeamViewer, software engineers use an arsenal of tools to try to weed out these bugs as good as possible. However, it is possible that sometimes errors like error 1008 do not get addressed, even at this stage.

After the initial release, TeamViewer users might encounter the message «Teamviewer Error Code 1008» while running the program. At the time the error 1008 is encountered, the end-user can report the issue to TeamViewer. The developer will then be able to rectify its source code and release an update in the market. As a result, the developer can use update packages for TeamViewer accessible from their website (or automatic download) to resolve these error 1008 problems and other errors.

Why Runtime Error 1008 Occurs?

The most common occurrences Teamviewer Error Code 1008 problems is when loading up TeamViewer. We are going to review at the key causes of error 1008 errors:

Error 1008 Crash — Error 1008 is a well-known, which happens when an incorrect line of code compiles into the source code of the program. This typically occurs when TeamViewer cannot recognize that it is given an incorrect input, or is unaware of what it is supposed to produce.

Teamviewer Error Code 1008 Memory Leak — When a TeamViewer Memory leak occurs, this can result in the device running slow due to system resources running short. Possible sparks include a deallocation failure that happened in a non-C++ program, when corrupted assembly code improperly executes an infinite loop.

Error 1008 Logic Error — The computer system creates incorrect information or produces a different result even though the data that is input is accurate. This is seen when TeamViewer’s source code contains a flaw in data handling.

The root causes of TeamViewer errors associated with Teamviewer Error Code 1008 include a missing or corrupt file, or in some cases, a past or present TeamViewer-related malware infection. Although annoying, these issues can usually be easily remedied through replacing the problem TeamViewer file. In addition, if your Teamviewer Error Code 1008 error was due to a removed malware infection, we recommend running a registry scan to clean up any invalid file path references created by the malicious program.

Typical Teamviewer Error Code 1008 Errors

Encountered Teamviewer Error Code 1008 Problems with TeamViewer Include:

  • «Teamviewer Error Code 1008 Software Error.»
  • «Teamviewer Error Code 1008 not a Win32 program.»
  • «Teamviewer Error Code 1008 encountered a problem and will close.»
  • «Teamviewer Error Code 1008 can’t be located.»
  • «Teamviewer Error Code 1008 not found.»
  • «Problem starting application: Teamviewer Error Code 1008.»
  • «Teamviewer Error Code 1008 not working.»
  • «Teamviewer Error Code 1008 quit.»
  • «Software Path Fault: Teamviewer Error Code 1008.»

TeamViewer Teamviewer Error Code 1008 issues occur with installation, while Teamviewer Error Code 1008-related software runs, during shutdown or startup, or less-likely during operating system updates. Documenting Teamviewer Error Code 1008 problem occasions in TeamViewer is key to determine cause of the Windows problems, and reporting them to TeamViewer.

Root of Teamviewer Error Code 1008 Problems

Teamviewer Error Code 1008 issues are caused by a corrupt or missing Teamviewer Error Code 1008, invalid registry keys associated with TeamViewer, or a malware infection.

Primarily, Teamviewer Error Code 1008 issues are produced by:

  • Corrupted or invalid Teamviewer Error Code 1008 registry entry.
  • Malware infestation corrupted Teamviewer Error Code 1008 file.
  • A different program (not related with TeamViewer) deleted Teamviewer Error Code 1008 maliciously or by mistake.
  • Teamviewer Error Code 1008 is in conflict with another program (shared file).
  • TeamViewer (Teamviewer Error Code 1008) corrupted during download or install.

Compatible with Windows 11, 10, 8, 7, Vista, XP and 2000

Источник

WTSQueryUserToken выдает ошибку 1008 даже при работе под LocalSystem

У меня почти такая же проблема, как обсуждалось в WTSQueryUserToken, всегда выдает сообщение «Была сделана попытка сослаться на несуществующий токен» в Windows 7 на C # , но, в отличие от OP этого вопроса, я использую C ++ в Windows 10 и внимательно прочитайте документацию, прежде чем начинать кодировать мое решение. Так что мой сервис определенно работает под этой LocalSystem учетной записью.

Вот соответствующая часть моей SvcInit() функции:

В документации также упоминается, что вашему процессу обслуживания необходимо иметь такую SE_TCB_NAME привилегию. Тот же абзац, на который ссылается другой вопрос:

Obtains the primary access token of the logged-on user specified by the session ID. To call this function successfully, the calling application must be running within the context of the LocalSystem account and have the SE_TCB_NAME privilege.

Но, читая https://docs.microsoft.com/en-us/windows/win32/services/localsystem-account , мне кажется, что любой процесс, запущенный под LocalSystem учетной записью, автоматически получит эту привилегию:

The LocalSystem account has the following privileges:

  • SE_ASSIGNPRIMARYTOKEN_NAME (disabled)
  • SE_AUDIT_NAME (enabled)
  • SE_BACKUP_NAME (disabled)
  • . many others
  • SE_TCB_NAME (enabled)

Так нужно ли мне явно добавлять эту привилегию к моему процессу или нет? А что еще может быть причиной моей проблемы? МТИА! 🙂

в настоящее время WTSQueryUserToken существуют неполные фразы:

Among other errors, GetLastError can return one of the following errors.

но в старом msdn был список или ошибки, которые могут возвращать api:

так что ERROR_NO_TOKEN среднее значение может быть возвращено, если

The token query is for a session in which no user is logged-on. This occurs, for example, when the session is in the idle state or SessionId is zero.

если мы попытаемся получить токен пользователя во время запуска системы, конечно, но ни один пользователь не вошел в систему. пользователь просто неизвестен, и в результате не существует и токен пользователя (скажем, токен, содержащий идентификатор пользователя, но пользователь и неизвестно, идентификатор неизвестен, токен не может существовать в настоящее время). однако сервис при желании может запускать процесс именно тогда, когда какой-нибудь (любой) пользователь входит в систему. это нужно сделать из HandlerEx обратного вызова, который зарегистрирован через RegisterServiceCtrlHandlerEx

нам нужно искать SERVICE_CONTROL_SESSIONCHANGE событие. просто код для запуска процесса в пользовательском сеансе может быть таким

Источник

5 способов исправить ошибку события 1020 1008 Ошибка Microsoft-Windows-Perflib в Windows 10 (01.16.23)

Windows 10 предлагает множество замечательных функций, улучшающих работу с Windows. Система состоит из небольших систем, работающих вместе, чтобы предоставить вам интуитивно понятную платформу для всех потребностей вашего компьютера.

Однако несколько пользователей недавно сообщили о получении ошибки события 1020 & amp; Ошибка 1008 Microsoft-Windows-Perflib в Windows 10, не позволяющая запустить уязвимое приложение и влияющая на производительность их компьютера.

Согласно жалобам, ошибка появляется без видимой причины. Нет никаких признаков того, что что-то не так до появления ошибки, например, зависания компьютера или сбоя приложений. Ошибка просто появляется внезапно.

Что еще более важно, не так много онлайн-перезаписей, чтобы узнать, как исправить ошибку события 1020 & amp; Ошибка 1008 Microsoft-Windows-Perflib в Windows 10. Эта ошибка разочаровала и смутила многих затронутых пользователей Windows, не знающих, как с ней бороться.

Совет для профессионалов: просканируйте свой компьютер на наличие проблем с производительностью, нежелательных файлов, вредоносных приложений и угроз безопасности
, которые могут вызвать системные проблемы или снижение производительности.

Бесплатное сканирование для ПК: проблемы с загрузкой 3.145.873Совместимость с: Windows 10, Windows 7, Windows 8

Специальное предложение. Об Outbyte, инструкции по удалению, лицензионное соглашение, политика конфиденциальности.

Поэтому, если вы вдруг столкнетесь с этой ошибкой и не знаете, что делать, это руководство должно вам помочь.

Что такое ошибка события 1020 & amp; 1008 Microsoft-Windows-Perflib Error

Не путайте. Это две разные ошибки: ошибка события 1020 и ошибка события 1008. Но обычно они происходят одновременно, и обстоятельства, связанные с этими ошибками, в основном одинаковы.

Вот сообщение об ошибке, которое вы можете встретить для события ошибка 1008:

img: Perflib
Категория: Нет
Тип: Ошибка
Идентификатор события: 1008

Процедура открытия службы «.NETFramework» в DLL «C: WINDOWS system32 mscoree.dll» завершилась неудачно с кодом ошибки. Система не может найти указанный файл. Данные о производительности для этой службы недоступны.

Вот сообщение об ошибке, которое может возникнуть при ошибке события 1020:

img: Perflib
Категория: Нет
Тип: Ошибка
Идентификатор события: 1008

Требуемый размер буфера больше, чем размер буфера, переданный в функцию сбора расширяемого счетчика DLL «C: Windows System32 perfts.dll» для службы. «LSM». Сообщенный размер буфера составлял 34184, а требуемый размер — 43160.

Эти ошибки могут возникать с любым другим файлом, а не только с mscoree.dll. Это также может произойти при обнаружении ошибки при проверке производительности других файлов DLL.

В приведенном выше сообщении это означает, что система не может найти файл mscoree.dll. Когда пользователь пытался найти файл с помощью odctr / r в Powershell (от имени администратора), появляется сообщение о том, что mscoree.dll был заменен из резервной копии. При запуске команды lodctr / q для вывода списка исправлений даже был указан файл mscoree.dll. Однако ошибка по-прежнему появляется после выполнения вышеуказанного устранения неполадок.

Затронутые пользователи отметили, что кроме этих ошибок, появляющихся в средстве просмотра событий, они не заметили ничего странного с компьютером; Все работало так, как должно, поэтому пользователи понятия не имели, что это могло их вызвать, а что не работало должным образом.

Однако, когда вы получаете любую из этих ошибок, у вас нет беспокоиться, потому что сама эта ошибка не имеет большого значения. Это просто способ Windows сказать, что он не может собирать данные о производительности. Это легкая часть. Избавиться от ошибок — совсем другое дело.

Что вызывает ошибку события 1020 & amp; 1008 Microsoft-Windows-Perflib Error?

Как упоминалось ранее, эти ошибки событий могут возникать для различных приложений. Когда монитор производительности впервые считывает все счетчики, вызывается процедура открытия расширения.

Типичная задача процедуры открытия — прочитать из реестра, какой диапазон индексов объектов она поддерживает. Эти значения индекса хранятся в значениях реестра «Первый счетчик», «Первая справка», «Последний счетчик» и «Последняя справка» под ключом производительности приложения.

Если эта процедура Open не может прочитать данные (т. Е. Эти записи не существуют или были удалены процедурой удаления) событие 1008 или 1020 записывается в журнал событий.

Событие ошибки 1020 и 1008 обычно возникает из-за того, что список счетчиков поврежден и необходимая библиотека DLL отключена . Когда счетчику производительности не удается выгрузить строки для указанной службы, реестр может быть поврежден и отобразить эти ошибки perflib.

Как исправить ошибку события 1020 & amp; 1008 Ошибка Microsoft-Windows-Perflib

Хотя эта ошибка может быть не критичной для вашей системы Windows, получение уведомлений может раздражать, поэтому вы можете решить ее, используя приведенные ниже решения.

Исправление №1: Перезагрузите компьютер.

Первым шагом к исправлению любой ошибки является перезагрузка системы. Обычно это помогает устранить временные сбои на вашем компьютере. Нажмите кнопку питания, затем подождите несколько минут, прежде чем снова запустить его. Вы также можете попробовать загрузиться в безопасном режиме, чтобы узнать, связана ли ошибка со сторонним программным обеспечением.

Исправление №2: Удалите поврежденные файлы.

Другой базовый шаг по устранению неполадок включает запуск команды SFC в командной строке для проверки на наличие поврежденных файлов на вашем компьютере. Этот инструмент автоматически исправляет или заменяет поврежденные файлы, чтобы устранить любую ошибку, с которой вы можете столкнуться. Также рекомендуется очистить вашу систему с помощью Outbyte PC Repair, чтобы предотвратить появление новых ошибок.

Исправление №3: отредактируйте реестр.

Чтобы удалить такие потерянные записи, обычно необходимо выполнить следующие действия:

  • Запустите редактор реестра (Regedt32.exe или Regedit.exe) и перейдите к следующему подраздел:
  • HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services : Performance
  • Удалите значение «Открыть».
  • Перезагрузите компьютер, чтобы это изменение вступило в силу . Исправление №4: перестроить счетчики производительности.

    Чтобы устранить эту проблему, заново создайте список счетчиков производительности.

  • Нажмите «Пуск».
  • Введите CMD в поиске bar.
  • Щелкните правой кнопкой мыши командную строку.
  • Выберите «Запуск от имени администратора».
  • Введите следующую команду и нажмите клавишу Enter — CD% SYSTEMROOT% System32
  • В командной строке введите lodctr /r.
  • Нажмите Enter.
  • Аналогично, для ошибки 1008 введите lodctr / e: и затем нажмите Enter.

    Обратите внимание, что для выполнения этой процедуры требуется членство в локальной группе администраторов. Чтобы восстановить список счетчиков в реестре, выполните следующие действия.

  • Нажмите кнопку «Пуск» в Windows 10.
  • В появившемся поле поиска введите CMD или командную строку.
  • Когда параметр отображается, щелкните его правой кнопкой мыши и выберите параметр «Запуск от имени администратора».
  • Теперь в появившемся на экране окне командной строки введите следующую команду и нажмите клавишу Enter — cd% SYSTEMROOT% System32.
  • Снова введите следующую команду и нажмите клавишу Enter — lodctr /r. Исправление № 5: повторно включите DLL.

    Аналогично, 1008 Microsoft -Windows-Perflib ошибка возникает, когда необходимая DLL отключена. Чтобы решить эту проблему, введите lodctr / e:

    YouTube видео: 5 способов исправить ошибку события 1020 1008 Ошибка Microsoft-Windows-Perflib в Windows 10

    Источник

  • I have a windows service which is set to start automatically at system boot. As part of its startup routine, I need to create a process with the token of the interactive user. So I get the session id, either by enumerating all sessions and checking which
    one is active, or using the WTSGetActiveConsoleSessionId api. However, if team viewer [version 14] is running , I get the same session id using both methods, and both session ids fail when using WTSQueryUserToken with error 1008.

    This happens ONLY at time of booting the system. Any other time, it works ok even if Team viewer is running. That is, there are no problems if I start the service manually after the system has booted. 

    Please let me know how I can bypass this issue. Thanks.https://social.msdn.microsoft.com/Forums/ie/en-US/3fc2175b-ee6f-43e2-8fd8-c039680ca069/wtsqueryusertoken-failed-on-a-remote-desktop-session?forum=windowssecurity 

    suggests the following 

    «Again, WTSGetActiveConsoleSessionId returns the session id of the session bound to the physical machine.

    If you’re connecting using remote desktop, the session you’re getting is remote (i.e. not bound to the physical machine).

    And since there can be more than one remotely connected user in some configurations, there’s no API that returns *the* remotely connected session id.

    Assuming you’re on a client SKU of Windows (where only one session can be active at a time), you can enumerate all sessions (using WTSEnumerateSessions)
    and look for the active one in the returned array. «

    However, I found that both methods [enumerate sessions and WTSQueryUserToken return the same session id , which fails with error 1008]

    The code I use is as below

    HANDLE CProcessManager::GetImpersonationToken() {
    	
    	//The following api call fails to get a valid session id if remote desktop /team viewer is running at startup
    	UINT dwSessionId = WTSGetActiveConsoleSessionId();
    	Report(L"Session id from WTSGetActiveConsoleSessionId:%d", dwSessionId);
    
    	
    	HANDLE hImpersonationToken = NULL;
    	if (!WTSQueryUserToken(dwSessionId, &hImpersonationToken))
    		{
    			//log error
    			DWORD err = GetLastError();
    			Report(L"Exception in WTSQueryUserToken:%d Proceeding to enumerate sessions!", err);
    		}
    		else 
    		{
    			Report(L"Returning Impersonation Token:%d", hImpersonationToken);
    			WCHAR* pUserName;
    			DWORD user_name_len = 0;
    
    			if (WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE,dwSessionId, WTSUserName, &pUserName, &user_name_len))
    			{
    				Report(L"UserName from sessionId is %s:", pUserName);
    				if (pUserName) WTSFreeMemory(pUserName);
    				return hImpersonationToken;
    				//LocalFree(lpszUserName);
    			}
    			else
    			{
    				DWORD err = GetLastError();
    				Report(L"Exception in WTSQuerySessionInformation:%d! Returning Null Impersonation Token", err);
    				return NULL;
    			}
    
    			
    		}
    	DWORD session_id = -1;
    	DWORD session_count = 0;
    
    	WTS_SESSION_INFOA *pSession = NULL;
    
    	try {
    		if (WTSEnumerateSessionsA(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSession, &session_count))
    		{
    			//log success
    		}
    		else
    		{
    			//log error
    			return NULL;
    		}
    	}
    	catch (...) {}
    	Report(L"Session Count :%d", session_count);
    	Report(L"Begin Enumerating Sesions");
    	for (int i = 0; i < session_count; i++)
    	{
    		{
    			session_id = pSession[i].SessionId;
    			Report(L"SessionId:%d", session_id);
    
    			WTS_CONNECTSTATE_CLASS wts_connect_state = WTSDisconnected;
    			WTS_CONNECTSTATE_CLASS* ptr_wts_connect_state = NULL;
    
    			DWORD bytes_returned = 0;
    			if (::WTSQuerySessionInformation(
    				WTS_CURRENT_SERVER_HANDLE,
    				session_id,
    				WTSConnectState,
    				reinterpret_cast<LPTSTR*>(&ptr_wts_connect_state),
    				&bytes_returned))
    			{
    				wts_connect_state = *ptr_wts_connect_state;
    				::WTSFreeMemory(ptr_wts_connect_state);
    				if (wts_connect_state != WTSActive)
    				{
    					Report(L"wts_connect_state != WTSActive! Continuing ###");
    					continue;
    				}
    			}
    			else
    			{
    				Report(L"Error in WTSQuerySessionInformation:%d: Continuing ###", GetLastError());
    				continue;
    			}
    		}
    		//catch (...) {}
    		Report(L"End Enumerating Sesions");
    		Report(L"Selected Session Id:%d", session_id);
    	}
    	
    	Report(L"session_id from enumerating sessions: %d", session_id);
    	Report(L"Session id from WTSGetActiveConsoleSessionId:%d", dwSessionId);
    	if (session_id == -1) {
    		Report(L"Fatal Error: Failed to get session_id by both methods");
    		return NULL;
    	}
    	if (!WTSQueryUserToken(session_id, &hImpersonationToken))
    	{
    		//log error
    		DWORD err = GetLastError();
    		Report(L"Fatal Error: Failed WTSQueryUserToken on enumerated sessionid: %d", err);
    		return NULL;
    	}
    
    
    	// Get user name of this process
    	//LPTSTR pUserName = NULL;
    	WCHAR* pUserName;
    	DWORD user_name_len = 0;
    
    	if (WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, session_id, WTSUserName, &pUserName, &user_name_len))
    	{
    		//log username contained in pUserName WCHAR string
    		// char * lpszUserName = WideCharToChar(pUserName);
    		Report(L"UserName from session_id [after enumeration] is %s:",pUserName);
    		//LocalFree(lpszUserName);
    	}
    	else
    	{
    		DWORD err = GetLastError();
    		Report(L"Exception in WTSQuerySessionInformation:%d! Returning Null Impersonation Token", err);
    		return NULL;
    	}
    
    	//Free memory
    	if (pUserName) WTSFreeMemory(pUserName);
    
    	Report(L"Returning Impersonation Token:%d", hImpersonationToken);
    
    	return hImpersonationToken;
    }

    in current WTSQueryUserToken exist incomplete phrase:

    Among other errors, GetLastError can return one of the following
    errors.

    but in old msdn was list or errors which can return api:

    enter image description here

    so ERROR_NO_TOKEN mean can be returned if

    The token query is for a session in which no user is logged-on. This
    occurs, for example, when the session is in the idle state or
    SessionId is zero.

    if we try get user token at system startup time of course yet no any logged in user. user simply is unknown and as result not exist and user token (say token containing user sid — but user and unknown, sid is unknown, token can not exist at this time). however service if want can start process exactly when some (any)user logon to system. this need do from
    HandlerEx callback which registered via RegisterServiceCtrlHandlerEx

    we need look for SERVICE_CONTROL_SESSIONCHANGE event.
    simply code for run process in user session can be like this

    DWORD WINAPI HandlerEx(
                           DWORD dwControl,
                           DWORD dwEventType,
                           PVOID lpEventData,
                           PVOID lpContext
                           )
    {
    
        switch (dwControl)
        {
        case SERVICE_CONTROL_SESSIONCHANGE:
    
            if (dwEventType == WTS_SESSION_LOGON)
            {
                HANDLE hToken;
                if (WTSQueryUserToken(reinterpret_cast<PWTSSESSION_NOTIFICATION>(lpEventData)->dwSessionId, &hToken))
                {
                    PVOID lpEnvironment;
                    if (CreateEnvironmentBlock(&lpEnvironment, hToken, FALSE))
                    {
                        STARTUPINFOW si = { sizeof(si) };
                        PROCESS_INFORMATION pi;
                        if (CreateProcessAsUserW(hToken, 
                            L"c:\windows\notepad.exe", 0, 0, 0, 0, 
                            CREATE_UNICODE_ENVIRONMENT, lpEnvironment, 0, &si, &pi))
                        {
                            CloseHandle(pi.hThread);
                            CloseHandle(pi.hProcess);
                        }
                        DestroyEnvironmentBlock(lpEnvironment);
                    }
                    CloseHandle(hToken);
                }
            }
            break;
        }
    
        // ...
    }
    

      msm.ru

      Нравится ресурс?

      Помоги проекту!

      !
      user posted image

      Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

      Соблюдайте общие правила форума

      Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
      1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
      2. Как «свернуть» программу в трей.
      3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
      4. Как запустить программу/файл? (и дождаться ее завершения)
      5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры — внедрение в удаленное адресное прстранство)
      … (продолжение следует) …


      Внимание:
      Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
      Повторная попытка — 60 дней. Последующие попытки — бан.
      Мат в разделе — бан на три месяца…


      Полезные ссылки:
      user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


      Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

      >
      LoadUserProfile — Ошибка 1008
      , Попытка ссылки на несуществующий токен.

      • Подписаться на тему
      • Сообщить другу
      • Скачать/распечатать тему



      Сообщ.
      #1

      ,
      15.10.16, 12:31

        Full Member

        ***

        Рейтинг (т): 6

        — Запускаю из под сервиса утилиту под учетной записью пользователя.

        Все пускается хорошо, все работает, но недавно после доработки и необходимости обратиться к директории %tmp% пользователя, появилась проблема в виде того что
        все переменные окружения или как они там правильно называются такие же как для сервиса который пускал утилиту.
        Например GetEnvironmentVariable(‘TMP’) Выдает c:windowstemp вместо c:usersusernameApplication data ….

        Посмотрел много статей на эту тему, вроде как получается что перед выполнением CreateProcessAsUser необходимо загурзить профайл пользователя, потом
        создать какой то энвиромент блок, и его укзатель запихнуть в CreateProcessAsUser

        LoadUserProfile > CreateEnvironmentBlock > CreateProcessAsUser(…And CREATE_UNICODE_ENVIRONMENT….LpvEnv….);

        в некоторых статьях написано что еще перед этим надо выполнить DuplicateTokenEx, в некоторых что перед загрузкой надо сделать ImpersonateLoggedOnUser
        в итоге бьюсь уже несколько дней, исчерпались статьи отлючающиеся содержанием где можно было бы что-то еще попробовать, и далее не знаю как быть

        1) Получаю активные сессии: имею список ID UserName и тд данне по всем текущим сессиям.
        2) Выбираю необходимого пользователя, и получаю Token с помощью WTSQueryUserToken: имею токен
        3) Выполняю LoadUserProfile с полученным токеном : ОШИБКА: 1008 (Попытка ссылки на несуществующий токен.)
        4) Выполняю CreateEnvironmentBlock с полученным токеномЖ ОШИБКА: 203 (Системе не удается найти указанный параметр среды.)
        5) Выполняю CreateProcessAsUser с полученным токеном: Процесс запускается без ошибок под учетной записью пользователя

        Если бы токен был бы несуществующий то не сработал бы CreateProcessAsUser (кроме того при создании токена не выдает ошибок и он не Nil)

        ExpandedWrap disabled

          Загрузить профайл пробую так:

          UserName:String;

          FillChar(Profile, SizeOf(Profile), 0);

          Profile.dwSize:=SizeOf(TProfileInfo);

          Profile.lpUserName:=PWideChar(WideString(UserName));;

          LoadUserProfile(hToken, Profile);

          ОШИБКА: 1008

          Создать Энвиромент блок пробую так:

          lpvEnv:Pointer;

          CreateEnvironmentBlock(lpvEnv, hToken, True);

        В чем может быть проблема?

        — Если сделать DuplicateTokenEx после WTSQueryUserToken и использовать новый, то разницы никакой все те же ошибки, процесс пускается нормально от указанного пользователя.
        — Если сделать ImpersonateLoggedOnUser Перед LoadUserProfile тогда он выдает ошибку 5.


        Gen



        Сообщ.
        #2

        ,
        15.10.16, 21:28

          Full Member

          ***

          Рейтинг (т): 6

          Вопрос решен. Если кому надо вот НУ ОЧЕНЬ полезная статья

          http://www.delphimaster.net/view/2-1234290981/all

          Основное внимание на: TOKEN_ADJUST_SESSIONID

          ну и токен получать с нужной сесии, в примерах текущий берется.

          Да и еще не маловажный момент, касательно моего вопроса: ошибка такая то по GetLastError. Проблема не в ошибке а в longbool, правильно обрабатывать надо, ошибок как оказалось почти и не было.

          Сообщение отредактировано: Gen — 15.10.16, 21:36

          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

          0 пользователей:

          • Предыдущая тема
          • Delphi: Система, Windows API
          • Следующая тема

          Рейтинг@Mail.ru

          [ Script execution time: 0,0204 ]   [ 16 queries used ]   [ Generated: 9.02.23, 21:21 GMT ]  

          Hello,

          I’ve noticed the Conexant driver is logging a lot of junk to the event log.

          This is probably debug related, just like the infamous keyloggers.

          Is there any plans to release a new driver with this junk turned off, or is it possible to force it off using some hidden setting?

          Among the messages, this set of information messages appears every 90 seconds;

          CxService::AliveTimer_Elapsed

          CxService::WakeUpApps +

          CxService::WakeUpApps User Account = [REDACTED]

          CxService::ProcessExist Process NameMicTray64, Process SessionId = 1, Process User Name = [REDACTED]

          CxService::ProcessExist Process NameSmartAudio3, Process SessionId = 1, Process User Name = [REDACTED]

          CxService::ProcessExist Process NameFLOW, Process SessionId = 1, Process User Name = [REDACTED]

          FlowTray path = C:Program FilesCONEXANTFlowFlowTray.exe

          CxService::WakeUpApps — 

          When I lock/unlock or sleep/wakeup/boot my computer, it will also log some messages as Warning:

          CxService::OnSessionChange ChangeSessionId = 1, SessionId = 1

          CxService::OnSessionChange ChangeSessionId = 1, SessionId = 0

          CxProcess::ProcessStartByUserContext() = false

          CxService::OnStart: launchedNgen = 0

          CxService::OnStart: Ngen + 

          CxService::OnShutdown

          CxService::OnSessionChange ChangeSessionId = 1, SessionId = 1

          CxService::OnPowerEvent PowerStatus = PowerStatusChange

          And also seeing some error messages:

          CxService::GetCurrentUserToken: WTSQueryUserToken error=1008

          The error is one thing, but most of those warnings are clearly not actual warnings.

          All of these messages get logged to a application/service log named CxAudioSvcLog

          In my opinion, this events should only be logged if the user/admin has specifically turned them on, as they are obviously meant for debugging purposes.

          I feel like this, along with the prior incidents with the keyloggers, bare witness to a lack of quality control at HP and/or Conexant and I sincerely hope this will be addressed in a better manner than it previously has been.

          Regards, Morten

          У меня почти такая же проблема, как описано в WTSQueryUserToken всегда выдает сообщение« Была сделана попытка сослаться на несуществующий токен »в Windows 7 на C #, но, в отличие от OP этого вопроса, я использую C ++ в Windows 10 и читаю docs, прежде чем начинать кодировать мое решение. Так что моя служба определенно работает под учетной записью LocalSystem.

          Вот соответствующая часть моей функции SvcInit():

              HANDLE hToken;
          
              // Returns 1, just like in the linked question
              DWORD sessionId = WTSGetActiveConsoleSessionId();
          
              if (!WTSQueryUserToken(sessionId, &hToken)) {
                  // LogError() takes the name of an error-causing function and calls
                  // GetLastError() and FormatMessage() to get the system-defined error
                  // message, then logs all of that to a file
                  LogError("WTSQueryUserToken");
                  return;
              }
          

          В документации также упоминается, что вашему процессу обслуживания необходимо иметь право SE_TCB_NAME. Тот же абзац, на который ссылается другой вопрос:

          Получает основной токен доступа вошедшего в систему пользователя, указанного идентификатором сеанса. Для успешного вызова этой функции вызывающее приложение должно работать в контексте учетной записи LocalSystem и иметь привилегию SE_TCB_NAME.

          Но прочитав https://docs.microsoft.com/en, -us / windows / win32 / services / localsystem-account, мне кажется, что любой процесс, запущенный под учетной записью LocalSystem, будет автоматически иметь эту привилегию:

          Учетная запись LocalSystem имеет следующие привилегии:

          • SE_ASSIGNPRIMARYTOKEN_NAME (отключено)
          • SE_AUDIT_NAME (включен)
          • SE_BACKUP_NAME (отключено)
          • … многие другие
          • SE_TCB_NAME (включен)

          Так нужно ли мне явно добавлять эту привилегию к моему процессу или нет? А что еще может быть причиной моей проблемы? МТИА! :-)

          1 ответ

          Лучший ответ

          В текущем WTSQueryUserToken существует неполная фраза:

          Среди других ошибок GetLastError может возвращать одно из следующих значений ошибки.

          Но в старом msdn был список или ошибки, которые могут возвращать api:

          enter image description here

          Поэтому ERROR_NO_TOKEN среднее значение может быть возвращено, если

          Запрос токена предназначен для сеанса, в котором ни один пользователь не вошел в систему. Это возникает, например, когда сеанс находится в состоянии ожидания или SessionId равен нулю .

          Если мы попытаемся получить токен пользователя во время запуска системы, конечно, но ни один пользователь не вошел в систему. пользователь просто неизвестен, и в результате не существует и токен пользователя (скажем, токен, содержащий идентификатор пользователя, но пользователь и неизвестно, идентификатор неизвестен, токен не может существовать в настоящее время). однако сервис при желании может запускать процесс именно тогда, когда какой-нибудь (любой) пользователь входит в систему. это нужно делать от HandlerEx обратный вызов который зарегистрирован через RegisterServiceCtrlHandlerEx

          Нам нужно искать событие SERVICE_CONTROL_SESSIONCHANGE. просто код для запуска процесса в пользовательском сеансе может быть таким

          DWORD WINAPI HandlerEx(
                                 DWORD dwControl,
                                 DWORD dwEventType,
                                 PVOID lpEventData,
                                 PVOID lpContext
                                 )
          {
          
              switch (dwControl)
              {
              case SERVICE_CONTROL_SESSIONCHANGE:
          
                  if (dwEventType == WTS_SESSION_LOGON)
                  {
                      HANDLE hToken;
                      if (WTSQueryUserToken(reinterpret_cast<PWTSSESSION_NOTIFICATION>(lpEventData)->dwSessionId, &hToken))
                      {
                          PVOID lpEnvironment;
                          if (CreateEnvironmentBlock(&lpEnvironment, hToken, FALSE))
                          {
                              STARTUPINFOW si = { sizeof(si) };
                              PROCESS_INFORMATION pi;
                              if (CreateProcessAsUserW(hToken, 
                                  L"c:\windows\notepad.exe", 0, 0, 0, 0, 
                                  CREATE_UNICODE_ENVIRONMENT, lpEnvironment, 0, &si, &pi))
                              {
                                  CloseHandle(pi.hThread);
                                  CloseHandle(pi.hProcess);
                              }
                              DestroyEnvironmentBlock(lpEnvironment);
                          }
                          CloseHandle(hToken);
                      }
                  }
                  break;
              }
          
              // ...
          }
          


          1

          RbMm
          5 Ноя 2020 в 17:01

          Понравилась статья? Поделить с друзьями:
        • Main file data integrity crc error
        • Main executable как исправить
        • Main error unable to locate appender serverguiconsole for logger config root
        • Make menuselect error
        • Main error unable to locate appender console for logger config root