Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2012, 01:08   #1
Ryabinin313
Пользователь
 
Регистрация: 25.09.2010
Сообщений: 24
Вопрос Запуск приложения на рабочем столе пользователя из сервиса(win7)

Здравствуйте! Был сервис который при старте системы запускал процесс, в win7 все работало не так как хотелось из-за того что сервисы в нулевой сессии.

Делаю следующее:

1. Подписал сервис на события SERVICE_ACCEPT_SESSIONCHANGE.
2. Как только пользователь залогинится(сообщение WTS_SESSION_LOGON), получаю id сессии и token пользователя:

WTSSESSION_NOTIFICATION strSession;
HTOKEN hToken;
CopyMemory(&strSession, eventData, sizeof(WTSSESSION_NOTIFICATION));
WTSQueryUserToken((DWORD)strSession .dwSessionId, &hToken);

3. Запускаю процесс от имени этого пользователя:

CreateProcessAsUser(hToken,...

Этого достаточно чтобы запустить процесс на рабой станции зашедшего пользователя(именно того который зашел локально) и на его десктопе? Если нет, не могли бы расписать решение на примере? А то из того что находил в интернете накопал только то что описал выше...

Спрашиваю, а не пробую потому, что сервис это часть большой программы и чтобы все собрать нужно очень много времени и моих знаний не достаточно чтобы это сделать( Хочу быть уверен что все будет работать...
Ryabinin313 вне форума Ответить с цитированием
Старый 15.03.2012, 01:37   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а вы попробуйте блокнот запустить просто, вот и проверите просто.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.03.2012, 23:19   #3
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Цитата:
HTOKEN hToken;
CopyMemory(&strSession, eventData, sizeof(WTSSESSION_NOTIFICATION));
WTSQueryUserToken((DWORD)strSession .dwSessionId, &hToken);
Не пробовал.

Цитата:
WTSQueryUserToken((DWORD)strSession .dwSessionId, &hToken);
здесь ты скорее всего получишь токен нулевой сессии.

WTSSESSION_NOTIFICATION работает только начиная с WinXp, у меня задача была с Win 2000.
У Win есть метод получения уведомления о смене пользователя, который работает начиная отWin2000 и по сей день. Через COM.




Делал так:

1. Получить список процессов, запущенных в системе.
2. Найти процесс, запущенный от локального пользователя (explorer.exe например)
3. Получить его токен с правами(TOKEN_QUERY, TOKEN_DUPLICATE и TOKEN_ASSIGN_PRIMARY)
4. Продублировать токен.
5. Создать переменную окружения Environment
6. В StartupInfo указать десктоп пользователя
7. все это дело затолкать в CreateProcessAsUser

Под рукой нет рабочего кода. Могу в понедельник.
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 18.03.2012 в 07:44.
Krok27 вне форума Ответить с цитированием
Старый 19.03.2012, 09:46   #4
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Цитата:
WTSQueryUserToken((DWORD)strSession .dwSessionId, &hToken);
Сверился, можно получить токен пользователя.

У нас есть токен пользователя hToken. Далее CreateProcessAsUser:
Код:
 HANDLE hTokenthis = NULL;
PVOID lpEnvironment = NULL;
SECURITY_ATTRIBUTES sa = {0};
SECURITY_DESCRIPTOR sd = {0};

InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, NULL, false);
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = &sd;
STARTUPINFOW si = {0};
si.cb = sizeof(STARTUPINFO);
si.lpDesktop = L"Winsta0\\Default";
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi = {0};

DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hTokenthis);
CreateEnvironmentBlock(&lpEnvironment, hTokenthis, FALSE);

CreateProcessAsUser(hTokenthis,  0,  strPath, &sa,  NULL, TRUE,							       NORMAL_PRIORITY_CLASS|CREATE_UNICODE_ENVIRONMENT|CREATE_NEW_CONSOLE,
							  lpEnvironment, NULL, &si,  &pi);
Не забывает закрывать:
Код:
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hToken);
CloseHandle(hTokenthis);
DestroyEnvironmentBlock(lpEnvironment);
Если нужно просто вывести сообщение на стол пользователя, то:
1. Можно использовать WTSSendMessage - можно даже задать uTimeOut - время, сколько будет висеть сообщение.
2. Обычный MessageBox(NULL, lpszText,lpszTitle, MB_OK|MB_SERVICE_NOTIFICATION);
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 22.03.2012, 12:59   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

кстати, SERVICE_ACCEPT_SESSIONCHANGE работает, но не совсем так как хотелось бы. сервис получает уведомление только при условии, что сессия существует, если создается новая сессия то об этом севис ничего не знает.
сервис не получает уведомления если юзер логинится в первый раз после загрузки системы.
f.hump вне форума Ответить с цитированием
Старый 22.03.2012, 14:52   #6
Ryabinin313
Пользователь
 
Регистрация: 25.09.2010
Сообщений: 24
Подмигивание

Скорее всего это из-за того что сервис запускается после первого входа в систему. Я сам еще не делал(в ближайших планах), но говорят можно и раньше запустить... И тогда все правильно работать будет
Ryabinin313 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование на рабочем столе... Johnson Общие вопросы Delphi 7 13.07.2011 19:22
Анимация на рабочем столе Djonik Помощь студентам 2 09.12.2009 19:58
кнопка на рабочем столе guffer Общие вопросы Delphi 3 08.07.2009 12:15
Значки на рабочем столе Xardas Свободное общение 4 01.03.2008 20:21
html на рабочем столе >AdepT< Win Api 4 28.02.2007 20:06