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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2013, 16:34   #1
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию Определение имени пользователя

Всем доброго времени суток. Вопрос такой:

Как можно определить имя пользователя, который запустил мою программу ( т.е. нужно именно то имя пользователя, которое будет выводится на против процесса в диспетчере задач )
-Jack- вне форума Ответить с цитированием
Старый 22.08.2013, 16:45   #2
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Код:
function GetUserName: string;
var
  UserName : string;
  UserNameLen : Dword;
begin
  UserNameLen := 255;
  SetLength(userName, UserNameLen);
  if GetUserName(PChar(UserName), UserNameLen) then
    Result := Copy(UserName,1,UserNameLen - 1)
  else
    Result := 'Unknown';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 showmessage(GetUserName);
end;
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 22.08.2013, 17:30   #3
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Это не то ... Этот код выводит имя текущей учетной записи пользователя, но не имя, которое выводится в диспетчере задач...
-Jack- вне форума Ответить с цитированием
Старый 22.08.2013, 17:39   #4
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Цитата:
Сообщение от -Jack- Посмотреть сообщение
Это не то ... Этот код выводит имя текущей учетной записи пользователя, но не имя, которое выводится в диспетчере задач...
Вообще-то там как раз и отображается имя пользователя, то есть имя учётной записи, от которого запущена та или иная программа




Ставь вопрос более конкретно. Телепатов тут нет. Если ты хочешь узнать имя пользователя, который работает с твоей программой - то это именно тот способ. Если как-то иначе, то опиши сначала подробно, что именно ты хочешь
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru

Последний раз редактировалось grominfo; 22.08.2013 в 17:41.
grominfo вне форума Ответить с цитированием
Старый 22.08.2013, 17:43   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Этот код выводит имя текущей учетной записи пользователя
Ошибаешся:
Цитата:
The GetUserName function retrieves the user name of the current thread
Это именно то.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.08.2013, 17:48   #6
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Факт в том, что не всегда будет выводиться имя пользователя, иногда там выводится что-то другое ...
К примеру, на твоем скрине есть процесс winlogon.exe без имени пользователя ...

Вот и нужно, зная PID, Handle процесса получить имя пользователя, который работает с этим процессом ... Т.е. не факт что это будет именно "Grom", может быть System или вообще пусто ...

Последний раз редактировалось -Jack-; 22.08.2013 в 17:53.
-Jack- вне форума Ответить с цитированием
Старый 22.08.2013, 17:53   #7
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Цитата:
Сообщение от -Jack- Посмотреть сообщение
Факт в том, что не всегда будет выводиться имя пользователя, иногда там выводится что-то другое ...
К примеру, на твоем скрине есть процесс winlogon.exe без имени пользователя ...

Вот и нужно, зная PID, Handle процесса получить имя пользователя, который работает с этим процессом ... Т.е. не факт что это будет именно "Grom", может быть System или вообще пусто ...


Хотя ... скорее всего не кто работает, а от чьего имени запущена программа ...
Вот и надо было сразу говорить, что хочешь узнать имя пользователя по PiD процесса. Каков был вопрос - такой был и ответ!

http://www.programmersforum.ru/showthread.php?t=69510
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 22.08.2013, 18:02   #8
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Если я ничего не путаю, в той ссылке имя процесса по PID ... но никак не имя пользователя ...

----------------------------
Вся проблема в том, что при запуске программы в диспетчере пишется не имя пользователя, а "АНОНИМНЫЙ ВХОД" ...
Вот и нужно в случаи анонимного входа прописать несколько условий и действий ...

Последний раз редактировалось -Jack-; 22.08.2013 в 18:07.
-Jack- вне форума Ответить с цитированием
Старый 22.08.2013, 18:06   #9
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Ну я тебе просто показал, куда копать. Раньше я как-то использовал вот такую функцию

Код:
function GetUserByPID(pid : DWORD) : string;
var
   hProcess, hToken : THandle;
   AccountName, DomainName : array[0 .. MAXCHAR - 1] of Char;
   lenNeeded : DWORD;
   userData : PTokenUser;
   dwRes, AccSize, DomSize : DWORD;
   sidType : SID_NAME_USE;
   bRes : BOOL;
begin
   result := '';
   hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, pid);
   if(hProcess <> INVALID_HANDLE_VALUE) then
   begin
      OpenProcessToken(hProcess, TOKEN_QUERY, hToken);
      lenNeeded := 0;
      GetTokenInformation(hToken, TokenUser, nil, 0, lenNeeded);
 
      if GetLastError = ERROR_INSUFFICIENT_BUFFER then
      begin
         userData := HeapAlloc(GetProcessHeap, 0, lenNeeded);
         if userData <> nil then
         begin
            bRes := GetTokenInformation(hToken, TokenUser, userData, lenNeeded, lenNeeded);
            if bRes then
            begin
               sidType := SidTypeUnknown;
               AccSize := MAXCHAR;
               DomSize := MAXCHAR;
               bRes := LookupAccountSid(nil, userData^.User.Sid, accountName,
                                        AccSize, domainName, DomSize, sidType);
               Result := StrPas(domainName) + '\' + StrPas(accountName);
            end;
            HeapFree(GetProcessHeap, 0, userData);
         end;
      end;
      CloseHandle(hProcess);
   end;
end;
Но что-то в ней у меня не работало, и я бросил. Погугли, наверняка уже есть готовые решения.

Вот тут посмотри

http://www.sources.ru/msdn/howto/q111544.shtml
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru

Последний раз редактировалось Stilet; 22.08.2013 в 18:24.
grominfo вне форума Ответить с цитированием
Старый 22.08.2013, 18:10   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

grominfo,Stilet - сабж не правильно сработает если целевой процесс запущен в сессии другого пользователя.

Попробуйте мой код:
Код:
function GetProcessUser(aPID: Cardinal; var aResult: string): Boolean;
type
  PTOKEN_USER = ^TOKEN_USER; 

  _TOKEN_USER = record
    User: TSidAndAttributes;
  end;

  TOKEN_USER = _TOKEN_USER;
var
  cbBuf: Cardinal;
  ptiUser: PTOKEN_USER;
  snu: SID_NAME_USE;
  hToken, hProcess: THandle;
  UserSize, DomainSize: Cardinal;
  bSuccess: Boolean;
  sUser, sDomain: string;
begin
  Result := False;
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, False, aPID);
  if hProcess <> 0 then
  begin
    if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
    begin
      bSuccess := GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf);
      ptiUser := nil;
      while (not bSuccess) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) do
      begin
        ReallocMem(ptiUser, cbBuf);
        bSuccess := GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, cbBuf);
      end;
      CloseHandle(hToken);

      if not bSuccess then
        Exit;

      UserSize := 0;
      DomainSize := 0;
      LookupAccountSid(nil, ptiUser.User.Sid, nil, UserSize, nil, DomainSize, snu);
      if (UserSize <> 0) and (DomainSize <> 0) then
      begin
        SetLength(sUser, UserSize);
        SetLength(sDomain, DomainSize);
        if LookupAccountSid(nil, ptiUser.User.Sid, PChar(sUser), UserSize,
          PChar(sDomain), DomainSize, snu) then
        begin
          Result := True;
          aResult := StrPas(PChar(sDomain)) + '\' + StrPas(PChar(sUser));
        end;
      end;

      if bSuccess then
        FreeMem(ptiUser);

    end;
    CloseHandle(hProcess);
  end;
end;
Возвращает в формате: Домен\Имя пользователя
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление имени пользователя в программу Rowi Безопасность, Шифрование 10 27.09.2011 22:16
Получение имени пользователя Ellienn Microsoft Office Excel 18 31.08.2011 08:24
Запрашивание имени пользователя и сохранение конфигурации Viresta Общие вопросы Delphi 1 27.12.2010 01:05
Определение имени пользователя из сервиса Garacio_cain Общие вопросы Delphi 2 10.12.2009 17:17
Прочесс без имени пользователя delphin100 Общие вопросы Delphi 0 29.10.2008 06:45