[VB.NET]Prüfen ob eine Anwendung startet

03/21/2013 15:11 Requi#1
Hey Leute,

bei uns im Jugendhaus sind kleine Kinder, die immer was spielen wollen. Meist ist es Minecraft. Eigentlich immer.

Nun wollte ich ein "kleines" Passwort-System schreiben, dass sie nicht mehr so einfach Minecraft etc. starten können.(Für jede Anwendung ein Passwort eingeben)

Für Minecraft alleine habe ich es schon geschafft. Ich will es nun so haben:

Pseudocode:
Code:
If Eine Anwendung Startet Then
Me.Show()
Else
Me.Hide[
End If
So ungefähr meine ich es. Google hat mir nur Ergebnisse für einzelne Prozesse gegeben, was mir leider nicht hilft.


MfG
ya Pony /)
03/21/2013 22:23 Mansuro#2
Meinst du es so ?
Code:
If Process.Start("C:\irgendwas.exe") then
......
03/22/2013 04:24 dready#3
Mhh

Könntest du genauer erklären was du da machen willst ?
Soll es ein Tool werden das jeden Start überwacht oder eines das das Programm startet wenn das Richtige Passwort eingegeben wurde ?

Das ganze ist nicht soo trivial wie es sich anhört ;)

Hier ein Beispiel wie du das System und alle gerade laufenden Process ohne einen Hook abfragen kannst

Code:
  List<string> programme = new List<string>();
            programme.Add("notepad");

            Process[] allproc = Process.GetProcesses();

            foreach (Process x in allproc)
            {
                if (programme.Contains(x.ProcessName))
                {
                    MessageBox.Show("wurde gestartet");
                }
            }
Müsstest dann noch eine Liste pflegen die die Entsprechden Processhandles aufnimmt so das nicht doppelt abgefragt wird, das ganze periodisch aufrufen.
In der Passwortfunktion das Passwordwindow immer in den Fordergrund holen etc.
Weiß leider nicht wie gut das ganze in Sachen Ressourceneffiziens wäre, ich tip mal auf nich so toll :P

@smokingdeath

Was genau soll dieser Code bewirken ? +g+
Also wenn ich das nun nicht total falsch verstehe würde dein Code

irgendwas.exe starten
wenn windows den process starten kann tue etwas
*kopfkratz*
03/22/2013 08:18 Requi#4
Er soll jedes mal, wenn ein Prozess gestartet wird der NICHT mit dem Start drin ist, die Form zum Passwort anzeigen.

Also jegliche Prozesse die existieren.

Hab mir schon überlegt, die aktuelle Prozessliste zu speichern, jede Sekunde überprüfen und wenn sich was ändert, die Form anzeigen soll.
03/22/2013 08:27 dready#5
Mhhh kannst etwas genauer erklären wie du dir das vorgestellt hattest ?

Edit: nach etwas nachdenken komm ich zu dem Schluss das was du da machen magst so ganz und garnicht trivial ist

Der Weg den du bisher gegangen bist wird auf diese Größe ausgedehnt ordentlich Cpu fressen. Das wäre zwar immernoch machbar aber weiß nicht ob das so das Geschickteste ist :/

Die einfachste Lösung wäre es wohl CreateProcess systemwide zu hooken, aber bin mir nicht sicher ob das für dich Lohnenswert ist, da es durchaus einiges an Arbeit erfordert und nicht gerade trivial ist mit C#
03/22/2013 09:19 Requi#6
Ich will das auch in Vb machen :p
03/22/2013 09:40 dready#7
Vb und C# sind beides .net Sprachen, solltest also alles in der einen wie der anderen umsetzen können :)
Ist mehr oder weniger nur ein anderer Syntax aber am ende kommt das selbe raus
03/22/2013 11:02 Requi#8
Es wird doch wohl iwie möglich sein
03/22/2013 11:10 dready#9
Sicher :) Wie gesagt dein Ansatz von oben würde ja funktionieren, aber er wird einfach eine menge Systemleistung fressen
03/22/2013 11:14 kissein#10
Ist bereits in Windows integriert, nennt sich Jugendschutzeinstellung
[Only registered and activated users can see links. Click Here To Register...]
03/22/2013 12:16 qkuh#11
Quote:
Originally Posted by dready View Post
Sicher :) Wie gesagt dein Ansatz von oben würde ja funktionieren, aber er wird einfach eine menge Systemleistung fressen
Nee :) Das frisst nicht allzu viel Leistung. Man muss ja nicht alle 5ms die Prozesse checken. 200ms reichen ja auch aus.
03/22/2013 13:21 Requi#12
Ich kann es ja auch alle 5000ms Ch ecken lassen.
So wird der PC nicht extrem überlastet.
03/22/2013 14:31 tolio#13
du kannst nur die liste aller prozesse durchsuchen aber du kannst nicht ohne weiteres ein event erstellen welches auslöst wenn ein prozess irgendwie irgendwo auf dem pc gestartet wird

wenn du immer die laufenden prozesse durchsuchst musst du entweder mit einer white oder einer blacklist arbeiten anders wird es nicht klappen
03/23/2013 10:48 Requi#14
Dann muss ich nochmal überdenken wie ich das auf die einfachste Weise machen kann.
03/23/2013 12:46 dready#15
Code:
Public Shared allreadychecked As New List(Of Process)()

Private Sub Form1_Load(sender As Object, e As EventArgs)
	Dim programme As New List(Of String)()

	programme.Add("notepad")

	Dim allproc As Process() = Process.GetProcesses()

	For Each x As Process In allproc
		If programme.Contains(x.ProcessName) Then
			startcheck(x)
		End If
	Next

End Sub

Private Sub startcheck(x As Process)
	If allreadychecked.Contains(x) Then
		Return
	End If

	' hier pw abfrage anzeigen und pwcheck darin aufrufen

End Sub

Private Sub pwcheck(pw As String, x As Process)
	If x.ProcessName = "notepad" Then
		If pw = "notepadpw" Then
			allreadychecked.Add(x)
		Else
			x.Kill()
		End If
	End If

End Sub
Ist durchn Converter gejagt, von der Performance her sich nicht optimal und ganz allgemein nicht getestet, aber ich hoff mal du kannst verstehen was der Gedanke bei dem ganzen war.