Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 543

/ вопрос решён /

Здравствуйте, уважаемые эксперты!
Помогите пожалуйста
Как можно определить имя пользователя из сервиса?

Следующий код определяет имя пользователя в системе:

 function TForm1.GetUserFromWindows: 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;

Все прекрасно работает, но потом потребовалось запустить данную программу через сервис.
В результате, имя пользователя стало определяеться как SYSTEM.
Как теперь можно определить имя активного пользователя в системе?

neon Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: neon (статус: Посетитель)
Вопрос отправлен: 30 июля 2011, 11:20
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 4 августа 2011, 06:16; участников в обсуждении: 2.
DNK

DNK (статус: Студент), 30 июля 2011, 13:16 [#1]:

Почитай здесь.
"Digital Networked Knight"

30 июля 2011, 19:47: Вопрос перемещён из тематического раздела Delphi » Программирование с помощью API в раздел Delphi » Взаимодействие с Windows модератором Ерёмин А.А.

neon

neon (статус: Посетитель), 4 августа 2011, 06:16 [#2]:

Решилось только так:
https://groups.google.com/group/borland.public.delphi.winapi/browse_thread/thread/18baae31c9b4173d/51a1fc3efaeaa18d%2351a1fc3efaeaa18d?hl=mo


uses windows, psapi; 
 
function GetExplorerUser : string; 
 var 
   explorerProcessHandle : THandle; 
   tokenhandle : THandle; 
   puser : PSidAndAttributes; 
   infoLen : DWORD; 
   userName, domainName : array [0..256] of char; 
   userNameLen, domainNameLen : DWORD; 
   use : Sid_Name_Use; 
 
  function OpenProcessHandle (const process : string) : THandle; 
   var 
     buffer, pid : PDWORD; 
     bufLen, cbNeeded : DWORD; 
     hp : THandle; 
     fileName : array [0..256] of char; 
     i : Integer; 
   begin 
     result := 0; 
     bufLen := 65536; 
     GetMem (buffer, bufLen); 
     try 
       if EnumProcesses (buffer, bufLen, cbNeeded) then 
       begin 
         pid := buffer; 
         for i := 0 to cbNeeded div sizeof (DWORD) - 1 do 
         begin 
           hp := OpenProcess (PROCESS_VM_READ or 
 PROCESS_QUERY_INFORMATION, False, pid^); 
           if hp <> 0 then 
           try 
             if (GetModuleBaseName (hp, 0, fileName, sizeof (fileName)) 
> 0) and 
 
               (CompareText (fileName, process) = 0) then 
             begin 
               result := hp; 
               break 
             end 
           finally 
             if result = 0 then 
               CloseHandle (hp) 
           end; 
 
          Inc (pid) 
         end 
       end 
     finally 
       FreeMem (buffer) 
     end 
   end; 
 
begin 
   result := ''; 
   explorerProcessHandle := OpenProcessHandle ('explorer.exe'); 
   if explorerProcesshandle <> 0 then 
   try 
     if OpenProcessToken (explorerProcessHandle, TOKEN_QUERY, 
 tokenHandle) then 
     try 
       GetMem (puser, 65536); 
       try 
         if GetTokenInformation (tokenHandle, TokenUser, puser, 65536, 
 infoLen) then 
         begin 
           if LookupAccountSID (nil, puser^.Sid, userName, userNameLen, 
 domainName, domainNameLen, use) then 
             result := userName 
         end 
       finally 
         FreeMem (puser) 
       end 
     finally 
       CloseHandle (tokenHandle) 
     end 
   finally 
     CloseHandle (explorerProcessHandle) 
   end 
 end;

4 августа 2011, 06:16: Статус вопроса изменён на решённый (изменил автор вопроса — neon)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:43
Выполнено за 0.03 сек.