![]() |
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) |
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. ;)
|
Re: Prozesse auf LAN-PC auflisten & beenden
Der Code funktioniert gut... Bis auf das das "Prozess beenden" nicht implementiert ist. Absicht?
|
Re: Prozesse auf LAN-PC auflisten & beenden
Zitat:
|
Re: Prozesse auf LAN-PC auflisten & beenden
Verstehe!
:wiejetzt: Gib mal nTip! :-D |
Re: Prozesse auf LAN-PC auflisten & beenden
Als VBS wäre auch dieser Quellcode denkbar:
Code:
Funktioniert einwandfrei. Kein Virus o.ä.
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 Als erste Zeile wäre auch dies denkbar:
Code:
remote = InputBox("Name des Remote-PCs:","Remote-Prozesse","Name des meist genutzten PCs")
|
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
|
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... |
Re: Prozesse auf LAN-PC auflisten & beenden
mach mal.. vielleicht hilfts mir ja irgendwie
|
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 |
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 |
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