Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Рабочий стол
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.05.2010, 23:24
makshimik makshimik вне форума
Прохожий
 
Регистрация: 25.05.2010
Сообщения: 3
Репутация: 10
Вопрос Скриншоты из службы под Win 7

Здравствуйте все!!!
Все обстоит вот как...
1)Есть программа, которая делает скриншоты и сохраняет их в *.png.
2)Естественно эта программа если запускать ее из под SYSTEM (сервис виндовс) нормально работать не может(и не только она), поэтому была написана другая программа, которая запускает эту в контексте активного рабочего стола.
Так вот! В ХР все работает прекрасно: из службы делаем WinExec('runprc.exe scrsht.exe "scr.png"',0); то есть запускаем runprc.exe с параметром 'scrsht.exe "scr.png"' - и получаем скриншот в файле scr.png.
Внимание, вопрос! Почему такой метод не работает в Win 7 ?
Вот исходник программы runprc.exe
Код:
program runprc;

uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  JwaWindows,//последние два модуля есть только в виде DCU файлов
  JwsclStrings;//если кто сможет помоч или заинтересуется - пишите в личку - вышлю, а то архив больше метра весит

procedure StartApp(const App, Parameters, CurDir : TJwString);
var
StartupInfo:{$IFDEF UNICODE}TStartupInfoW{$ELSE}TStartupInfoA{$ENDIF};
ProcInfo:TProcessInformation;
pEnv:Pointer;
pCurDir,
pCmdLine : TJwPChar;
begin
  ZeroMemory(@StartupInfo,sizeof(StartupInfo));
  StartupInfo.cb:=SizeOf(StartupInfo);
  StartupInfo.lpDesktop:='winsta0\default';
  CreateEnvironmentBlock(@pEnv,0,true);
  try
   if Length(Parameters)>0 then
     pCmdLine:=TJwPChar('"'+App+'" '+Parameters)
    else
      pCmdLine := TJwPChar('"'+App+'"');
  pCurDir:=Nil;
  if Length(CurDir)>0 then
    pCurDir:=TJwPChar(CurDir);
  if not
{$IFDEF UNICODE}CreateProcessW{$ELSE}CreateProcessA{$ENDIF}(
    TJwPChar(App),//__in_opt     LPCTSTR lpApplicationName,
    pCmdLine, //__inout_opt  LPTSTR lpCommandLine,
    nil,//__in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
    nil,//__in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
    true,//__in         BOOL bInheritHandles,
    CREATE_NEW_CONSOLE or CREATE_UNICODE_ENVIRONMENT,//in DWORD dwCreationFlags,
    pEnv,//__in_opt     LPVOID lpEnvironment,
    pCurDir,//__in_opt     LPCTSTR lpCurrentDirectory,
    StartupInfo,//__in         LPSTARTUPINFO lpStartupInfo,
    ProcInfo//__out        LPPROCESS_INFORMATION lpProcessInformation
    ) then
   raiseLastOsError;
  finally
    DestroyEnvironmentBlock(pEnv);
  end;
  CloseHandle(ProcInfo.hProcess);
  CloseHandle(ProcInfo.hThread);
end;

begin
 try
   StartApp(ParamStr(1),ParamStr(2),ParamStr(3));
 except
   exit;
 end;
end.
Сразу говорю - код не мой я в нем даж почти не ковырялся, потому что недостаточно хорошо знаю эту тему.
Хотелось бы аналогичную функцию, но для семерки. Лучше в исходнике, но советам тоже буду рад.
Заранее спасибо.

Последний раз редактировалось makshimik, 25.05.2010 в 23:27.
Ответить с цитированием
  #2  
Старый 25.05.2010, 23:32
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

потому что под 7 больше нет интерактивных служб. Точнее есть, но их заводить нужен специальный бубен.
Ответить с цитированием
  #3  
Старый 26.05.2010, 20:37
makshimik makshimik вне форума
Прохожий
 
Регистрация: 25.05.2010
Сообщения: 3
Репутация: 10
По умолчанию

Так дайте же!!! Дайте же мне етот бубен!!!
Может быть есть какой-то способ запустить прогу не под SYSTEM, а под текущим пользователем??? Ведь нужна же все-таки интерактивность, причем довольно многим сервисам!

Последний раз редактировалось makshimik, 26.05.2010 в 20:44.
Ответить с цитированием
  #4  
Старый 27.05.2010, 07:26
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ну как вариант запустить из службы некий процесс под учеткой активного юзера. Ну или создать процесс от имени юзера, запустить в нем поток с твоим кодом.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 03.06.2010, 06:23
makshimik makshimik вне форума
Прохожий
 
Регистрация: 25.05.2010
Сообщения: 3
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Ну как вариант запустить из службы некий процесс под учеткой активного юзера. Ну или создать процесс от имени юзера, запустить в нем поток с твоим кодом.
Так вот я и спрашиваю как можно запустить из службы процесс под учеткой другого пользователя? (произвольного в идеале)
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:32.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter