Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

Имя текущего пользователя, из под сервиса...   Найти похожие ветки 

 
han_malign ©   (2004-07-08 14:08) [0]

Собственно вопрос, как из под сервиса узнать актуальный акаунт текущего пользователя.
GetUserName выдает "SYSTEM", если "Log On As" - "Local System"(и в других случаях, соответсвенно, того пользователя под которым он "Log On As"). А надо бы от "Log On As" не зависеть, но под сервисом.


 
Rouse_ ©   (2004-07-08 14:49) [1]

function GetUserNameFromService(ProcessID : THandle; DomainName : Boolean = False): string;
var
 Token: THandle;
 Process : THandle;
 User: PSIDAndAttributes;
 szName, szDomain: PChar;
 dwSize, dwNameSize,
 dwDomainSize, dwUse: DWORD;
begin
 Result := "";
 if ProcessID <= 8 then
   Result := "SYSTEM"
 else begin
   Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID);
   if Process <> 0 then try
     if OpenProcessToken(Process, TOKEN_QUERY, Token) then try
        User := nil; dwSize := 0;
        if not GetTokenInformation(Token, TokenUser, User,
           dwSize, dwSize) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin
          GetMem(User, dwSize);
          try
            if GetTokenInformation(Token, TokenUser, User,
               dwSize, dwSize) then begin
              dwNameSize   := 0;
              dwDomainSize := 0;
              if not LookupAccountSid(nil, User.Sid, nil, dwNameSize, nil, dwDomainSize, dwUse) and
                (GetLastError = ERROR_INSUFFICIENT_BUFFER)  then begin
                GetMem(szName, dwNameSize + 1);
                GetMem(szDomain, dwDomainSize + 1);
                try
                  if LookupAccountSid(nil, User.Sid, szName, dwNameSize, szDomain, dwDomainSize, dwUse) then
                    Result := IfThen(DomainName, StrPas(szDomain) + "\") + StrPas(szName)
                finally
                  FreeMem(szName);
                  FreeMem(szDomain)
                end
              end
            end
          finally
            FreeMem(User)
          end
        end
     finally
       CloseHandle(Token)
     end
   finally
     CloseHandle(Process)
   end
 end
end;


 
Игорь Шевченко ©   (2004-07-08 14:50) [2]

Rouse_ ©   (08.07.04 14:49)

Эт чего ?


 
DiamondShark ©   (2004-07-08 14:59) [3]


> Эт чего ?

Кц.


 
Игорь Шевченко ©   (2004-07-08 15:04) [4]


> как из под сервиса узнать актуальный акаунт текущего пользователя


Кто есть такой "текущий пользователь" ?


 
Anatoly Podgoretsky ©   (2004-07-08 15:10) [5]

han_malign ©   (08.07.04 14:08)  
Это правильно, система многопользовательская, любой сервис работает от какого ни будь пользователя.


 
Rouse_ ©   (2004-07-08 15:18) [6]

Это показывает под каким уккаунтом запущен процесс, дальше думаю Автор разберется...


 
han_malign ©   (2004-07-08 15:34) [7]

"под каким уккаунтом запущен процесс" - это я и не извращаясь могу узнать.

>Кто есть такой "текущий пользователь" ?
- тот который нажал Ctrl+Alt+Del и набрал свой логин. Вот этот логин мне и нужен.

Задача: на некоторые события (SMS, пропажа сетевого каталога, смена пользователя) - переконфигурировать сервис.

Должен же где нибудь быть зафиксирован "основной" GUI пользователь? Разве что - HKEY_CURRENT_USER ковырнуть?


 
clickmaker ©   (2004-07-08 15:43) [8]


> Разве что - HKEY_CURRENT_USER ковырнуть?

Ковырни. Тока там будет юзер, под которым пашет сервис


 
Игорь Шевченко ©   (2004-07-08 15:46) [9]


> Разве что - HKEY_CURRENT_USER ковырнуть?


Для сервиса он .default

> - тот который нажал Ctrl+Alt+Del и набрал свой логин. Вот
> этот логин мне и нужен.


А если никто не набрал ?

А если пользователь удаленно подключился ?

А если Windows XP или Terminal Services ?

Совет: Можно перечислить Logon-сессии и выбрать из них интерактивную. Из этой сессии узнать пользователя.


 
han_malign ©   (2004-07-08 16:07) [10]

>А если никто не набрал ?
>А если пользователь удаленно подключился ?
- наберут, и локально - "гостевой" логин для "человека в маске".

>Можно перечислить Logon-сессии
- знать бы как...
Наверно проще будет перебрать процессы на предмет обнаружения "аварийного" владельца, во всяком случае, это теперь я хоть знаю как(спасибо Rouse_ ©   (08.07.04 14:49) [1]).


 
Игорь Шевченко ©   (2004-07-08 16:11) [11]

han_malign ©   (08.07.04 16:07)


> - знать бы как...


LsaEnumerateLogonSessions + LsaGetLogonSessionData


 
han_malign ©   (2004-07-08 16:25) [12]

>LsaEnumerateLogonSessions + LsaGetLogonSessionData
- уже нашел, главное перестать тупить и задать нормальный критерий поиска в MSDN.:))) Но все равно спасибо.
З.Ы. И MSDN порадовал - в кои-то веки, сразу пример с коментариями, раньше они этим "не грешили"...:)))


 
Игорь Шевченко ©   (2004-07-08 16:33) [13]

han_malign ©   (08.07.04 16:25)

Там как раз все просто - LogonType должен быть Interactive и UserName уже готовый. Единственное, к чему следует подготовиться - к тому, что таких пользователей может оказаться несколько.

С уважением,


 
han_malign ©   (2004-07-08 18:20) [14]

Все Ob, ВСЕМ СПАСИБО, алгоритм ясен
7 Sessions
UN: a-zolkin; LD: GRANDPRIX; AP: Kerberos - Try cached credentials without hitting the net.
UN: a-zolkin; LD: GRANDPRIX; AP: Kerberos - Try cached credentials without hitting the net.
UN: ANONYMOUS LOGON; LD: NT AUTHORITY; AP: NTLM - Accessing system via network
UN: LOCAL SERVICE; LD: NT AUTHORITY; AP: Negotiate - Service started by service controller
UN: NETWORK SERVICE; LD: NT AUTHORITY; AP: Negotiate - Service started by service controller
UN: ; LD: ; AP: NTLM - UNKNOWN(0)
UN: A-ZOLKIN$; LD: GRANDPRIX; AP: Negotiate - UNKNOWN(0)
7 Sessions
UN: test; LD: A-ZOLKIN; AP: NTLM - Interactively logged on (locally or remotely)
UN: a-zolkin; LD: GRANDPRIX; AP: Kerberos - Try cached credentials without hitting the net.
UN: ANONYMOUS LOGON; LD: NT AUTHORITY; AP: NTLM - Accessing system via network
UN: LOCAL SERVICE; LD: NT AUTHORITY; AP: Negotiate - Service started by service controller
UN: NETWORK SERVICE; LD: NT AUTHORITY; AP: Negotiate - Service started by service controller
UN: ; LD: ; AP: NTLM - UNKNOWN(0)
UN: A-ZOLKIN$; LD: GRANDPRIX; AP: Negotiate - UNKNOWN(0)



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.034 c
6-1088132426
][ncognito
2004-06-25 07:00
2004.08.22
Rasapi32.dll


1-1092121476
MetalFan
2004-08-10 11:04
2004.08.22
переделать Combobox


14-1091540043
Igor_thief
2004-08-03 17:34
2004.08.22
Class


14-1091733356
Anonim
2004-08-05 23:15
2004.08.22
Программистам на Delphi посвящается


4-1089208107
Himera
2004-07-07 17:48
2004.08.22
Добавление кнопки в заголовок ВСЕХ окон





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский