![]() |
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 |
Re: Prozesse auf LAN-PC auflisten & beenden
Ist kein "Delphi-Feature":
![]() |
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 |
Re: Prozesse auf LAN-PC auflisten & beenden
Zitat:
|
Re: Prozesse auf LAN-PC auflisten & beenden
Zitat:
Ich dachte einfach, jemand würde vielleicht eine einfachere Möglichkeit kennen oder Hinweise geben, was relevant für mich ist. Gruß, ManuMF |
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. |
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. |
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; |
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 |
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. |
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