Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi XP: OpenProcessToken bei NETZWERKDIENST: Zugriff verweigert (https://www.delphipraxis.net/140773-xp-openprocesstoken-bei-netzwerkdienst-zugriff-verweigert.html)

Zacherl 25. Sep 2009 19:48


XP: OpenProcessToken bei NETZWERKDIENST: Zugriff verweigert
 
Hey,

ich habe ein seltsames Problem. Ich versuche anhand der Prozess Token den Benutzernamen herauszufinden. Für SYSTEM Prozesse und Prozesse, die von lokalen Benutzern gestartet wurden, funktioniert dies wunderbar.
Bei allen Prozessen von NETZWERKDIENST oder LOKALER DIENST schlägt OpenProcessToken() allerdings mit Fehlercode 5 (Zugriff verweigert) fehl.

Debug Privilegien habe ich mir mit folgendem Code geholt:
Delphi-Quellcode:
function EnableDebugPrivilege: Boolean;
var
  hToken: THandle;
  TP: TTokenPrivileges;
begin
  if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken) then
  begin
    try
      TP.PrivilegeCount := 1;
      if LookupPrivilegeValue(nil, 'SeDebugPrivilege',
        TP.Privileges[0].Luid) then
      begin
        TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        Result := AdjustTokenPrivileges(hToken, false, TP, SizeOf(TP), nil,
          DWord(nil^));
      end;
    finally
      CloseHandle(hToken);
    end;
  end;
end;
Den Prozess öffne ich mit:
Delphi-Quellcode:
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
  PROCESS_VM_READ, false, Process32.th32ProcessID);
Das Token öffne ich mit:
Delphi-Quellcode:
if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
Hoffe jemand weiß Rat. Unter Win7 können übrigens alle Benutzernamen wunderbar abgefragt werden.

Viele Grüße
Zacherl

Dezipaitor 26. Sep 2009 01:34

Re: XP: OpenProcessToken bei NETZWERKDIENST: Zugriff verweig
 
Schonmal mit PROCESS_ALL_ACCESS den Prozess geöffnet und gesehen was passiert?

Zacherl 26. Sep 2009 11:40

Re: XP: OpenProcessToken bei NETZWERKDIENST: Zugriff verweig
 
Ja, sowohl mit PROCESS_ALL_ACCESS als auch mit TOKEN_ALL_ACCESS und in Kombination. Der Fehler scheint allerdings bekannt zu sein:
http://social.msdn.microsoft.com/For...7-d78c5a4ca8af

Werde das Workaround jetzt gleich mal testen und dann hier nochmal Feedback geben, inwiefern es funktioniert :)

Zacherl 26. Sep 2009 12:36

Re: XP: OpenProcessToken bei NETZWERKDIENST: Zugriff verweig
 
Leider nicht zufriedenstellend:

Delphi-Quellcode:
var
  dwBufSize: DWord;
  bSuccess: Boolean;
  Descriptor: PSecurityDescriptor;
  SID: Pointer;
  Defaulted: LongBool;
begin
  Descriptor := nil;
        bSuccess := GetKernelObjectSecurity(hProcess,
          OWNER_SECURITY_INFORMATION, nil, 0, dwBufSize);
        while (not bSuccess) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) do
        begin
          ReallocMem(Descriptor, dwBufSize);
          bSuccess := GetKernelObjectSecurity(hProcess,
            OWNER_SECURITY_INFORMATION, Descriptor, dwBufSize, dwBufSize);
        end;
        if (bSuccess) then
        begin
          if GetSecurityDescriptorOwner(Descriptor, SID, Defaulted) then
          begin
            Result := SID;
          end;
        end;
Teilweise funktioniert ist, bei den meisten Prozessen aber wird eine SECURITY_CREATOR_SID_AUTHORITY oder SECURITY_LOCAL_SID_AUTHORITY zurückgegeben. Wie kann ich nun die wirkliche SID ermitteln? Ich brauche diese, um sie mit der SYSTEM RID, der LOCALSERVIVE RID und der NETWORKSERVICE RID zu vergleichen.

Dezipaitor 26. Sep 2009 18:10

Re: XP: OpenProcessToken bei NETZWERKDIENST: Zugriff verweig
 
Hmm, kommt mir wie ein Bug in XP vor. In Vista habe ich das Problem nicht.
Es tritt auch nicht auf, wenn man als SYSTEM Benutzer darauf zugreift.

Der Quelltext bezieht sich auf den Besitzer der Sicherheitseinstellungen, also wer diese uneingeschränkt ändern darf. Nicht jedoch auf den Prozessbesitzer.

btw:
Der ProcessExplorer nutzt einen Treiber, um die Prozessinformationen auszulesen.

Zacherl 26. Sep 2009 19:11

Re: XP: OpenProcessToken bei NETZWERKDIENST: Zugriff verweig
 
Scheint echt ein Bug in WinXP zu sein. Unter Win7 (sogar 64 Bit) funktioniert alles wunderbar. Der ProzessExplorer benutzt zwar einen Treiber, aber z.B. der Taskmanager zeigt unter XP ja auch die korrekten Prozess Benutzernamen an.

Hast du eine Idee, wie das dort funktioniert?

Dezipaitor 26. Sep 2009 19:34

Re: XP: OpenProcessToken bei NETZWERKDIENST: Zugriff verweig
 
Ich bin nicht sicher, aber ich glaube der nutzt WTSEnumerateProcesses, um die Prozesse aufzulisten. Die Funktion gibta auch den Benutzer zurück.

Zacherl 27. Sep 2009 12:31

Re: XP: OpenProcessToken bei NETZWERKDIENST: Zugriff verweig
 
Ah das klingt gut. Werde ich mal versuchen :)

Edit: Vielen Dank, funktioniert einwandfrei!


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 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