Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Prozesse auf LAN-PC auflisten & beenden (https://www.delphipraxis.net/57592-prozesse-auf-lan-pc-auflisten-beenden.html)

ManuMF 23. Nov 2005 19:18


Prozesse auf LAN-PC auflisten & beenden
 
Hallo,

Soweit ich weiß gibt es für das Auflisten und Beenden von Prozessen auf einem PC im LAN in Delphi eine Möglichkeit. Wie lässt sich das realisieren?

Danke,
ManuMF

Bernhard Geyer 23. Nov 2005 19:22

Re: Prozesse auf LAN-PC auflisten & beenden
 
Ist kein "Delphi-Feature": PView2

ManuMF 10. Dez 2005 17:27

Re: Prozesse auf LAN-PC auflisten & beenden
 
Hallo,

Das Programm wäre ja in Ordnung -
Aber ich möchte so ein Feature in mein Progamm einbauen. ;-)

Und mit dem mitgelieferten nonVCL-Quellcode komme ich nicht wirklich zurecht. Aber er nutzt offensichtlich eine "NTLANMAN.DLL".
Kennt jemand einen Code, mit dem man diese ansteuern kann?

Danke,
ManuMF

Luckie 10. Dez 2005 17:38

Re: Prozesse auf LAN-PC auflisten & beenden
 
Zitat:

Zitat von ManuMF
Aber er nutzt offensichtlich eine "NTLANMAN.DLL".
Kennt jemand einen Code, mit dem man diese ansteuern kann?

Da wirst du dich wohl etwas mit dem Code auseinandersetzen müssen.

ManuMF 10. Dez 2005 17:53

Re: Prozesse auf LAN-PC auflisten & beenden
 
Zitat:

Zitat von Luckie
Da wirst du dich wohl etwas mit dem Code auseinandersetzen müssen.

Wenn ich keine Lust dazu hätte, würde ich das sagen. :? Ich habe aber bereits versucht, den Code zu verstehen. Aber wie gesagt, er ist mir zu kompliziert.
Ich dachte einfach, jemand würde vielleicht eine einfachere Möglichkeit kennen oder Hinweise geben, was relevant für mich ist.

Gruß,
ManuMF

Luckie 10. Dez 2005 17:59

Re: Prozesse auf LAN-PC auflisten & beenden
 
Ansonsten, guck dir mal die WMI Methoden an.

BTW steht akkes in den Units Ntprocs, perftypes und commontypes drinne. Wie die Funktion function getprocessesNT: TProcessrecs; aufgerufen wird, musst du nir noch in der dpr Datei nachgucken. So schwer kann das nicht sein.

Phoenix 12. Dez 2005 14:38

Re: Prozesse auf LAN-PC auflisten & beenden
 
Ich würde da zu WMI greifen.
Auf den anderen Computer verbinden, Prozesse auflisten und diese beenden oder die Priorität ändern lässt sich damit recht einfach realisieren. Wichtig ist nur dass die WMI-Verbindung mit einem User gemacht wird der auf dem Ziel-Rechner auch die entsprechenden Rechte besitzt, sonst klappt das nicht.

Luckie 12. Dez 2005 17:37

Re: Prozesse auf LAN-PC auflisten & beenden
 
Und hier der Code:
Delphi-Quellcode:
uses
  WbemScripting_TLB, ActiveX;

type
  TProcesInformation = packed record
    Name: string;
    Path: string;
    ProcID: DWORD;
    ParentProcID: DWORD;
    SessionID: DWORD;
    ThreadCount: DWORD;
    Priority: DWORD;
  end;

type
  TPIArray = array of TProcesInformation;

const
  WMI_HOST_COMPUTER = '.';
  WMI_SYSTEM_NAMESPACE = 'root\CIMV2';
  WMI_CLASS_NIC = 'Win32_Process';
  WMI_ATTRIB_CAPTION = 'Name';
  WMI_ATTRIB_PATH = 'ExecutablePath';
  WMI_ATTRIB_PROCID = 'ProcessID';
  WMI_ATTRIB_PARENT_PROCID = 'ParentProcessId';
  WMI_ATTRIB_SESSIONID = 'SessionID';
  WMI_ATTRIB_THREAD_CNT = 'ThreadCount';
  WMI_ATTRIB_PRIORITY = 'Priority';

function WMIEnumProcesses(Computer, User, Password: string): TPIArray;

  function GetCompName: string;
  var
    Buf       : array[0..MAX_COMPUTERNAME_LENGTH] of Char;
    Size      : DWORD;
  begin
    Size := SizeOf(Buf);
    if GetComputerName(Buf, Size) then
      Result := Buf
    else
      Result := '';
  end;

var
  FComputer: String;
  FUser: String;
  FPassword: String;
  Locator     : ISWbemLocator;
  Services    : ISWbemServices;
  ObjectDefinition: ISWbemObject;
  ObjectSet   : SWbemObjectSet;
  ObjectInstances: IEnumVariant;
  WMIObject   : ISWbemObject;
  PropertySet : ISWbemPropertySet;
  WMIProperty : ISWbemProperty;

  TempObj     : OleVariant;
  ObjValue    : Cardinal;
  i           : Integer;
resourcestring
  rsWMIError  = 'WMI-Fehler';
begin
  if AnsiUpperCase(GetCompName) = AnsiUpperCase(Computer) then
  begin
    FComputer := '';
    FUser := '';
    FPassword := '';
  end
  else
  begin
    FComputer := Computer;
    FUser := user;
    FPassword := Password;
  end;
  i := 0;
  Locator := CoSWbemLocator.CreateRemote(Computer);
  try
    try
      Services := Locator.ConnectServer(FComputer, WMI_SYSTEM_NAMESPACE,
        FUser, FPassword, '', '', 0, nil);
      if Services <> nil then
      begin
        Services.Security_.Set_ImpersonationLevel(wbemImpersonationLevelImpersonate);
        Services.Security_.Privileges.Add(wbemPrivilegeDebug, True);
        ObjectDefinition := Services.Get(WMI_CLASS_NIC,
          wbemFlagUseAmendedQualifiers, nil);
        ObjectSet := ObjectDefinition.Instances_(0, nil);
        ObjectInstances := (ObjectSet._NewEnum) as IEnumVariant;
        while (ObjectInstances.Next(1, TempObj, ObjValue) = S_OK) do
        begin
          WMIObject := IUnknown(TempObj) as SWBemObject;
          PropertySet := WMIObject.Properties_;

          setlength(result, length(result) + 1);
          WMIProperty := PropertySet.Item(WMI_ATTRIB_CAPTION, 0);
          if not VarIsNull(WMIProperty.Get_Value) then
            result[i].Name := WMIProperty.Get_Value;
          WMIProperty := PropertySet.Item(WMI_ATTRIB_PATH, 0);
          if not VarIsNull(WMIProperty.Get_Value) then
            result[i].Path := WMIProperty.Get_Value;
          WMIProperty := PropertySet.Item(WMI_ATTRIB_PROCID, 0);
          if not VarIsNull(WMIProperty.Get_Value) then
            result[i].ProcID := WMIProperty.Get_Value;
          WMIProperty := PropertySet.Item(WMI_ATTRIB_PARENT_PROCID, 0);
          if not VarIsNull(WMIProperty.Get_Value) then
            result[i].ParentProcID := WMIProperty.Get_Value;
          WMIProperty := PropertySet.Item(WMI_ATTRIB_SESSIONID, 0);
          if not VarIsNull(WMIProperty.Get_Value) then
            result[i].SessionID := WMIProperty.Get_Value;
          WMIProperty := PropertySet.Item(WMI_ATTRIB_THREAD_CNT, 0);
          if not VarIsNull(WMIProperty.Get_Value) then
            result[i].ThreadCount := WMIProperty.Get_Value;
          WMIProperty := PropertySet.Item(WMI_ATTRIB_PRIORITY, 0);
          if not VarIsNull(WMIProperty.Get_Value) then
            result[i].Priority := WMIProperty.Get_Value;
          Inc(i);
        end;
      end;
    finally
      Locator := nil;
      Services := nil;
    end;
  except
    on e: Exception do
      raise e.Create(e.message);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  PIArray     : TPIArray;
  i           : Integer;
  NewItem     : TListItem;
resourcestring
  rsPorcsCnt  = 'Prozesse: %d';
begin
  PIArray := nil;
  Listview1.Items.Clear;
  try
    PIArray := WMIEnumProcesses(edtComputer.Text, edtUser.Text, edtPW.Text);
    Listview1.Items.BeginUpdate;
    for i := 0 to length(PIArray) - 1 do
    begin
      NewItem := Listview1.Items.Add;
      NewItem.Caption := PIArray[i].Name;
      NewItem.SubItems.Add(PIArray[i].Path);
      NewItem.SubItems.Add(IntToStr(PIArray[i].ProcID));
      NewItem.SubItems.Add(IntToStr(PIArray[i].ParentProcID));
      NewItem.SubItems.Add(IntToStr(PIArray[i].SessionID));
      NewItem.SubItems.Add(IntToStr(PIArray[i].ThreadCount));
      NewItem.SubItems.Add(IntToStr(PIArray[i].Priority));
    end;
    Listview1.Items.EndUpdate;
    Statusbar1.SimpleText := Format(rsPorcsCnt, [length(PIArray)]);
  except
    on e: Exception do
    begin
      NewItem := Listview1.Items.Add;
      NewItem.Caption := e.Message;
    end;
  end;
end;

ManuMF 14. Dez 2005 15:03

Re: Prozesse auf LAN-PC auflisten & beenden
 
Cool, danke! :thumb:

Wenn ich wieder mehr Zeit habe (wir schreiben gerade fast täglich Klausuren :wall: ), werde ich mich reinarbeiten.

Gruß,
ManuMF

Angel4585 14. Dez 2005 15:08

Re: Prozesse auf LAN-PC auflisten & beenden
 
Ach ja...Schule..tägliche Klausuren vor und nach Weihnachten... das waren noch Zeiten :-D Grüße ans "BKIK"(Berufskolleg für Informations-und Kommunikationstechnik) von hier aus.

MfG :angel:


PS: Lucky ist echt ein Freak..hat er sowas im Kopf oder einfach nur grad danach gesucht und mit Copy&Paste hierherbefördert?

EDIT: jetzt hab ich glatt vergessen was sinnvolles zu schreiben... aufm BKIK gabs in Linux so ne Funktion um PC'S( und auch einzelne Prozesse) abzuschiessen.(Hilft dir nicht viel aber hab immerhin was dazu gesagt)

Luckie 14. Dez 2005 16:21

Re: Prozesse auf LAN-PC auflisten & beenden
 
API Zeugs habe ich meist im Kopf. WMI nicht so. Aber meist habe ich es als Code-Schnippsel schon mal irgendwo geschrieben und muss es nicht jedes mal neu schreiben. Programmierer sind eben faul. ;)

HellCode 17. Feb 2006 18:24

Re: Prozesse auf LAN-PC auflisten & beenden
 
Der Code funktioniert gut... Bis auf das das "Prozess beenden" nicht implementiert ist. Absicht?

Die Muhkuh 17. Feb 2006 18:36

Re: Prozesse auf LAN-PC auflisten & beenden
 
Zitat:

Zitat von HellCode
Der Code funktioniert gut... Bis auf das das "Prozess beenden" nicht implementiert ist. Absicht?

Weil man vllt. noch selbst nachdenken soll und nicht alles vorgekaut bekommt? :roll:

HellCode 17. Feb 2006 18:48

Re: Prozesse auf LAN-PC auflisten & beenden
 
Verstehe!

:wiejetzt:

Gib mal nTip! :-D

fLaSh11 18. Feb 2006 09:30

Re: Prozesse auf LAN-PC auflisten & beenden
 
Als VBS wäre auch dieser Quellcode denkbar:
Code:
remote = InputBox("Name des Remote-PCs:","Remote-Prozesse")
If remote = "" Then WScript.Quit

wmitxt = "winmgmts:{impersonationLevel=impersonate}"
Set wmi = GetObject(wmitxt & "!\\" & remote)
Set prozess1 = wmi.ExecQuery("SELECT * FROM " &_
 "Win32_Process")
Set prozess2 = wmi.ExecQuery("SELECT * FROM " &_
 "Win32_PerfFormattedData_PerfProc_Process")

Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
While ie.Busy
Wend
Set dok = ie.Document
dok.Open

dok.Writeln "<Title>Prozesse auf " & remote & "</Title><u>" &_
 "[B]Prozesse auf " & remote & "[/b]</u>

" &_
 "<table border='1' cellpadding='0' cellspacing='0' " &_
 "width='99%'><tr><td></td><td>[B]Name</td><td>[B]PID</td>" &_
 "<td>[B]CPU</td><td>[B]Speicher</td></tr>"

zaehler = 1
For Each proz1 In prozess1
  dok.Writeln "<tr><td>" & zaehler & "</td><td>" &_
   proz1.Name & "</td><td>" & proz1.ProcessID & "</td><td>" &_
   cpulast(proz1.ProcessID) & "</td><td align='right'>" &_
   Fix(proz1.WorkingSetSize/1000) & " K</td></tr>"
  zaehler = zaehler + 1
Next

dok.Close
ie.Visible = True
Set shell = WScript.CreateObject("WScript.Shell")
shell.AppActivate("Prozesse auf " & remote)
shell.SendKeys "% x"


Function cpulast(strprozid)
  cpulast = "???"
  For Each proz2 In prozess2
    If proz2.IDProcess = strprozid Then
      cpulast = proz2.PercentProcessorTime
    End If
  Next
End Function
Funktioniert einwandfrei. Kein Virus o.ä.

Als erste Zeile wäre auch dies denkbar:
Code:
remote = InputBox("Name des Remote-PCs:","Remote-Prozesse","Name des meist genutzten PCs")

HellCode 18. Feb 2006 10:35

Re: Prozesse auf LAN-PC auflisten & beenden
 
Jetzt hättest du doch wenigstens in der VBS-Variante das Prozess-killen mitreinbringen könnte. Also meine Basic-Kenntnisse gehen genausoweit das ich sagen kann das es nicht untergebracht ist. Aber wäre das nicht pädagogisch sinnvoll gewesen? :-D

fLaSh11 18. Feb 2006 11:41

Re: Prozesse auf LAN-PC auflisten & beenden
 
Ja, das hab ich auch versucht. Mir ist es zwar gelungen, :coder:
aber der angegebene Prozess wurde nie so richtig beendet... :gruebel:

bei Bedarf kann ich den Code aber trotzdem posten...

HellCode 18. Feb 2006 18:29

Re: Prozesse auf LAN-PC auflisten & beenden
 
mach mal.. vielleicht hilfts mir ja irgendwie

ManuMF 24. Mär 2006 09:16

Re: Prozesse auf LAN-PC auflisten & beenden
 
Hallo,

:oops: lange nicht mehr ins Thema geschaut...

Ich habe mich jetzt mal ein bisschen in den Code eingearbeitet, und komme auch einigermaßen ;-) damit klar. Aber was genau muss ich tun, um zu Beenden?
Das dürfte so wie im Code ablaufen (erst Anmeldung etc.), aber statt der While-Schleife, die die Prozesse listet, bräuchte ich einen Befehl, der einen Prozess dann beendet.

Danke,
ManuMF

ManuMF 26. Mär 2006 14:27

Re: Prozesse auf LAN-PC auflisten & beenden
 
Hallo,

niemand eine Idee?

Habe inzwischen noch mal in PView geschaut, aber nur die Methode zum lokalen Beenden gefunden. In der WMI-Unit habe ich auch keine Möglichkeit zum Beenden gefunden. :gruebel:

Gruß,
ManuMF

Olli 14. Mai 2006 11:05

Re: Prozesse auf LAN-PC auflisten & beenden
 
Ähem ... also in PView2 habe ich auf die Performance Counter in der Registry zugegriffen was, dank der Tatsache daß Registry-Zugriff auch remote erfolgen kann, eben zum Auslesen reicht. Das Killen von Prozessen geht remote so nicht.

Allerdings kann man sich des schönen Prinzips von PSKILL (siehe Sysinternals) bedienen und einen Service in einer Ressource einlagern, den man auf einen (on-the fly erstellten) Share auf dem entfernten Rechner kopiert und über die konventionellen SCM-APIs installiert. Dieser Service bekommt dann entweder über IPC gesagt was er zu tun hat, oder besser noch er erhält seine Daten in seinem Registry-Key als Konfiguration ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz