Gå til innhold

[Løst]Windows service som overvåker hvilke prosesser brukere starter


Anbefalte innlegg

Jeg skal lage en et lite verktøy som jeg håper får en interrupt hver gang en bruker starter en process, jeg er ikke sikker på om .Net har noe rammeverk for dette og det er dette jeg lurer på. Jeg håper å kunne unngå og måtte hooke noe 'low-level' rutiner for å få frem at en bruker har startet en process. Er det noen som har noe erfaring med lignende utfordringer?

 

PS: Still gjerne spørsmål om det jeg lurer på er uklart ;)

Endret av aC
Lenke til kommentar
Videoannonse
Annonse

@GeirGrusom: Slik det er i dag er at det polles hvert x sekunder etter alle prosesser som kjører, jeg ønsker imidlertid noe litt mer elegant som f.eks en service som får en notify for hver prosess som blir startet, men er ikke sikker på om dette eksisterer

 

@NikkaYoichi: Å kjøpe configuration manager lisens bare for denne utfordringen kommer nok til å bli uaktuelt.

Lenke til kommentar

Selvsagt kan man jo bruke CM til andre oppgaver enn dette, men siden jeg ikke visste om du allere var klar over at dette allerede eksisterer som en del av CM, så ville jeg bare gjøre deg oppmerksom på det. Vi bruker det jo mest til utrulling av programvareinstallasjoner og slikt, men så vidt jeg vet så kan man gjøre spørringer på prosesser og installert programvare på klientene også, uten at jeg har testet hvordan dette fungerer. :)

Lenke til kommentar

Lagde noe lignende for ikke så lenge, forskjellen min var att jeg hadde ett program som søkte gjennom alle kjørende prosesser etter WoW processen.

Hvis WoW kjørte/ble startet mens programmet ble startet ble WoW terminert.

Dette for å plage de stakkars WoW spillerne jeg omgåes med i troppen (A).

 

Ved førstegangs start av programmet ditt, ser du igjennom alle prosesser som kjører på maskinen på det tidspunktet. Lagrer dette i en Array av prosesser som er blitt notert.

Dim Notified As System.Diagnostics.Process()

Kjører en løkke på dette.

While Statement
'kjør igjennom alle processer igjen, og sjekk om Notified liste, er prosessen fjernet vil du fjerne den fra notified listen, og kanskje gi melding om dette, finner du en ny prosess, legg den til i listen og gi melding om det.
Loop

Håper dette gav deg litt tips og kanskje litt hjelp. Det er ikke pent, men det fungerer. Og hvis du har denne kjørende med passe pauser, og att du ikke rusher og laster for mye på en gang att dette kan påvirke andre programmer som kjører så blir det jo bra.=)

Hint til å avlaste litt: System.Threading.Thread.CurrentThread.Join(ms)

Lenke til kommentar

@brgr: Takk for svar, men det er i essensen slik det fungerer i dag, jeg itterer gjennom allrede startede prosesser. Har prøvd (kanskje ikke bra nok) å forklare at jeg ønsker en interrupt bassert løsning, men har enda ikke klart å finne noe i .Net som gjør hva jeg ønsker. Det virker som hverken EPROCESS og CSRSS gjør noe i form av et override call for .Net. Noe som gjør dette veldig vanskelig (eller unødvendig vanskelig) og jeg tror jeg legger denne ballen død (intill noen smarte og beleste mennesker kanskje motbeviser min teori)

 

Mvh

Lenke til kommentar

Det virker til at Windows Management Instrumentation kan brukes.

http://msdn.microsoft.com/en-us/library/aa392396(VS.85).aspx

edit:Virker til at System.Management.ManagementEventWatcher klassen inneholder et eksempel for akkurat dette.

 

edit: litt kode

public class Form1 : Form
{
System.Management.ManagementEventWatcher watcher;
ListBox box;
public Form1()
{
	watcher = new System.Management.ManagementEventWatcher("SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance isa \"Win32_Process\"");

	watcher.EventArrived += new System.Management.EventArrivedEventHandler(watcher_EventArrived);
	watcher.Start();
	box = new ListBox();
	box.IntegralHeight = false;
	box.Dock = DockStyle.Fill;
	Controls.Add(box);
}
protected override void OnClosing(CancelEventArgs e)
{
	watcher.Stop();
	base.OnClosing(e);

}

void watcher_EventArrived(object sender, System.Management.EventArrivedEventArgs e)
{
	var obj = e.NewEvent.GetPropertyValue("TargetInstance") as System.Management.ManagementBaseObject;
	var p = obj.Properties["Caption"];


	Invoke(new Action(delegate { box.Items.Add("new process: " + p.Value); }));
}

}

Endret av GeirGrusom
Lenke til kommentar

Ser man det :) GeirGrusom kommer og redder dagen (min nu i alle fall) Jeg regnet faktisk med at du kom opp med en fin løsning, også ga du meg code samtidig (så slipper jeg å tenke selv). Det fungerte som en drøm, (jeg kommer desverre til å fjerne gui delen da jeg putter WMI spørringen i en service )

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...