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

Вниз

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

 
diMAN   (2004-05-26 13:16) [0]

Из своей программы с помощью CreateProcessWithLogonW запускаю от имени другого пользователя другую программу. Как мне в этой, запущенной от имени другого пользователя, программе, узнать от чьего имени она была запущена (с чьими правами она работает)?


 
Clickmaker ©   (2004-05-26 13:34) [1]

GetUserName


 
diMAN   (2004-05-26 13:48) [2]

К сожалению это не так.
GetUserName, так же как и OpenProcess + GetSecurityInfo + LookupAccountSid, а также OpenProcessToken + GetTokenInformation + LookupAccountSid возвращают имя пользователя, который выполнил CreateProcessWithLogonW, а не то имя, с правами которого работает запущеннная программа.


 
Игорь Шевченко ©   (2004-05-26 14:23) [3]


> OpenProcessToken + GetTokenInformation + LookupAccountSid
> возвращают имя пользователя
> который выполнил CreateProcessWithLogonW,


Код в студию


 
diMAN   (2004-05-27 14:45) [4]

Вот примерчик:
Я пробовал и TokenUser и TokenOwner, но результат всё тот же.

 if OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, hToken)
  then begin
    if GetTokenInformation(hToken, TokenUser, TokenInformation, TokenInformationLength, ReturnLength)
    then begin
      pSid := TOKEN_USER(TokenInformation^).User.Sid;
      if IsValidSid(pSid)
      then begin
        cbName := dwSizeNeeded;
        Name   := HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, cbName );
        cbReferencedDomainName := dwSizeNeeded;
        ReferencedDomainName   := HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, cbReferencedDomainName );
        if LookupAccountSid(nil, pSid, Name, cbName, ReferencedDomainName, cbReferencedDomainName, PeUse)
          then Result := ReferencedDomainName + "\" + Name
          else Result := "Error Convert Sid: " + SysErrorMessage(GetLastError);
        HeapFree( GetProcessHeap(), 0, Name );
        HeapFree( GetProcessHeap(), 0, ReferencedDomainName );
      end;
    end;
  end;


 
Игорь Шевченко ©   (2004-05-27 14:59) [5]

А код выполнения создания процесса ?


 
diMAN   (2004-05-27 15:55) [6]

А вот код, которым я запускаю программу от имени другого пользователя:

var
StartupInfo       : TStartupInfo;
ProcessInfo       : TProcessInformation;
h                 : THandle;
WStartupInfo      : TStartupInfoW;
begin
 FillChar(WStartupInfo, Sizeof(WStartupInfo), #0);
 WStartupInfo.cb          := Sizeof(WStartupInfo);
 WStartupInfo.dwFlags     := STARTF_USESHOWWINDOW;
 WStartupInfo.wShowWindow := Visibility;

 CreateProcessWithLogonW(PWideChar(UserName), PWideChar(DomainName), PWideChar(Password),     LOGON_NETCREDENTIALS_ONLY, PWideChar(FileName), nil,
   CREATE_NEW_CONSOLE, nil, nil, WStartupInfo, ProcessInfo);
end;


 
Игорь Шевченко ©   (2004-05-27 16:37) [7]

diMAN   (27.05.04 15:55) [6]

LOGON_NETCREDENTIALS_ONLY - Log on, but use the specified credentials on the network only. The new process uses the same token as the caller, but the system creates a new logon session within LSA, and the process uses the specified credentials as the default credentials.


 
diMAN   (2004-05-29 15:02) [8]

Я тоже умею читать MSDN и, естественно, прочитал всё вышесказанное. Возможно я не совсем правильно задал вопрос, но мне как раз хотелось узнать имя пользователя от имени которого я запустил этот процесс. Под этим я подразумевал имя пользователя с чьими правами запущенная программа будет работать. Если из запущенной программы я пытаюсь подключиться к другому компьютеру, то соединение как раз и происходит не от моего имени, а от имени того пользователя с правами которого я запустил эту программу. Так вот как раз это имя мне и нужно было узнать, т.е. specified credentials см. выше.


 
Игорь Шевченко ©   (2004-05-29 18:35) [9]


> but the system creates a new logon session within LSA, and
> the process uses the specified credentials as the default
> credentials.


Тут недавно была ветка, как из сервиса узнать имя пользователя, приводилось решение путем перебора Logon-сессий. Может, пригодится ?


 
diMAN   (2004-05-31 08:29) [10]

Спасибо за совет. Я им уже воспользовался, но результат тот же.
С помощью GetTokenInformation с параметром TokenStatistics получил структуру TOKEN_STATISTICS:
typedef struct _TOKEN_STATISTICS { // tst  
   LUID  TokenId;
   LUID  AuthenticationId;
   LARGE_INTEGER ExpirationTime;
   TOKEN_TYPE    TokenType;
   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
   DWORD DynamicCharged;
   DWORD DynamicAvailable;
   DWORD GroupCount;
   DWORD PrivilegeCount;
   LUID  ModifiedId;
} TOKEN_STATISTICS;

Так вот, используя значение AuthenticationId в LsaGetLogonSessionData, получил UserName. Так вот оно всё равно моё :((


 
Игорь Шевченко ©   (2004-05-31 11:23) [11]

А может, проще сделать ? :) Раз оба процесса твои, то передавать это имя пользователя в параметрах, например в командной строке :)


 
diMAN   (2004-05-31 14:00) [12]

Не, это я для контроля запущенных програм на сервере. У нас и народ через Citrix и через Remote Desktop Connection подключается, так вот хотелось бы знать кто что там запускает. Я просто посмотрел на свою сессию и увидел, что программа запущенная через CreateProcessWithLogonW реально обладает правами того пользователя от имени которого она запущена, а в Диспетчере задач выводится имя пользователя её запустившего.



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

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

Наверх




Память: 0.5 MB
Время: 0.024 c
6-1084205797
Alexey8000
2004-05-10 20:16
2004.07.11
Создание простешего сокетного сервера! Помомгите начинающему!


3-1086928311
Kurmanbek
2004-06-11 08:31
2004.07.11
Помогите востановить базу


3-1086980650
Karburator
2004-06-11 23:04
2004.07.11
объединить две таблицы, но...


3-1087296795
Aleksej
2004-06-15 14:53
2004.07.11
Запрос к 3 таблицам.


1-1088292852
Suomi
2004-06-27 03:34
2004.07.11
Инсталляция компонентов