Hogyan megbízhatóan meghatározni, hogy a program fut, mint szolgáltatás

Hogyan megbízhatóan meghatározni, hogy a program fut, mint szolgáltatás?

Én valahol a példámat, de húzza a felhasználó nevét, amellyel a szolgáltatás fut, és összehasonlítja azt a nevet, amely alatt a folyamat fut. Véletlenül - mint mi szolgáltatást. De ugyanaz a felhasználó nem jelenti azt, hogy a folyamat - szolgáltatás. A szolgáltatás lehet futtatni egy másik nevében uchetki, így ez a módszer is megszűnik. Hogyan állapítható meg, mely folyamat fut a szolgáltatás vezetője, és nem valaki más?


> Hogyan állapítható meg, mely folyamat fut a szolgáltatás vezetője,
> # XA0 és nem valaki más

Gondolod, hogy ha bemegyek a menedzsment konzol és a szolgáltatás fut, akkor megy a nevemben?


> A szolgáltatás lehet futtatni más nevében uchetki így
> Ez a módszer kiküszöböli a
Nem nagyon találóan fogalmazott. Én magam kijavítani:

A folyamat lehet futtatni ugyanazt a nevet, ami fut a szolgáltatás, majd levezetését a neveket ad téves eredményt.


> Gondolod, hogy ha bemegyek a menedzsment konzol és
> Szolgáltatás fut, akkor megy a nevemben?

A szolgáltatás beállításait lehet rendelni bármelyik uchetku működtetéséhez használt szolgáltatás. Bár keretében a látogató futni. És ez nem lesz ugyanaz a dolog, akkor várható, hogy teljesen eltérő viselkedést a program, mint ha a vendég, ha ő elindul a program. Itt van a dolog.

Ha nem kap őket összekeverednek, majd amikor fut „mint szolgáltatás” program lesz különleges. paramétereket (vagy ki spec. call-back „rándulás? teljesen feledésbe merült).
Így a kérdés nem egyértelmű: a program, ha a szolgáltatás - fut teljesen egy bizonyos módon.

PS
a kéz nem, hol kell keresni gyors, de remélem, hogy nem hazudok


> Akkor mi van? Zapuskatsya ez mindenképpen szolgáltatás managery

Nem érti :) A felhasználó például a Windows Intézőben, és futtassa az EXE, hogy egy szolgáltatást. És ez nem valami, hogy legyen)

Mi ez az egész: a Write, amely a munka szigorúan a uchetki rendelt neki. De meg kell hibakeresés, hogy tudott futni, és a szolgáltatás, és egy szokásos programhoz, egy kis korrekció a belső logikája. Később, amikor az megközelíti a végén, akkor meg kell tiltani a dob másik kivéve szolgáltatás.

> Te vagy a szolgáltatás meghatározásához szükséges akinek uchetki fut, de nem határozza meg, ahol a szolgáltatás fut.
és akkor hogyan a lehetőséget, ha fut, mint egy programot? uchetki nem értem, mert indítható bárki, az egyetlen lehetőség az, hogy talál valakit, hogy megosszák (ból) a program indításakor.
azaz „Amennyiben a szolgáltatás fut” csak meghatározza, hogy egy szolgáltatás vagy program.

beszélünk megosztás, és rendre elágazás kódot, attól függően, hogy a program elindul, mint egy szolgáltatás vagy egy programot.
például kiderül scktsrvr.exe (van forrás) Delphi, ez a módszer meghatározásának, (ő mit nem mindig határozza meg a jobb oldalon).
> Volt valahol példámat
biztosan ott.

PAH palacsinta. Nos osztani a koncepció szolgáltatásokat és alkalmazásokat. meglehetősen zavaros. )

typedef struct _SYSTEM_PROCESS_INFORMATION # XA0; # XA0; ULONG NextEntryOffset;
# XA0; # XA0; ULONG NumberOfThreads;
# XA0; # XA0; BYTE Reserved1 [48];
# XA0; # XA0; PVOID Reserved2 [3];
# XA0; # XA0; TÖRÉKENY UniqueProcessId;
# XA0; # XA0; PVOID Reserved3;
# XA0; # XA0; ULONG HandleCount;
# XA0; # XA0; BYTE Reserved4 [4];
# XA0; # XA0; PVOID Reserved5 [11];
# XA0; # XA0; size_t PeakPagefileUsage;
# XA0; # XA0; size_t PrivatePageCount;
# XA0; # XA0; LARGE_INTEGER Reserved6 [6];
> SYSTEM_PROCESS_INFORMATION;

Akkor nincs semmi nehézség. Csak befejezni a hibakeresés.

A fogantyú kell a PROCESS_QUERY_INFORMATION és PROCESS_VM_READ hozzáférési jogok

Általában van egy kódot. érdekelt kritika

funkció GetProcessParentID: Cardinal;
var
# XA0; ProcEntry: TProcessEntry32;
# XA0; hSnapshot: THandle;
# XA0; CurrID: Cardinal;
# XA0; Success: Boolean;
kezdődik
# XA0; Eredmény: = 0;
# XA0; hSnapshot: = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
# XA0, ha (hSnapshot <> INVALID_HANDLE_VALUE), majd
# XA0; # XA0, próbálja
# XA0; # XA0; # XA0; ProcEntry.dwSize: = sizeof (ProcEntry);
# XA0; # XA0; # XA0; Success: = Process32First (hSnapshot, ProcEntry);
# XA0; # XA0; # XA0, ha siker, akkor
# XA0; # XA0; # XA0; kezdődik
# XA0; # XA0; # XA0; # XA0; CurrID: = GetCurrentProcessId;
# XA0; # XA0; # XA0; # XA0; SetLastError (ERROR_SUCCESS);
# XA0; # XA0; # XA0; # XA0, míg siker csinálni
# XA0; # XA0; # XA0; # XA0; # XA0; ha (ProcEntry.th32ProcessID = CurrID), majd
# XA0; # XA0; # XA0; # XA0; # XA0; kezdődik
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; Eredmény: = ProcEntry.th32ParentProcessID;
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; break;
# XA0; # XA0; # XA0; # XA0; # XA0; end
# XA0; # XA0; # XA0; # XA0; # XA0; máshol
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; Success: = Process32Next (hSnapshot, ProcEntry);
# XA0; # XA0; # XA0; end;
# XA0; # XA0; # XA0; Win32Check (GetLastError);
# XA0; # XA0, végül
# XA0; # XA0; # XA0; CloseHandle (hSnapshot);
# XA0; # XA0; end
# XA0; máshol
# XA0; # XA0; Win32Check (GetLastError);
végén;

funkció GetProcessParentName: string;
var
# XA0; ProcEntry: TProcessEntry32;
# XA0; hSnapshot: THandle;
# XA0; Success: Boolean;
# XA0; ParentPID: Cardinal;
kezdődik
# XA0; Eredmény: = "";
# XA0; hSnapshot: = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
# XA0, ha (hSnapshot <> INVALID_HANDLE_VALUE), majd
# XA0; # XA0, próbálja
# XA0; # XA0; # XA0; ProcEntry.dwSize: = sizeof (ProcEntry);
# XA0; # XA0; # XA0; Success: = Process32First (hSnapshot, ProcEntry);
# XA0; # XA0; # XA0, ha siker, akkor
# XA0; # XA0; # XA0; kezdődik
# XA0; # XA0; # XA0; # XA0; ParentPID: = GetProcessParentID;
# XA0; # XA0; # XA0; # XA0; SetLastError (ERROR_SUCCESS);
# XA0; # XA0; # XA0; # XA0, míg siker csinálni
# XA0; # XA0; # XA0; # XA0; # XA0; ha (ProcEntry.th32ProcessID = ParentPID), majd
# XA0; # XA0; # XA0; # XA0; # XA0; kezdődik
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; Eredmény: = ProcEntry.szExeFile;
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; break;
# XA0; # XA0; # XA0; # XA0; # XA0; end
# XA0; # XA0; # XA0; # XA0; # XA0; máshol
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; Success: = Process32Next (hSnapshot, ProcEntry);
# XA0; # XA0; # XA0; end;
# XA0; # XA0; # XA0; Win32Check (GetLastError);
# XA0; # XA0, végül
# XA0; # XA0; # XA0; CloseHandle (hSnapshot);
# XA0; # XA0; end
# XA0; máshol
# XA0; # XA0; Win32Check (GetLastError);
végén;

# XA0; # XA0; # XA0; CloseServiceHandle (SVC);
# XA0; # XA0; end;
# XA0; # XA0; CloseServiceHandle (Mgr);
# XA0; end;
végén;

eljárás Win32Check (ErrorCode: Cardinal);
kezdődik
# XA0, ha (ErrorCode <> ERROR_SUCCESS), majd
# XA0; # XA0; emelni Win32Exception.Create (SysErrorMessage (ErrorCode));
végén;

Meg lehet próbálni, hogy küldje meg a vonalat a Start gombot.
Ez, ha nem tanulnak együtt dolgozni a szolgáltatások és szolgáltatási igazgató

> Általában van egy kódot. érdekelt kritika
Fizetni a sorban? akkor minden rendben van, csak finom. de általában ott Rouse_ hez tömörebb, intuitív lehetőség, hogy a költségek semmit sem változtat.
De ebben az esetben

funkció ParentProcName: string;
const
# XA0; ProcessBasicInformation = 0;
var
# XA0; Info: PROCESS_BASIC_INFORMATION;
# XA0; dwProcessHandle: dword;
# XA0; folyamatnév: string;
# XA0; Hndl: THandle;
kezdődik
# XA0; Eredmény: = "noname";
# XA0; dwProcessHandle: = GetCurrentProcess;
# XA0; ha NtQueryInformationProcess (dwProcessHandle, ProcessBasicInformation, @Info, sizeof (Info), nulla) = NO_ERROR
# XA0; # XA0, majd kezdődik
# XA0; # XA0; # XA0; Hndl: = OpenProcess (PROCESS_QUERY_INFORMATION vagy PROCESS_VM_READ, False, Info.uInheritedFromUniqueProcessId);
# XA0; # XA0; # XA0, ha Hndl <> 0, akkor
# XA0; # XA0; # XA0; # XA0, próbálja
# XA0; # XA0; # XA0; # XA0; # XA0; SetLength (folyamatnév, MAX_PATH);
# XA0; # XA0; # XA0; # XA0; # XA0; ha GetModuleBaseNameA (Hndl, 0, PChar (folyamatnév), MAX_PATH)> 0
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0, majd Eredmény: = PChar (folyamatnév);
# XA0; # XA0; # XA0; # XA0, végül
# XA0; # XA0; # XA0; # XA0; # XA0; CloseHandle (Hndl);
# XA0; # XA0; # XA0; # XA0; end;
# XA0; # XA0; end;
végén;

ez helyettesíti a kétharmada a kódot.

> Miért roditelstkie feldolgozza Suka - nem világos számomra.
Ha nem csak a hibakeresés, ha a program meg van írva, mint a fenti példában az általam korábban Borland programot.


> Futtatás - az regisztrálja visszahívási minden. és
> Nem lehet semmi más, mint egy szolgáltatást, definíció szerint,

Talán :) szolgáltatás - ez ugyanaz a folyamat, és nem különbözik a hagyományos eljárással, kivéve, hogy kezdődött, és a rendszer által vezérelt vezetője.


> Ez helyettesíti a kétharmadát a kódot

Tehát igaz, de amellett, hogy a piros figyelmeztetéseket NtQueryInformationProcess, van egy másik pont, ami azt is megemlítette:

A fogantyú kell a PROCESS_QUERY_INFORMATION és PROCESS_VM_READ hozzáférési jogok

Ez és GetModuleFileNameEx # XA0 kifejezés is GetModuleBaseName. Nézd meg az MSDN, ha nem hiszel. És a szolgáltatás, emlékezzen, nem szükséges, hogy ezeket a jogokat, mert lehet futtatni bármely felhasználó.

> A fogantyú kell a PROCESS_QUERY_INFORMATION és PROCESS_VM_READ hozzáférési jogok
ezért vannak itt, és kérte,
Hndl: = OpenProcess (PROCESS_QUERY_INFORMATION vagy PROCESS_VM_READ False, Info.uInheritedFromUniqueProcessId.)
mert a fogantyút kellett volna őket.

és NtQueryInformationProcess. ott kérik Infa saját folyamatát, ez nevetséges, ha a jog nem is olvassa. ez nem lehet.

minden jog információt olvasni, az IMHO, van még egy vendég. ellenőrizze kiindulva a szolgáltatást a felhasználók által a vendég jogosultságokkal. verziókban ezt a kódot nélkül / vele.
de az úton snepshot folyamat jogokat az olvasás információt nem kell? ő is olvasta.

> Mert lehet futtatni bármely felhasználó.
még akkor a logikai nem. szolgáltatás magának a szolgálat legyen valami, ami jogokat. és vannak, IMHO, több mint szükséges elolvasni a modul neve.


> Ez miért vannak itt, és kérik
És ez azért van, mert a korlátozott jogokat juzverej OpenProcess visszatér Hozzáférés megtagadva, amikor megpróbálja megnyitni a szülő folyamat.


> A kért Infa saját folyamatát
Miért saját? Kell egy szülő. PID kapok a szülő, de a szülő fájl neve - csak a ToolHelp, aki dolgozik ki egy korlátozott uchetki.


> Ellenőrizze kiindulva a szolgáltatást a felhasználók által a vendég jogosultságokkal
Megvan az elejétől, és kész :) Azonban nem egy vendég, de különleges uchetki, amely egy csoportja számára. Jobb, hogy Nt / ZwHHH funkciók nem teszteltük, de a GetModuleFileNameEx és GetModuleBaseName megbotlott azonnal. Miután egy pillanatfelvétel minden kiderült kérdés nélkül.

By the way, én itt dolgozom is a jogokat. Kiderült, hogy a bejelentett nepravilno.BuildExplicitAccessWithName és GetSecurityInfo tévesen jelentette be a Borland számos funkciót. És mellette BuildExplicitAccessWithName még láttam a funkciók, amelyek a postfix W PAnsiChar paramétereket.


> Azt találtuk, hogy a Borland bejelentette több megfelelő működését.
> BuildExplicitAccessWithName és GetSecurityInfo helytelenül
> Bejelentette. És mellette BuildExplicitAccessWithName mindig látható
> Funkció, amely a postfix W PAnsiChar paraméterek.
>

És a nap vannak foltok.

Nem kevés, de sok, és korrigáljuk, vagy lassan, vagy soha.