|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
29.09.2011, 18:01 | #1 |
Новичок
Джуниор
Регистрация: 28.02.2011
Сообщений: 2
|
Service Run Process
Добрый день!!! Какой уже день бьюсь над одной проблемой, но никак не могу ее решить.
Суть задачи следующая. Есть сервис написанный на Delphi XE. В нем крутиться idTCPServer который принимает от клиента команду дать снимок экрана, делает его и отсылает клиенту. Операционная система Windows 7 Исходный код следующий: hwinstaSave := GetProcessWindowStation; dwThreadId := GetCurrentThreadId; hdeskSave := GetThreadDesktop(dwThreadId); WinSta := OpenWindowStation('WinSta0', False, WINSTA_READSCREEN); SetProcessWindowStation( WinSta ); Desk := OpenDesktop( 'Default', 0 , False, DESKTOP_SWITCHDESKTOP ); SetThreadDesktop( Desk ); If NOT WTSQueryUserToken(WTSGetActiveConso leSessionId(), @h) Then Begin LogTCP.AddMessage := '[INFORMATION ' + DateTimeToStr(NOW) + '] ' + 'WTSQueryUserToken'; End; If NOT DuplicateToken(h, SecurityImpersonation, @hh) Then Begin LogTCP.AddMessage := '[INFORMATION ' + DateTimeToStr(NOW) + '] ' + 'DuplicateToken'; End; If NOT CreateEnvironmentBlock(UsrEnv, hh, FALSE) Then LogTCP.AddMessage := '[INFORMATION ' + DateTimeToStr(NOW) + '] ' + 'CreateEnvironmentBlock'; Path := PWideChar(ExtractFilePath(ParamStr( 0)) + 'Project1.exe'); FillChar(StartInfo, SizeOf(StartupInfo), #0); StartInfo.wShowWindow := SW_HIDE; StartInfo.dwFlags := STARTF_USESHOWWINDOW; Startinfo.lpDesktop := 'Winsta0\Default'; If NOT NTSetPrivilege(TRUE) Then //устанавиливаем привелегию seTCBPrivilege LogTCP.AddMessage := '[INFORMATION ' + DateTimeToStr(NOW) + '] ' + 'NTSetPrivilege'; If NOT CreateProcessAsUser(hh, PWideChar(Path), NIL, NIL, NIL, FALSE, NORMAL_PRIORITY_CLASS OR CREATE_NEW_CONSOLE OR CREATE_UNICODE_ENVIRONMENT, UsrEnv, NIL, StartInfo, ProcessInformation) Then LogTCP.AddMessage := '[INFORMATION ' + DateTimeToStr(NOW) + '] ' + IntToStr(GetLastError); //В этом месте возникает ошибка 5 - ACCESS DANIED. В Windows Vista и 7 службы используют свой рабочий стол и сервисам запрещено использовать интерактивность. В этом коде, если я не ошибаюсь, я переключаюсь на пользовательский рабочий стол, потом считаю привелегии пользователя и запускаю с параметрами текущего пользователя процесс. Все функции возвращают TRUE, кроме CreateProcessAsUser, возвращает ошибку 5 - ACCESS DANIED. Может быть кто-то сталкивался с такой проблемой? И вообще можно ли в Windows 7 из сервиса сделать снимок экрана. Как я понял, что нет. Поэтому я и хочу запустить другой процесс, который следает мне снимок экрана и положит файл в нужное мне место, а я с помощью функции WaitForSingleObject, дождусь ее выполнения и отправлю из сервиса готовый файл со снимком экрана. Просто функция CreateProcess у меня работает, программа которая делает снимок экрана успешно отрабатывает, только получается в результате в файле белый экран, соответственно и клиент получает белый экран. Как я понял, это проиходит потому что программа стартует в сервисной рабочей станции. Помогите кто может, никак не могу решить эту задачу, просто очень срочно нужно. Может быть есть какие нибудь другие альтернативные варианты получения снимка из сервиса? |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
'Invalid floating point operation'. process stopped. Use Step or Run to continue. | manick | Общие вопросы Delphi | 12 | 26.11.2011 21:37 |
process | Aleander_beHDeP | Общие вопросы C/C++ | 1 | 29.03.2010 22:30 |
(process.h) Компилятор говорит Process не объявлен | Парсифаль | Общие вопросы C/C++ | 0 | 15.02.2010 00:27 |
kill process | const | Общие вопросы C/C++ | 2 | 28.08.2008 19:11 |
OpenProcessToken для процессов LOCAL SERVICE и NETWORK SERVICE | M.A.R.K | Win Api | 12 | 04.05.2008 09:51 |