Текущий архив: 2005.03.20;
Скачать: CL | DM;
Вниз
NT как получить имя пользователя запустившего процесс? Найти похожие ветки
← →
mbIkola (2005-01-31 15:37) [0]День добрый программеры!!!
У меня такой вопрос. Как получить имя пользователя запустившего процесс? Имеется список процессов на Terminal сервере, но сейчас необходимо эти процессы привязать с именами пользователей кто эти процессы запустил.
← →
Игорь Шевченко © (2005-01-31 16:59) [1]OpenProcess+OpenProcessToken+GetTokenInformation+LookupAccountSid+CloseHandle+CloseHandle
← →
BiN © (2005-01-31 17:00) [2]
function GetProcessTokenSid(ProcessId:DWORD; Var Sid: PSID): Boolean; // освобождается через Realloc(Sid, 0);
var
hProcess:DWORD;
hToken:DWORD;
pTokenUserSID:PSIDAndAttributes;
dwRetLen:DWORD;
begin
Result:=False;
Sid:=nil;
hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId);
if hProcess=0 then Exit;
if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
begin
if not GetTokenInformation(hToken, TokenUser, nil, 0, dwRetLen) and
(GetLastError=ERROR_INSUFFICIENT_BUFFER) then
try
GetMem(pTokenUserSID, dwRetLen);
Result:=GetTokenInformation(hToken, TokenUser, pTokenUserSID, dwRetLen, dwRetLen);
if Result then
begin
dwRetLen:=GetLengthSid(pTokenUserSID^.Sid);
ReallocMem(Sid, dwRetLen);
Result:=CopySid(dwRetLen, Sid, pTokenUserSID^.Sid);
end;
finally
FreeMem(pTokenUserSID);
if not Result then ReallocMem(Sid, 0);
end;
CloseHandle(hToken);
end;
CloseHandle(hProcess);
end;
function GetProcessUserInformation(ProcessId:DWORD;
var UserName,
Domain,
SIDName:String):Boolean;
var
TokenSid: PSID;
PeUse: SID_NAME_USE;
begin
Result:=false;
if not GetProcessTokenSid(ProcessId, TokenSid) then Exit;
try
Result:=GetSidInfo(nil, TokenSid, UserName, Domain, PeUse);
finally
ReallocMem(TokenSid, 0);
end;
end;
← →
BiN © (2005-01-31 17:02) [3]Ах, да...
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;
← →
BiN © (2005-01-31 17:07) [4]Прошу прощения:
функцию GetProcessUserInformation следует записать как:
function GetProcessUserInformation(ProcessId:DWORD;
var UserName,
Domain: String;
var SIDName: SID_NAME_USE):Boolean;
var
TokenSid: PSID;
begin
Result:=false;
if not GetProcessTokenSid(ProcessId, TokenSid) then Exit;
try
Result:=GetSidInfo(nil, TokenSid, UserName, Domain, SIDName);
finally
ReallocMem(TokenSid, 0);
end;
end;
← →
Игорь Шевченко © (2005-01-31 17:20) [5]BiN © (31.01.05 17:07) [4]
Давай померяемся ? :)
type
ZString = array[0..Pred(1024)] of char;
function SIDToName (const SID: PSID): string;
var
Use: SID_NAME_USE;
DomainName: ZString;
DomainNameLength: DWORD;
Name: ZString;
NameLength: DWORD;
begin
DomainNameLength := SizeOf(DomainName);
NameLength := SizeOf(Name);
if not LookupAccountSid (nil, SID, Name, NameLength, DomainName,
DomainNameLength, Use) then
Result := "***"
else
Result := Name;
end;
function THSNtProcessInfo.GetUserName: string;
var
AccessToken: THandle;
SidInfo: PSIDANDATTRIBUTES;
ReturnLength: DWORD;
ProcessHandle: THandle;
begin
Result := "";
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, false,
Info.ProcessId);
if ProcessHandle = 0 then
Exit;
try
if not OpenProcessToken(ProcessHandle, TOKEN_QUERY, AccessToken) then
Exit;
GetMem (SidInfo, 4096);
try
Win32Check(GetTokenInformation(AccessToken, TokenUser, SidInfo, 4096,
ReturnLength));
Result := SidToName(SidInfo^.Sid);
finally
FreeMem(SidInfo);
CloseHandle(AccessToken);
end;
finally
CloseHandle(ProcessHandle);
end;
end;
С уважением,
← →
BiN © (2005-01-31 17:28) [6]Игорь Шевченко © (31.01.05 17:20) [5]
Давай померяемся ? :)
:))
А вот еще
///////////////////////////////////////////////////////
//Получение текстового представления SID-а
//
function SidToStr(SID:PSID):String;
var
dwRetLen:DWORD;
begin
if not GetTextualSid(SID, nil, dwRetLen) and (dwRetLen<>0) and
(GetLastError=ERROR_INSUFFICIENT_BUFFER) then
begin
SetLength(Result, dwRetLen);
if GetTextualSid(SID, @Result[1], dwRetLen)
then SetLength(Result, dwRetLen)
else RaiseLastWin32Error;
end
else RaiseLastWin32Error;
end;
//Портировано из примера от Microsoft
function GetTextualSid(Sid: PSID; pszSidText: PChar; var dwBufferLen: DWORD): BOOL;
var
psia: PSIDIdentifierAuthority;
dwSubAuthorities: DWORD;
dwSidRev: DWORD;
dwCounter: DWORD;
dwSidSize: DWORD;
begin
Result := False;
dwSidRev := SID_REVISION;
// Validate the binary SID.
if not IsValidSid(Sid) then Exit;
// Get the identifier authority value from the SID.
psia := GetSidIdentifierAuthority(Sid);
// Get the number of subauthorities in the SID.
dwSubAuthorities := GetSidSubAuthorityCount(Sid)^;
// Compute the buffer length.
// S-SID_REVISION- + IdentifierAuthority- + subauthorities- + NULL
dwSidSize := (15 + 12 + (12 * dwSubAuthorities) + 1) * SizeOf(Char);
if (dwBufferLen < dwSidSize) or (pszSidText=nil) then
begin
dwBufferLen := dwSidSize;
SetLastError(ERROR_INSUFFICIENT_BUFFER);
Exit;
end;
// Add "S" prefix and revision number to the string.
StrFmt(pszSidText, "S-%u-", [dwSidRev]);
// Add SID identifier authority to the string.
if (psia.Value[0] <> 0) or (psia.Value[1] <> 0) then
StrFmt(pszSidText + StrLen(pszSidText),
"0x%.2x%.2x%.2x%.2x%.2x%.2x",
[psia.Value[0], psia.Value[1], psia.Value[2],
psia.Value[3], psia.Value[4], psia.Value[5]])
else
StrFmt(pszSidText + StrLen(pszSidText),
"%u",
[DWORD(psia.Value[5]) +
DWORD(psia.Value[4] shl 8) +
DWORD(psia.Value[3] shl 16) +
DWORD(psia.Value[2] shl 24)]);
dwSidSize := StrLen(pszSidText);
// Add SID subauthorities to the string.
//
for dwCounter := 0 to dwSubAuthorities - 1 do
begin
StrFmt(pszSidText + dwSidSize, "-%u",
[GetSidSubAuthority(Sid, dwCounter)^]);
dwSidSize := StrLen(pszSidText);
end;
Result := True;
end;
← →
Игорь Шевченко © (2005-01-31 17:35) [7]BiN © (31.01.05 17:28) [6]
> А вот еще
>
>
>
> ///////////////////////////////////////////////////////
> //Получение текстового представления SID-а
> //
function RtlConvertSidToUnicodeString(
UnicodeString: PUNICODE_STRING;
Sid: PSID;
AllocateDestinationString: BOOL): NTSTATUS; stdcall; external "NTDLL.DLL";
У меня короче :)
И код для преобразование UNICODE_STRING в string - еще три строчки.
С уважением,
← →
BiN © (2005-01-31 17:40) [8]Игорь Шевченко © (31.01.05 17:35) [7]
У меня короче :)
:))
А в NT?
С не меньшим,
← →
BiN © (2005-01-31 17:51) [9]RtlConvertSidToUnicodeString
Спасибо, Игорь! Ведь попадалась она, зараза, на глаза, а я по старинке нутро sid-a ворошу.
← →
Игорь Шевченко © (2005-01-31 17:53) [10]BiN © (31.01.05 17:51) [9]
Насчет того, что в NT - там примерно то же, что ты написал постом выше. Но если оно уже написано, то не воспользоваться этим просто грех. Я все никак не обновлю на своем сайте прототипы ntdll, если интересно, почту знаешь.
С уважением,
← →
Набережных С. © (2005-01-31 19:54) [11]>Игорь Шевченко © (31.01.05 17:53) [10]
А ConvertSidToStringSid/ConvertStringSidToSid из ADVAPI32.DLL AdvApi.dll разве не то же самое?
← →
Игорь Шевченко © (2005-02-01 10:41) [12]Набережных С. © (31.01.05 19:54) [11]
Если честно - не знаю. Весьма вероятно, я в advapi не настолько силен.
С уважением,
← →
mbIkola (2005-02-04 19:58) [13]Ну блин братцы спасибо за ответ :)
Страницы: 1 вся ветка
Текущий архив: 2005.03.20;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.028 c