alle Prozesse mit dem Namen "xxx" von User "yyy" beenden

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von SeriTools.

    alle Prozesse mit dem Namen "xxx" von User "yyy" beenden

    Hallo Leute,

    ich möchte alle Prozesse mit dem gleichen Namen - sagen wir "WINWORD" beenden, aber nur bei einem User.

    Wenn ich es so mache:

    VB.NET-Quellcode

    1. For Each Process In System.Diagnostics.Process.GetProcessesByName("WINWORD")
    2. Process.Kill()
    3. Next


    ...gehen natürlich alle laufenden Wordanwendungen aller angemeldeten User zu :D.

    Wie macht man es nur für einen User - z.B. "Bruno"?

    Dankeschön,
    Bruno

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „BAP“ ()

    Danke singu,

    habe es so versucht, aber es passiert leider nichts - die Prozesse laufen munter weiter:

    VB.NET-Quellcode

    1. For Each Process In System.Diagnostics.Process.GetProcessesByName("WINWORD")
    2. If Process.StartInfo.UserName.Contains("Bruno") Then
    3. Process.Kill()
    4. End If
    5. Next


    Viele Grüße,
    Bruno
    Das war fast richtig

    VB.NET-Quellcode

    1. For Each Prozess As Process In Process.GetProcesses()
    2. If Prozess.MainWindowTitle <> "" Then
    3. ListBox1.Items.Add("Programm: " & Prozess.MainWindowTitle)
    4. Else : End If
    5. Next Prozess


    hier nur noch deine abfrage zwichen bauen und dann bist du schon am ziel

    jvbsl schrieb:

    kommst du überhaupt in die Schleife rein?
    Jo - die For Each Schleife läuft und es werden auch alle WINWORD Prozesse durchlaufen.
    Nur mit der Bedingung scheint etwas nicht zu stimmen.

    Ein

    VB.NET-Quellcode

    1. Console.WriteLine(Process.StartInfo.UserName)

    in der Schleife bringt keine Ergebnisse.

    Viele Grüße,
    Bruno
    @ChaosBernd: ich finde seins passt für sein Vorhaben besser, als deins, da er erstens nur das eines bestimmten Users beenden möchte und Zweitens nicht nach Fenstern und deren Titel, sondern viel mehr nach Prozessnamen..."WINWORD" = Microsoft Word...das ist schon richtig, doch ich bin mir nie wirklich sicher, ob man nicht noch die Executable Dateiendung mit angeben muss, deshalb hab ich gefragt, ob er überhaupt in die Schleife kommt...

    Edit:in diesem Fall wird es wohl daran liegen, dass wenn du es nicht als bestimmten Benutzer ausführst, sondern direkt startest wahrscheinlich nichts übergeben wird und mit diesem wird denke ich der Aktuelle Benutzer bezeichnet...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    StartInfo.UserName bringt nur was um den Process als dieser Nutzer zu starten. Abfragen bei bereits gestarteten Processen gibt einen leeren String.

    mW kann man den User mit .Net Bordmitteln NICHT bestimmen. Dazu brauchts entweder die Windows-API oder WMI

    jvbsl schrieb:

    Edit:in diesem Fall wird es wohl daran liegen, dass wenn du es nicht als bestimmten Benutzer ausführst, sondern direkt startest wahrscheinlich nichts übergeben wird und mit diesem wird denke ich der Aktuelle Benutzer bezeichnet...
    Ja das kann sein.

    Wenn ich den Windows Task-Manager aufmache und das Häkchen "Prozesse aller Benutzer anzeigen" anklicke, sehe ich allerdings zu jedem laufenden WINWORD Prozess den passenden Benutzernamen.

    Was könnte es also in VB.NET für eine Möglichkeit geben, diesen Benutzernamen zu jedem Prozess auszuwerten?
    Mit Process.StartInfo.UserName geht es jedenfalls nicht in der Schleife :(.

    Viele Grüße,
    Bruno
    So - nun gehts :).
    Vielleicht brauchts ja noch Jemand..

    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Imports System.Management
    4. Module Module1
    5. Sub Main()
    6. '// get current user on wts session
    7. Dim sCurrentUser As String = System.Environment.UserName
    8. '// loop in processes
    9. For Each Process In System.Diagnostics.Process.GetProcessesByName("WINWORD")
    10. '// list users
    11. Console.WriteLine(GetProcessUserName(Process))
    12. '// kill processes
    13. If GetProcessUserName(Process) = sCurrentUser Then
    14. Process.Kill()
    15. End If
    16. Next
    17. End Sub
    18. '// get username from process
    19. Public Function GetProcessUserName(ByVal Process As Process) As String
    20. Dim sq As New ObjectQuery("Select * from Win32_Process Where ProcessID = '" & Process.Id & "'")
    21. Dim searcher As New ManagementObjectSearcher(sq)
    22. If searcher.Get.Count = 0 Then Return Nothing
    23. For Each oReturn As ManagementObject In searcher.Get
    24. Dim o As String() = New String(1) {}
    25. oReturn.InvokeMethod("GetOwner", DirectCast(o, Object()))
    26. Return o(0)
    27. Next
    28. End Function
    29. End Module


    Was aber absolut nervt ist die Ausführungsgeschwindigkeit.
    Wenn 50 bis 100 User angemeldet sind, braucht das Teil schon seine Zeit um die Prozesse durch zugehen.

    Gibt es da nichts schnelleres?

    Viele Grüße und danke an alle Helfer,
    Bruno

    picoflop schrieb:

    Siehe link zu Codeproject oben ...
    Da ist ein Beispiel mit WMI und eins mit API. API ist schneller als WMI
    Ja - hatte ich bewundert.
    Leider konnte ich beide Varianten nicht erfolgreich von C# in VB umwandeln.
    Nach der Wandlung war noch jede Menge Handarbeit gefragt, die meine Kenntnisse übersteigen - leider.

    Sicher würde ich die API Version gern testen, aber da brauche ich bitte Hilfe beim Portieren nach VB.

    Viele Grüße,
    Bruno

    SeriTools schrieb:

    Wie wäre es, wenn du deinen bisherigen Code hier postest und sagst, wo der Schuh denn drückt? Wir können ja nicht hellsehen.

    lg SeriTools
    Eine funktionierende Version hab ich doch in Posting #11 eingestellt (WMI Version).
    Und festgestellt, das es unerträglich langsam geht.
    Und auch festgestellt, das es per API besser gehen würde, finde aber keinen VB Code dafür.

    LG,
    Bruno
    Es gibt den C# to VB Converter .
    Wenn du den Code damit konvertierst und er dennoch nicht Funktioniert, kannst du erst scharf nachdenken und versuchen, die Fehler zu beheben, dann evtl. die Fehler googlen und wenn das alles nicht hilft, genau dann kannst du hier fragen.

    lg SeriTools
    | Keine Fragen per PN oder Skype.