![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
как определить что моя программа запущена как системный процесс?
думаю есть какая то стандартная функция advapi32, но я её не знаю что то типо isProcessSystem(p:HProc); есть такое? или как такое сделать? нашёл функцию GetSidSubAuthority, она возвращает Integrity Level, который, насколько я понимаю и является показателем системности процесса, у функции есть входящие параметры pSid: Pointer; и nSubAuthority: DWORD , откуда мне их узнать если возможно(без извращений) для своей собственной программы?) и в том ли направлении я копаю? сразу говорю, что функция GetUserName не подходит, так как имя ситсемы разное бывает, а пользователь тоже может назваться 'система' или 'system' поэтому по имени не вариант |
|
#2
|
||||
|
||||
|
Цитата:
|
|
#3
|
|||
|
|||
|
Цитата:
procedure ConvertSidToStringSid(SID: PSID; var StringSid: LPSTR); stdcall; external advapi32 name 'ConvertSidToStringSidA'; вместо сид мне как "S-1-5-18" указывать? |
|
#4
|
||||
|
||||
|
Цитата:
Используешь её так: Код:
if GetUserSIDStr('', UserName) = 'S-1-5-18' then ShowMessage('Это система'); |
| Эти 2 пользователя(ей) сказали Спасибо poli-smen за это полезное сообщение: | ||
M.A.D.M.A.N. (14.11.2012),
reqyz (14.11.2012)
| ||
|
#5
|
|||
|
|||
|
Цитата:
Код:
function isSystemProcess:boolean;
var
UserName :PChar;
UserNameLen:LongWord;
PSID, PRef: Pointer;
SIDSize, RefSize, peUse: Cardinal;
sSID:Pchar;
begin
result:=false;
UserNameLen := 255;
GetUserName(UserName,UserNameLen);
SIDSize:=0;
RefSize:=0;
LookupAccountName('',UserName,nil,SIDSize,nil,RefSize,peUse);
GetMem(PSID,SIDSize);
GetMem(PRef,RefSize);
try
if(LookupAccountName('',UserName,PSID,SIDSize,PRef,RefSize,peUse))then
ConvertSidToStringSid(PSID,sSID);
result:=sSID='S-1-5-18';
finally
FreeMem(PRef);
FreeMem(PSID);
end;
end; |
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
||||
|
||||
|
поэтому и не работает.
Код:
UserName :array [0..255] of Char; |
|
#8
|
|||
|
|||
|
у меня всё работает
|
|
#9
|
||||
|
||||
|
GetUserName
ConvertSidToStringSid все написано. так честнее будет: Код:
function ConvertSidToStringSid(Sid: PSID; var StringSid: LPTSTR): Boolean;
stdcall; external 'Advapi32.dll' name 'ConvertSidToStringSidA';
function StringSid: String;
var
UserName: array [0..$ff] of Char;
UserNameLen: Cardinal;
cbSid: DWORD;
cbReferencedDomainName: DWORD;
peUse: SID_NAME_USE;
Sid: PSID;
ReferencedDomainName: LPTSTR;
sSid: PChar;
begin
Result:='';
UserNameLen:=Length(UserName);
GetUserName(@UserName[0], UserNameLen);
cbSid:=0;
cbReferencedDomainName:=0;
LookupAccountName(nil,
@UserName[0],
nil, cbSid,
nil, cbReferencedDomainName,
peUse);
Sid:=GetMemory(cbSid);
ReferencedDomainName:=GetMemory(cbReferencedDomainName);
LookupAccountName(nil,
@UserName[0],
Sid, cbSid,
ReferencedDomainName, cbReferencedDomainName,
peUse);
ConvertSidToStringSid(Sid, sSid);
Result:=sSid;
LocalFree(Cardinal(sSid));
FreeMemory(Sid);
FreeMemory(ReferencedDomainName);
end; |