Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.026 c
1-1109945501
andrey__
2005-03-04 17:11
2005.03.20
TDBGrid - свойство FixedCols


6-1105978696
CBOLOCH
2005-01-17 19:18
2005.03.20
Отловить новую сессию


14-1109655233
КаПиБаРа
2005-03-01 08:33
2005.03.20
Инженерный калькулятор для сотового


1-1109847063
Veles
2005-03-03 13:51
2005.03.20
Протокол модема в текстовый файл


9-1104227841
Xenon
2004-12-28 12:57
2005.03.20
Вопрос про свойства объектов