Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

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

 
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 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
3-1090921050
Artjom
2004-07-27 13:37
2004.08.22
Изменение структуры таблицы


14-1091806756
Сергега
2004-08-06 19:39
2004.08.22
Куда пойти работать летом?


14-1091791513
Юрий Зотов
2004-08-06 15:25
2004.08.22
Переустановка Red Hat "по месту" - это возможно?


1-1092070645
кш
2004-08-09 20:57
2004.08.22
мастера!!! помогите!!! как выполнить команду командной строки,


1-1092048772
}|{yk
2004-08-09 14:52
2004.08.22
AV при Destroy