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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2018, 17:05   #11
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
3. Служба нужна для обновления софтины. аля Мозилла. Там отдельная служба для обновления, чтобы УАК не пугался. Ведь файлы софтины лежат в program files
Так и думал.

Цитата:
Архитектура такая: служба системная запускает софтину вышеуказанным способом (для обновления, для контроля...) Странно но софтина запущенная таким образом так же не видит appdata текущего юзера.
Тут и проблема в вашей архитектуре.
1. Ничего странного. Ведь ее запускает "системная служба". Почему она должна увидеть пользовательское?
2. Делайте как все нормальные делают (Хром, Драйвера и т.д.). Запускайте обновлятор от пользователя, как обычную прогу, а потом через сервис запрашивайте повышение привилегий/делегируйте сервису действия, требующие права.
p51x вне форума Ответить с цитированием
Старый 07.02.2018, 20:04   #12
kleric
Пользователь
 
Регистрация: 27.07.2009
Сообщений: 22
По умолчанию

Большое спасибо, что откликаетесь на мои вопросы, но вместе мы придём к единому решению!)
А теперь вопрос на миллион биткоинов))
Почему, когда служба вызывает саму себя через код №2 (из функции main службы), appdata текущего юзера (который выполнил логон походу) видится службой процессом который по совместительству и служба (код 1)
зы софтина делает скрины для текущего юзера...
зызы и успешно их кладёт в appdata
зызызы НО, мне не ясно как вернуть эту самую current user app data службе (можно через файлы или порты)

код 1
Код:

      if AnsiUpperCase(ParamStr(1)) = '-SCREEN' then
      begin
        doCreateScreen(GetSpecialFolderPath(CSIDL_APPDATA)+'\Agent\log\2'+RandomString(7)+doGetUnixTimeStr()+'.png', errStr);
        exit;
      end;
код2
Код:
function RunScreenShot(): DWORD;
const
  WINDOW_STATION_NAME = 'Winsta0';
  APPLICATION_DESKTOP_NAME = 'Default';
var
  SI: TStartupInfo;
  PI: TProcessInformation;
  hInteractiveToken: THandle;
begin
  Result := NO_ERROR;
  hInteractiveToken := doGetCurrentToken();

  if hInteractiveToken = INVALID_HANDLE_VALUE then
  begin
    Result := GetLastError;
    Exit;
  end;

  try
    ZeroMemory(@SI, SizeOf(TStartupInfo));
    SI.cb := SizeOf(TStartupInfo);
    SI.lpDesktop := PChar(WINDOW_STATION_NAME + '\' +  APPLICATION_DESKTOP_NAME);
    SI.wShowWindow := SW_HIDE;
    SI.dwFlags := STARTF_USESHOWWINDOW;

    if not CreateProcessAsUser(hInteractiveToken,
      PChar(ParamStr(0)),
      PChar('"' + ParamStr(0) + '" -screen'),
      nil, nil, False,
      NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
      Result := GetLastError;
  finally
    CloseHandle(hInteractiveToken);
  end;
end;

Последний раз редактировалось kleric; 07.02.2018 в 20:07.
kleric вне форума Ответить с цитированием
Старый 07.02.2018, 20:28   #13
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Потому что вы запускаете новый инстанс от ПОЛЬЗОВАТЕЛЯ. Вот вам и видно пользовательское.
А когда вы запускаете как службу, от спец. учетки, то и видится спецю учетка.
p51x вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать путь к папке Program Files Miller-1981 C++ Builder 3 21.07.2012 11:35
Путь в APPDATA Raikerian Паскаль, Turbo Pascal, PascalABC.NET 12 17.09.2011 17:28
Путь до папки AppData в зависимости от Юзера Polotenchik Microsoft Office Word 5 13.06.2011 02:40
Путь к AppData -=L.Morgan=- Общие вопросы Delphi 2 04.05.2009 21:12
Функция CallWndProc. Получить путь к папке или файлу к которому преднозначено сообщение Irat Помощь студентам 1 16.02.2008 23:36