Форум: "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.037 c