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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2018, 21:47   #1
kleric
Пользователь
 
Регистрация: 27.07.2009
Сообщений: 22
По умолчанию Как получить путь к папке appdata из службы?

Друзья, подскажите как получить путь и доступ к папке appdata из системной службы для пользователя который сейчас вошёл и работает в системе.
Путь получаю след. образом
Код:
function GetSpecialFolderPath(folder : integer) : string;
const
  SHGFP_TYPE_CURRENT = 0;
var
   path: array [0..MAX_PATH] of char;
   h : Thandle;
begin
  try
    h := doGetCurrentToken();
    OpenProcessToken( GetCurrentProcess, TOKEN_QUERY, h );

    if SUCCEEDED(SHGetFolderPath(0,folder,h,SHGFP_TYPE_CURRENT,@path[0])) then
      Result := path
    else
     Result := '';
  finally
   CloseHandle( h );
  end;
end;
Вот что возвращает
C:\Windows\system32\config\systempr ofile\AppData\Roaming
kleric вне форума Ответить с цитированием
Старый 07.02.2018, 07:49   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,811
По умолчанию

ну, путь ты получил. а вот права доступа - это уже, наверное, через реестр, нет?
или попробуй снять с этой папки все атрибуты, чтоб была полная вседозволенность
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 07.02.2018, 08:32   #3
kleric
Пользователь
 
Регистрация: 27.07.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
ну, путь ты получил. а вот права доступа - это уже, наверное, через реестр, нет?
или попробуй снять с этой папки все атрибуты, чтоб была полная вседозволенность
Мне вот такой путь нужен
C:\Users\admin\AppData\Roaming

а не этот
C:\Windows\system32\config\systempr ofile\AppData\Roaming
kleric вне форума Ответить с цитированием
Старый 07.02.2018, 10:21   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Зачем? Просто так нельзя, т.к. сервисы загружаются в отдельной сессии и еще до логина пользователей/загрузки их профилей. Если вам нужно хранить настройки, то храните их в нейтральном месте, использую CommonAppDataFolder для этого, например.
Можно, конечно, поперебирать C:\Users\admin\AppData\Roaming C - по всем дискам, admin - по залогененным пользователям. Правда и это не даст гарантию.
p51x вне форума Ответить с цитированием
Старый 07.02.2018, 10:44   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Мне вот такой путь нужен
C:\Users\admin\AppData\Roaming
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 07.02.2018, 11:03   #6
kleric
Пользователь
 
Регистрация: 27.07.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Зачем? Просто так нельзя, т.к. сервисы загружаются в отдельной сессии и еще до логина пользователей/загрузки их профилей. Если вам нужно хранить настройки, то храните их в нейтральном месте, использую CommonAppDataFolder для этого, например.
Можно, конечно, поперебирать C:\Users\admin\AppData\Roaming C - по всем дискам, admin - по залогененным пользователям. Правда и это не даст гарантию.

Да. Мне нужно хранить профиль с настройками моей проги индивидуально ля каждого юзера. Из службы))
Пока сделал вариант такой - служба мониторит софтину которая в свою очередь и пишет в appdata. И если софтина вырубилась, то запускает её снова.
зы. софтина запускается под текущим юзером
Код:
procedure RunApp(FilePath:string);
var
  hToken:THandle;
  si:STARTUPINFO;
  pi:PROCESS_INFORMATION;
begin
  if WTSQueryUserToken(WtsGetActiveConsoleSessionID,@hToken) then
    begin
      ZeroMemory(@si,SizeOf(si));
      si.cb:=SizeOf(si);
      si.lpDesktop:=nil;
      CreateProcessAsUser(hToken,nil,PChar(FilePath),nil,nil,False,0,nil,nil,si,pi);
      CloseHandle(hToken);
    end;
end;
kleric вне форума Ответить с цитированием
Старый 07.02.2018, 11:05   #7
kleric
Пользователь
 
Регистрация: 27.07.2009
Сообщений: 22
По умолчанию

Друзья, подскажите как узнать что пользователь выполнил логон? Из службы
kleric вне форума Ответить с цитированием
Старый 07.02.2018, 14:41   #8
kleric
Пользователь
 
Регистрация: 27.07.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Зачем? Просто так нельзя, т.к. сервисы загружаются в отдельной сессии и еще до логина пользователей/загрузки их профилей.
А из сессии службы вообще можно получить appdata текущего юзера который влипает в монитор?
kleric вне форума Ответить с цитированием
Старый 07.02.2018, 15:01   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

1. Перебором как я написал или через грязные хаки, которые не факт, что не сломаются с следующим обновлением.
2. Вообще-то, Винда многопользовательская система и который из 5 залогененных будет текущим для вашей службы?
3. Мне, кажется, у вас архитектура неправильная. Зачем вам служба? Добавьте в автозапуск прогу и все. Служба понадобиться если надо повышать привилегии, как, например, в Хроме и других.

Последний раз редактировалось p51x; 07.02.2018 в 15:03.
p51x вне форума Ответить с цитированием
Старый 07.02.2018, 16:11   #10
kleric
Пользователь
 
Регистрация: 27.07.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
1. Перебором как я написал или через грязные хаки, которые не факт, что не сломаются с следующим обновлением.
2. Вообще-то, Винда многопользовательская система и который из 5 залогененных будет текущим для вашей службы?
3. Мне, кажется, у вас архитектура неправильная. Зачем вам служба? Добавьте в автозапуск прогу и все. Служба понадобиться если надо повышать привилегии, как, например, в Хроме и других.
1. Согласен
2. Текущего юзера беру через
Код:
function WTSQueryUserToken(SessionId: DWORD; phToken : pHandle) : bool; stdcall; external 'wtsapi32.dll';
3. Служба нужна для обновления софтины. аля Мозилла. Там отдельная служба для обновления, чтобы УАК не пугался. Ведь файлы софтины лежат в program files

Архитектура такая: служба системная запускает софтину вышеуказанным способом (для обновления, для контроля...) Странно но софтина запущенная таким образом так же не видит appdata текущего юзера.
А видит C:\Windows\system32\config\systempr ofile\AppData\Roaming
Если софтину запустить руками, то appdata будет человеческий
C:\Users\admin\AppData\Roaming
kleric вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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