Delphi-PRAXiS
Seite 1 von 3  1 23      

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)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:43 Uhr.
Seite 1 von 3  1 23      

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