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

Вниз

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

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

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

Наверх




Память: 0.48 MB
Время: 0.036 c
3-1087292955
Павел
2004-06-15 13:49
2004.07.11
База данных


8-1082697515
Gia Gvatua
2004-04-23 09:18
2004.07.11
Картография


14-1087908167
syte_ser78
2004-06-22 16:42
2004.07.11
Переменные в html


6-1084492318
Andrei82
2004-05-14 03:51
2004.07.11
Работа с HTML в Delphi


1-1087470362
COOLer
2004-06-17 15:06
2004.07.11
чтение word DOC формата





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский