mathe172
Goto Top

Dateipfad eines 64-bit Prozesses per 32-bit Anwendung abfragen

Hallo,

ich arbeite mit VS2010 Express an einem Programm und hab mal wieder eine Frage...

...und zwar will ich den Dateipfad (der, den man auch im Taskmanager sieht) für alle laufenden Prozesse abfragen. Das Problem:
Es handelt sich hierbei um eine 32-bit Anwendung auf einem 64-bit Windows 7 OS. Nun kommt folgender Fehler, wenn ich den Dateipfad eines 64-bit Prozesses ermitteln will:

Eine Ausnahme (erste Chance) des Typs "System.ComponentModel.Win32Exception" ist in System.dll aufgetreten.

Ein 32-Bit-Prozess kann nicht auf Module eines 64-Bit-Prozesses zugreifen.

Den Pfad versuche ich über Process.MainModule.FileName abzufragen.

Kann man das irgendwie umgehen? z.B. per api?

Mfg,
Mathe172

Content-ID: 167006

Url: https://administrator.de/contentid/167006

Ausgedruckt am: 21.11.2024 um 16:11 Uhr

Friemler
Friemler 26.05.2011 um 22:19:18 Uhr
Goto Top
Hallo Mathe,

schau mal hier nach. Das ist zwar Delphi-Code, aber evtl. kannst Du Dir dort trotzdem was rausziehen.

Gruß
Friemler
mathe172
mathe172 27.05.2011 um 22:52:02 Uhr
Goto Top
Hallo,

danke - ich habs jetzt zwar mit wmi gemacht, hab's aber nur über deinen Link gefunden.
[edit: Bei den Funktionen im Link kam immer: Einstiegspunkt in kernel32.dll nicht gefunden...]

zwei Fragen noch (eine hat zwar nur wenig mit der Anfangsfrage zu tun):
Ich hab jetzt diesen Code:
For Each Process As Process In Process.GetProcesses
            Try
                Dim mo As ManagementObject = CType(New ManagementObjectSearcher("select * from Win32_Process where processid = '" & Process.Id & "'").Get(0), ManagementObject)  
                Dim Path As String
                For Each prop As PropertyData In mo.Properties
                    If prop.Name = "ExecutablePath" Then Path = prop.Value.ToString  
                Next
            Catch ex As Exception
            End Try
        Next
Warum ist beim Prozess EXPLORER.EXE der Prop.value leer (nothing). Das heisst, er geht in den then-Teil (Zeile 6), sagt aber, prop.value=nothing

Die zweite Frage (ich weiss ich sollte eine neue Frage machen...)
Wenn man mit einer 32bit-Anwendung auf HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run (Registry) zugreifen will, wird man ja "umgeleitet" (nach HKLM\SOFTWARE\Wow6432\Microsoft\Windows\CurrentVersion\Run)
Wie kann ich jetzt aber auf den gewünschten Schlüssel zugreifen (ich brauche alle Autostart-Einträge)?

Mfg,
Mathe172
Friemler
Friemler 27.05.2011 um 23:40:45 Uhr
Goto Top
Hallo Mathe,

ich habe weder Visual Studio (sondern Delphi) noch ein 64Bit-System (sondern Windows 7 Ultimate 32Bit). Aber wenn ich mit VBS folgende Abfrage mache, erhalte ich einen Wert für ExecutablePath beim Explorer, bei vielen anderen Prozessen jedoch nicht.
strComputer = "."  
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\CIMV2")  

Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name='explorer.exe'")  

For Each objProcess in colProcesses
  WScript.Echo "Name          : " & objProcess.Name  
  WScript.Echo "ExecutablePath: " & objProcess.ExecutablePath  
  WScript.Echo "CommandLine   : " & objProcess.CommandLine  
  WScript.Echo
Next

Das sollte eigentlich das selbe machen, wie Dein Code. Teste das doch mal bei Dir.

Was Deine zweite Frage betrifft, keine Ahnung face-sad , Google fragen.

Gruß
Friemler
mathe172
mathe172 28.05.2011 um 14:00:20 Uhr
Goto Top
Hallo,

komisch, dein Code funktioniert bei mir auch...
Naja, ich werde mal das Häckchen dran machen. Danke nochmals.

MfG,
Mathe172