Форум: "WinAPI";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизЛогин пользователя, запустившего процесс Найти похожие ветки
← →
Помощник админа (2004-12-07 08:46) [0]Всем доброго времени суток!
Надеюсь на помощь Знатоков:
Дано:
Windows Server 2003
Некое приложение с известным именем типа "programma.exe", запускаемое от имени разных пользователей
Требуется:
Программно получить список Логинов, от имени которых в текущий момент времени запущено приложение.
В идеале - на удаленной машине, но пойдет и на локальной. ;-)
Запускаться программа будет администратором, поэтому все права считаются доступными.
← →
Xaker © (2004-12-07 10:09) [1]внедриться в каждый экземпляр и "спрость" имя запустившего:)
← →
BiN © (2004-12-07 10:12) [2]С помощью EnumProcess получаешь спсиок процессов. В списке находишь процессы с нужным тебе именем образа. Затем что-то типа
function GetSidInfo(lpSystemName: PChar; Sid: PSID;
var Name, Domain: string; var Use: SID_NAME_USE):Boolean;
var
cbNameLen: DWORD;
cbDomainLen: DWORD;
begin
Result:=IsValidSid(Sid);
if not Result then
begin
SetLastError(ERROR_INVALID_SID);
Exit;
end;
cbNameLen := UNLEN + 1;
cbDomainLen := DNLEN + 1;
SetLength (Name, cbNameLen);
SetLength (Domain, cbDomainLen);
Result:=LookupAccountSid (lpSystemName, Sid, PChar (Name), cbNameLen, PChar (Domain), cbDomainLen, Use);
if not Result
then Exit;
Name := PChar (Name);
Domain := PChar (Domain);
end;
function GetProcessUserInformation(ProcessId:DWORD;
var UserName,
Domain;
var NameUse: DWORD):BOOL;
var
hProcess:DWORD;
hToken:DWORD;
pTokenUserSID:PSIDAndAttributes;
dwRetLen:DWORD;
PeUse:SID_NAME_USE;
cbName, cbDomain:DWORD;
begin
Result:=False;
hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId);
if hProcess<>0 then
begin
if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
begin
if not GetTokenInformation(hToken, TokenUser, nil, 0, dwRetLen) and
(GetLastError=ERROR_INSUFFICIENT_BUFFER) then
begin
GetMem(pTokenUserSID, dwRetLen);
try
if GetTokenInformation(hToken, TokenUser, pTokenUserSID, dwRetLen, dwRetLen) then
begin
Result:= GetSidInfo(nil, pTokenUserSID^.Sid, UserName, Domain, PeUse);
end;
finally
FreeMem(pTokenUserSID, dwRetLen);
end;
end;
CloseHandle(hToken);
end;
CloseHandle(hProcess);
end;
end;
← →
BiN © (2004-12-07 10:15) [3]Да тут по ходу кое-что изменял. С NameUse заморочка :)
Должно быть так:function GetProcessUserInformation(ProcessId:DWORD;
var UserName,
Domain;
var NameUse: SID_NAME_USE):BOOL;
var
hProcess:DWORD;
hToken:DWORD;
pTokenUserSID:PSIDAndAttributes;
dwRetLen:DWORD;
cbName, cbDomain:DWORD;
begin
Result:=False;
hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId);
if hProcess<>0 then
begin
if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
begin
if not GetTokenInformation(hToken, TokenUser, nil, 0, dwRetLen) and
(GetLastError=ERROR_INSUFFICIENT_BUFFER) then
begin
GetMem(pTokenUserSID, dwRetLen);
try
if GetTokenInformation(hToken, TokenUser, pTokenUserSID, dwRetLen, dwRetLen) then
begin
Result:= GetSidInfo(nil, pTokenUserSID^.Sid, UserName, Domain, NameUse);
end;
finally
FreeMem(pTokenUserSID, dwRetLen);
end;
end;
CloseHandle(hToken);
end;
CloseHandle(hProcess);
end;
end;
← →
Игорь Шевченко © (2004-12-07 10:22) [4]http://www.sysinternals.com - Process Explorer
← →
Помощник админа (2004-12-07 10:45) [5]
> BiN © (07.12.04 10:15) [3]
Большое спасибо. Попробую.
Игорь Шевченко © (07.12.04 10:22) [4]
> http://www.sysinternals.com - Process Explorer
Спасибо, программка неплохая (скачал ее ранее), но не нашел (а может плохо искал ;-) ) в ней возможности обрабатывать информацию.
Я хочу список полученных логинов позже обрабатывать...
Все как всегда, если чего-то не хватает в стандартных программах - хочется сделать самому...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.062 c