AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) User-Spezifische Folder ermitteln wenn mit "Run als Administrator" gestartet wurde
Thema durchsuchen
Ansicht
Themen-Optionen

User-Spezifische Folder ermitteln wenn mit "Run als Administrator" gestartet wurde

Ein Thema von Christoph Schneider · begonnen am 30. Aug 2011 · letzter Beitrag vom 4. Sep 2011
 
Benutzerbild von Christoph Schneider
Christoph Schneider

Registriert seit: 7. Okt 2008
Ort: CH-Baar
54 Beiträge
 
Delphi 11 Alexandria
 
#1

User-Spezifische Folder ermitteln wenn mit "Run als Administrator" gestartet wurde

  Alt 30. Aug 2011, 17:36
Mein kleines Installationsprogram benötigt Administratoren-Rechte, welche ich via Manifest einfordere.
Unter Windows 7 /Vista erfolgt damit bereits vor Program-Start ein User-Wechsel auf einen
User mit Amdinistrator-Rechte, falls der eingeloggte User keine entsprechenden Rechte besitzt.

Beim Installieren hole ich mit SHGetFolderPath verschiedene User-spezifische Folders.
Wenn im dritte Parameter Token 0 übergeben wird, erhalten ich in dieser Situation
natürlich den Pfad des Administrator-Users und nicht jenen des ursprüglich eingeloggten Users.

Jetzt versuchte ich mit dem dritten Parameter das Token des geforderten Users mitzugeben, doch kriege ich immer
"The handle is Invalid" zurück.

Mit folgender Funktion erhalte ich das Token vom Parent-Prozess (welcher in der Regel auf den eingeloggten User verweist):

Code:
function GetTokenOfProcess(ProcessId: DWORD): THandle;
const
  PROCESS_QUERY_LIMITED_INFORMATION = $1000;
var
  ProcessHandle, TokenHandle: THandle;
begin
  Result := 0;
  ProcessHandle := 0;
  try
    ProcessHandle:= OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, True, ProcessId);
    if ProcessHandle <> 0 then
    begin
      if OpenProcessToken(ProcessHandle, TOKEN_QUERY or TOKEN_IMPERSONATE, TokenHandle) then
        result := TokenHandle;
      // call CloseHandle(TokenHandle) at the end
    end;
  finally
    CloseHandle(ProcessHandle);
  end;
end;
Beim Aufruf erhalte ich dann immer ein HResult für "The handle is Invalid" zurück.
Code:
hRes := SHGetFolderPath(Handle, CSIDL_PROGRAMS, GetTokenOfProcess(ParentProcessID), SHGFP_TYPE_DEFAULT, Folder)

Hat jemand eine Idee was hier falsch läuft. Oder gibt es einen einfacheren Weg für dieses Problem?
Christoph Schneider
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz