Announcement

Collapse
No announcement yet.

Prozesse und Services unter NT auslesen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Prozesse und Services unter NT auslesen?

    Ich benutze zur Erkennung der programmnamen von laufenden Prozessen die Befehle:

    EnumProcesses
    OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, Liste[i]);
    GetModuleBaseName

    Es funktionirt so weit gut, nur wenn ich nicht als Admin eingeloggt bin, bekomme
    ich zwar mit EnumProcesses alle Prozesse, nur OpenProcess gibt bei den Diensten immer 0 als Ruckgabewert.
    Hat jemand eine Loesung?

  • #2
    Hallo,

    unter welchem Betriebssystem läuft das Ganze? Wenn Windows 2000 genutzt wird oder ADSI unter NT4 nachinstalliert wurde, könnte man das folgende Script für WSH (Windows Scripting Host) ausprobieren. Werden dort alle Dienste angezeigt, auch wenn der User keine Admin-Rechte hat?
    <pre>
    '
    ' ADSI
    '

    Dim oADSWinNT
    Dim sStr

    Set oADSWinNT = GetObject("WinNT://OssiSoft/SOLO9150")

    oADSWinNT.Filter = Array("Service")

    sStr = "Ergebniss von " & oADSWinNT.Name & vbCrLf & vbCrLf

    For Each Item In oADSWinNT
    sStr = sStr & Item.Name & vbCrLf
    Next

    MsgBox sStr
    </pre>
    Die Zeichenkette <i>OssiSoft/SOLO9150</i> muss durch den eigenen Domänen/Rechnernamen ersetzt werden.
    &#10

    Comment


    • #3
      Das problem ist, dass das programm kompatibel zu moeglichst
      allen NT4 und W2k-versionen sein muss.
      Deshalb faellt die moeglichkeit leider aus,
      aber trotzdem dank

      Comment


      • #4
        Hallo,

        das Problem besteht darin, dass der Zugriff nur dann erlaubt ist, wenn der interaktiv angemeldete Benutzer die notwendigen Privilegien und NT-Rechte besitzt. <br>
        Der Vorteil von ADSI oder WMI liegt darin, dass man dort eine Weg vorgesehen hat, wie die Rechte bei einem bekannten Login "aufgebohrt" werden können. Man muss also nicht mehr LogonUser bzw. CreateProcessAsUser aufgerufen, da diese Funktione direkt in die COM-Objekte von ADSI bzw. WMI eingebaut sind. Somit kann man einen berechtigten Login "fest verdrahten"

        Comment


        • #5
          Hallo,

          du solltest vielleicht die PSAPI.DLL heranziehen dann funktionierts ohne Probleme mittels

          procedure TForm1.Button1Click(Sender: TObject);<br>
          var<br>
          i : Integer;<br>
          pidNeeded : DWord;<br>
          PIDList : array [0..1000] of Integer;<br>
          PIDName : array [0..MAX_PATH-1] of char;<br>
          lphName : array [0..MAX_PATH-1] of char;<br>
          PH : THandle;<br>
          Memory : _PROCESS_MEMORY_COUNTERS;<br>
          ProcEntry : TListItem;<br>
          begin<br>
          ProcessList.Items.Clear;<br>
          if not psapi.EnumProcesses(@PIDList, 1000, pidNeeded) then<br>
          raise Exception.Create('PSAPI.DLL ist nicht vorhanden');<br>
          for i := 0 to (pidNeeded div sizeof(Integer)-1) do<br>
          begin<br>
          PH := OpenProcess(PROCESS_ALL_ACCESS, False, PIDList[i]);<br>
          if PH <> 0 then<br>
          begin<br>
          if psapi.GetModuleBaseName(PH, 0, PIDName, Sizeof(PIDNAME)) > 0 then<br>
          begin<br>
          if psapi.GetProcessMemoryInfo(PH, @MEMORY, SizeOf(Memory)) = true then <br>
          begin<br>
          ProcEntry := ProcessList.Items.Add;<br>
          ProcEntry.Caption := PIDName;<br>
          if psapi.GetModuleFileNameEx(PH, 0, lphName, Sizeof(lphName)) > 0 then<br>
          ProcEntry.SubItems.Add(lphName);<br>
          Case GetPriorityClass(PH) of<br>
          HIGH_PRIORITY_CLASS : ProcEntry.SubItems.Add('High');<br>
          IDLE_PRIORITY_CLASS : ProcEntry.SubItems.Add('Idle');<br>
          NORMAL_PRIORITY_CLASS : ProcEntry.SubItems.Add<br>('Normal');
          REALTIME_PRIORITY_CLASS : ProcEntry.SubItems.Add('Real-Time');<br>
          end;<br>
          ProcEntry.SubItems.Add(IntToStr(PIDList[i]));<br>
          ProcEntry.SubItems.Add(IntToStr(Memory.PageFaultCo unt));<br>
          ProcEntry.SubItems.Add(IntToStr(Memory.PeakWorking SetSize));<br>
          ProcEntry.SubItems.Add(IntToStr(Memory.WorkingSetS ize));<br>
          ProcEntry.SubItems.Add(IntToStr(Memory.QuotaPeakPa gedPoolUsage));<br>
          ProcEntry.SubItems.Add(IntToStr(Memory.QuotaPagedP oolUsage));<br>
          ProcEntry.SubItems.Add(IntToStr(Memory.QuotaPeakNo nPagedPoolUsage));<br>
          ProcEntry.SubItems.Add(IntToStr(Memory.QuotaNonPag edPoolUsage));<br>
          ProcEntry.SubItems.Add(IntToStr(Memory.PagefileUsa ge));<br>
          ProcEntry.SubItems.Add(IntToStr(Memory.PeakPagefil eUsage));<br>
          end;<br>
          CloseHandle(PH);<br>
          end;<br>
          end;<br>
          end;<br>
          end;<br&gt

          Comment


          • #6
            Das Problem bleibt bestehen, da man für einen erfolgreichen PSAPI-Aufruf ein Prozeßhandle mit mindestens PROCESS_VM_READ benötigt.<br>
            Doch dies bekommt man nicht auf Service-Prozesse ohne Debug-Recht (Admin).<p>

            Der TaskManager benutzt übrigens NtQuerySystemInformation(SystemProcessInformation, Buffer^, BufferSize, @BytesReturned); (diese Funktion ist nicht dokumentiert!),<br>
            Deswegen kann er auch bei einem "Darf gar nichts"-Account alle Namen auflisten.

            Gruß Nic

            Comment


            • #7
              Nico Nico, du weißt doch sehr wohl, daß es zumindest lokal (und per default) eine methode gibt, die immer funzt ...

              über den performance key.

              www.erm.tu-cottbus.de/delphi/sources.html

              nach PView2 schauen.

              mein proggie is sogar schon Whistler-kompatibel ... gelle, Nico ;

              Comment


              • #8
                Ich weiß (weißer geht's nicht <p>
                Whistler-kompatibel, gibt es sowas überhaupt (siehe Icon-Bug in Luna <p>

                Gruß Nic

                Comment

                Working...
                X