Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> узнать Application Data текущего пользователя 
V
    Опции темы
cyberovskij
Дата 5.2.2011, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 6.5.2010

Репутация: нет
Всего: нет



Есть код:
Код

function GetActiveUserTokenF():THandle;
var pArrSessInfo      : PJwWTSSessionInfoAArray;
i:integer;
 iNumSess          : DWORD;

begin
result:=0;
if WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE,0,1,PWTS_SESSION_INFO(pArrSessInfo), iNumSess) then
   try
      for i:=0 to iNumSess-1 do
      begin
         //pArrSessInfo^[i]. .....
        if (pArrSessInfo^[i].State =WTSActive) then   
          begin
            WTSQueryUserToken(pArrSessInfo^[i].SessionId,result);
            //break;
          end;
      end //for i
      finally
        WTSFreeMemory(pArrSessInfo);
      end;

end;

////////////////////
function GetUserAppPath():string;
const
  SHGFP_TYPE_CURRENT = 0;

var
  path: array [0..MAX_PATH] of char;
  h:tHandle;
  hh:THandle;
begin
  h:=GetActiveUserTokenF();
  //hh:=THANDLE((h^));
  if h>0 then
  begin
    if SUCCEEDED(SHGetFolderPath(0,CSIDL_APPDATA,h,SHGFP_TYPE_CURRENT,@path[0])) then
      Result := path+inttostr(h)
    else
      Result := 'null';
  end
  else
  Result := 'none';
end;

///////////////////

который выполняется в системной службе в WINXP. При вызове GetUserAppPath какого то дьяволя  возвращает "C:\Documents and Settings\LocalService\Application Data" а не того пользователя, под которым сеанс?  smile 
Еще  меня смущает , то что в Дельфийской реализации  WTSQueryUserToken второй параметр имеет тип не указатель на Thandle (msdn PHANDLE) а THandle? Причем  всюду по форумах в образцах кодов все получив от функции WTSQueryUserToken указатель на токен как это описано в мсдн(PHANDLE) сразу используют его там где нужно подставлять токен(HANDLE)?

Это сообщение отредактировал(а) cyberovskij - 5.2.2011, 21:34
PM MAIL   Вверх
kami
Дата 5.2.2011, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



SHGetFolderPath требует TOKEN_QUERY and TOKEN_IMPERSONATE от полученного токена.
Попробуйте использовать DuplicateToken с SecurityImpersonation для получения этих прав.

Добавлено через 3 минуты и 23 секунды
Цитата(cyberovskij @  5.2.2011,  21:04 Найти цитируемый пост)
в Дельфийской реализации  WTSQueryUserToken второй параметр имеет тип не указатель на Thandle (msdn PHANDLE) а THandle? 

ну так... там же 
Код

var phToken: THandle

PM MAIL WWW   Вверх
cyberovskij
Дата 6.2.2011, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 6.5.2010

Репутация: нет
Всего: нет



Цитата(kami @ 5.2.2011,  22:30)
Попробуйте использовать DuplicateToken с SecurityImpersonation для получения этих прав.

Вот переделал. Результат тот же 
Код

function GetUserAppPath():string;//âåðòຠøëÿõ ïàïêè Application Data
const
  SHGFP_TYPE_CURRENT = 0;

var
  path: array [0..MAX_PATH] of char;
  h:tHandle;
  hh:PHandle;
begin
  WTSQueryUserToken(WTSGetActiveConsoleSessionId(),h);//GetActiveUserTokenF();
  //hh:=THANDLE((h^));
  DuplicateToken(h,SecurityImpersonation,hh);

  if h>0 then
  begin
    if SUCCEEDED(SHGetFolderPath(0,CSIDL_APPDATA,hh^,SHGFP_TYPE_CURRENT,@path[0])) then
      Result := path+inttostr(h)
    else
      Result := 'null';
  end
  else
  Result := 'none';
end;

PM MAIL   Вверх
cyberovskij
Дата 6.2.2011, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 6.5.2010

Репутация: нет
Всего: нет



И еще я заметил что функции SHGetFolderPath вообще все равно что я пишу в третий параметр. Она всегда выдает один результат - проклатый "C:\Documents and Settings\LocalService\Application Data"

Может как то влияет то, что я использую в uses SHFolder;?


Это сообщение отредактировал(а) cyberovskij - 6.2.2011, 01:15
PM MAIL   Вверх
cyberovskij
Дата 6.2.2011, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 6.5.2010

Репутация: нет
Всего: нет



Цитата(cyberovskij @ 6.2.2011,  00:31)
Может как то влияет то, что я использую в uses SHFolder;?

Точно!!! вот на странице с описанием функции в коментах написано: "If you are using the function from SHFolder.dll:Parameter hToken and dwFlags are ignored in the ANSI version of the function. They always become zero (0)."
Вопрос теперь: Откуда ее взять и как правильно импортировать?
PM MAIL   Вверх
kami
Дата 6.2.2011, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Используйте Unicodу версию smile
Изменить-то нужно всего ничего
Код

var
  path: array [0..MAX_PATH] of WideChar;
...

if SUCCEEDED(SHGetFolderPathW(...

Кстати, а какая версия Delphi?

Это сообщение отредактировал(а) kami - 6.2.2011, 15:29
PM MAIL WWW   Вверх
cyberovskij
  Дата 7.2.2011, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 6.5.2010

Репутация: нет
Всего: нет



Цитата(kami @ 6.2.2011,  15:24)
Используйте Unicodу версию smile

Кстати, а какая версия Delphi?

У меня Delphi 7.
Попробовал я SHGetFolderPathW вот такой код:
Код

function GetUserAppPath():string;
const
  SHGFP_TYPE_CURRENT = 0;

var
  path: array [0..MAX_PATH] of char;
  h:tHandle;
  hh:pHandle;
  res:HRESULT;
begin
  WTSQueryUserToken(WTSGetActiveConsoleSessionId(),h);
  DuplicateToken(h,SecurityImpersonation,hh);


  if h>0 then
  begin
  
    res:=SHGetFolderPathW(0,CSIDL_APPDATA,hh^,SHGFP_TYPE_CURRENT,@path[0]);
    case res of
    S_OK:  Result := path ;
    S_FALSE:         Result := 'S_FALSE';
    E_FAIL:         Result := 'E_FAIL';
    E_INVALIDARG:         Result := 'E_INVALIDARG';
    end;

  end
  else
  Result := 'none';
end;


Выдает 'E_FAIL' - такой папки не существует smile 
PM MAIL   Вверх
kami
Дата 7.2.2011, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(cyberovskij @  7.2.2011,  15:59 Найти цитируемый пост)
У меня Delphi 7.

Аналогично.
Мой код(а вернее, Ваш smile  ) выдает "C:\Users\kami\AppData\Roaming" (у меня Vista):

Код

function TService1.GetUserAppPath(): string;
const
  SHGFP_TYPE_CURRENT = 0;
var
  path: array[0..MAX_PATH] of WideChar;
  h: tHandle;
  hh: THandle;
begin
  //CoInitialize(nil);

  //GetGlobalPrivilege('SeImpersonatePrivilege');
  //GetGlobalPrivilege('SeTcbPrivilege');

  if not WTSQueryUserToken(WTSGetActiveConsoleSessionId(), h) then
    LogMessage('WTSQueryUserToken');
  if not DuplicateToken(h, SecurityImpersonation, @hh) then
    LogMessage('DuplicateToken');

  if hh > 0 then
    begin
      LogMessage(' impersonated token = ' + IntToStr(hh));
      if SUCCEEDED(SHGetFolderPathW(0, CSIDL_APPDATA, hh, SHGFP_TYPE_CURRENT, @path[0])) then
        Result := path
      else
        Result := 'null';
    end
  else
    Result := 'none';
end;

PM MAIL WWW   Вверх
cyberovskij
Дата 7.2.2011, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 6.5.2010

Репутация: нет
Всего: нет



И у меня кстати мой (вернее Ваш) код выдает: C:\Documents and Settings\user2\Application Data smile 
в чем разница?
Код

function GetUserAppPath():string;
const
  SHGFP_TYPE_CURRENT = 0;

var
  path: array [0..MAX_PATH] of char;
  h:tHandle;
  hh:pHandle;
  res:HRESULT;
  //exehndl:integer;
 // hToken: Cardinal;
begin
  WTSQueryUserToken(WTSGetActiveConsoleSessionId(),h);
 // exehndl:=GetexeHandle ('explorer.exe');
  DuplicateToken(h,SecurityImpersonation,hh);
    if h>0 then
  begin
  
    res:=SHGetFolderPathW(0,CSIDL_PERSONAL,hh^,SHGFP_TYPE_CURRENT,@path[0]);
    case res of
    S_OK:  Result := path ;
    S_FALSE:         Result := 'S_FALSE';
    E_FAIL:         Result := 'E_FAIL';
    E_INVALIDARG:         Result := 'E_INVALIDARG';
    end;
  
  end
  else
  Result := 'none';
end;




А мой, ну тот что совсем мой - нет? 

Это сообщение отредактировал(а) cyberovskij - 7.2.2011, 23:04
PM MAIL   Вверх
CodeMonkey
Дата 7.2.2011, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



Эээ, батенька.

Код
hh:PHandle;
...
DuplicateToken(h,SecurityImpersonation,hh);


Это что ещё такое? Ну и куда hh указывает? Правильно, в космос.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
cyberovskij
Дата 7.2.2011, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 6.5.2010

Репутация: нет
Всего: нет



Цитата(CodeMonkey @ 7.2.2011,  22:23)
Эээ, батенька.

Код
hh:PHandle;
...
DuplicateToken(h,SecurityImpersonation,hh);


Это что ещё такое? Ну и куда hh указывает? Правильно, в космос.

А как правильно с Phandle  работать?
PM MAIL   Вверх
CodeMonkey
Дата 8.2.2011, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



В данном случае - никак. Он не нужен. 

Что такое PHandle? Указатель на THandle. По определению. На какой THandle? В вашем коде - ни на какой. Вы ж его не присвоили.

А на какой должен указывать? Ну, на тот, куда результат записывать.

Так и напишем:

Код
var
  hh: THandle;
...
DuplicateToken(h,SecurityImpersonation,@hh);


Читать мат-часть.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
cyberovskij
Дата 8.2.2011, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 6.5.2010

Репутация: нет
Всего: нет



P.S. кстати с PHandle это была не единственная проблема. Кроме того кривым было еще и объявление
path: array [0..MAX_PATH] of char; а нужно было path: array[0..MAX_PATH] of WideChar; Поскольку в первом случае возвращался результат: "С" вместо нужного.
PM MAIL   Вверх
kami
Дата 8.2.2011, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(cyberovskij @  8.2.2011,  17:32 Найти цитируемый пост)
кривым было еще и объявлениеpath: array [0..MAX_PATH] of char; а нужно было path: array[0..MAX_PATH] of WideChar; 

гхм...

Цитата(kami @  6.2.2011,  15:24 Найти цитируемый пост)
Изменить-то нужно всего ничего
var
  path: array [0..MAX_PATH] of WideChar;


PM MAIL WWW   Вверх
CodeMonkey
Дата 8.2.2011, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



Ну всё, застремали человека  smile 


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1479 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.