Главная страница
    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.49 MB
Время: 0.028 c
6-1105461796
ROMBLLER
2005-01-11 19:43
2005.03.20
как очистить кеш определённой страници в TWebBrowser


6-1105980897
Piter
2005-01-17 19:54
2005.03.20
Как можно узнать о разрыве RAS соединения


1-1109931041
Cat
2005-03-04 13:10
2005.03.20
Надо открыть запрос, если он не пустой!


8-1102160272
Студент_
2004-12-04 14:37
2005.03.20
Идентичное отображение на принтере


14-1109319235
Bless
2005-02-25 11:13
2005.03.20
Посоветуйте книжку по теории автоматов





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