![]() |
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:
Den Prozess öffne ich mit:
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;
Delphi-Quellcode:
Das Token öffne ich mit:
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
PROCESS_VM_READ, false, Process32.th32ProcessID);
Delphi-Quellcode:
Hoffe jemand weiß Rat. Unter Win7 können übrigens alle Benutzernamen wunderbar abgefragt werden.
if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
Viele Grüße Zacherl |
Re: XP: OpenProcessToken bei NETZWERKDIENST: Zugriff verweig
Schonmal mit PROCESS_ALL_ACCESS den Prozess geöffnet und gesehen was passiert?
|
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:
![]() Werde das Workaround jetzt gleich mal testen und dann hier nochmal Feedback geben, inwiefern es funktioniert :) |
Re: XP: OpenProcessToken bei NETZWERKDIENST: Zugriff verweig
Leider nicht zufriedenstellend:
Delphi-Quellcode:
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.
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; |
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. |
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? |
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.
|
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