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
Antwort Antwort
Seite 1 von 2  1 2      
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
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: User-Spezifische Folder ermitteln wenn mit "Run als Administrator" gestartet wurd

  Alt 30. Aug 2011, 19:49
Warum so umständlich? Wenn dein Programm noch Dateien benötigt, die benutzersüpezifisch sind, dann lass sie vom Programm beim ersten Start anlegen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Christoph Schneider
Christoph Schneider

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

AW: User-Spezifische Folder ermitteln wenn mit "Run als Administrator" gestartet wurd

  Alt 31. Aug 2011, 07:35
Gute Idee, nur in meinem Fall geht dies leider nicht. Ich brauche bereits zu Installationszeitpunkt diese Verzeichnisse.
Christoph Schneider
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: User-Spezifische Folder ermitteln wenn mit "Run als Administrator" gestartet wurd

  Alt 31. Aug 2011, 08:56
Warum das? Zum Installationszeitpunkt, ist dein eigentliches Programm doch noch gar nicht aktiv.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#5

AW: User-Spezifische Folder ermitteln wenn mit "Run als Administrator" gestartet wurd

  Alt 31. Aug 2011, 09:00
Eventuell wird hier ein Token benötigt, womit man mehr machen kann, als nur TOKEN_QUERY?
Siehe Schließanlagen: Nur weil ich einen Schlüssel hab, der zu einer Tür paßt, muß er nicht gleich auch noch zu einer gewissen anderen Tür passen.

Und sicher daß der ParentProcess überhaupt im gewünschten Usercontext läuft?
Besser wäre es wohl, wenn du hier irgendwie den User aussliest, in dessen Session/Desktop das Programm grade läuft/angezeigt wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (31. Aug 2011 um 09:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Christoph Schneider
Christoph Schneider

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

AW: User-Spezifische Folder ermitteln wenn mit "Run als Administrator" gestartet wurd

  Alt 31. Aug 2011, 11:08
Den User aus der Session zu bestimmen ist sicherlich der bessere Ansatz als den Parent-Prozess zu nehmen. Besten Dank himitsu für diesen Tip!

Am zweiten Paramter DesiredAcess von OpenProcessToken liegt es nicht, denn ich habe testweise mal TOKEN_ALL_ACCESS eingesetzt und dasselbe Ergebnis erhalten.

Um beispielsweise ein Menu-Eintrag ins Startmenu zu schreiben ist der Zeitpunkt der Installation sicher der einzig richtige. Für Konfigurationsdateien wäre der erste Programm-Start sicher auch geeignet, wie Luckie schreibt.

Und dann fragt sich sicherlich auch, warum jemand ein Installer selber schreiben muss. Dazu braucht es gute Gründe doch die sind bei dieser Applikation geben.
Christoph Schneider
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: User-Spezifische Folder ermitteln wenn mit "Run als Administrator" gestartet wurd

  Alt 31. Aug 2011, 11:17
Um beispielsweise ein Menu-Eintrag ins Startmenu zu schreiben ist der Zeitpunkt der Installation sicher der einzig richtige.
Und was ist mit den anderen Benutzern? Wenn du keine halben Sachen machen willst, müsstest du alle Benutzer durchgehen und für jeden Benutzer den Startmenüeintrag anlegen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#8

AW: User-Spezifische Folder ermitteln wenn mit "Run als Administrator" gestartet wurd

  Alt 31. Aug 2011, 11:25
Wenn du keine halben Sachen machen willst, müsstest du alle Benutzer durchgehen und für jeden Benutzer den Startmenüeintrag anlegen.
Für sowas gibt es aber den Default-User.

Ich fände es schön, wenn setups fragen würden (was einige Wenige sogar schon machen) wo es installiert werden soll.
- für aktuellen benutzer
- für alle Benutzer
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: User-Spezifische Folder ermitteln wenn mit "Run als Administrator" gestartet wurd

  Alt 31. Aug 2011, 11:43
Dann muss er aber nicht umständlich mit Tokens und Sessions rumhantieren. Den Default-User gibt es nicht, das ist nur ein Ordner unter den Benutzerprofilen, der für alle gilt. Da kann er dann einfach seinen Startmenüeintrag machen. Was ich aber auch nicht leiden kann, weil eine Verknüpfung die da liegt, kann der einzelne Benutzer nicht löschen oder verschieben, wenn er sie nicht haben will oder an einer anderen Stelle.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Christoph Schneider
Christoph Schneider

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

AW: User-Spezifische Folder ermitteln wenn mit "Run als Administrator" gestartet wurd

  Alt 31. Aug 2011, 13:02
Genau, mein Installationsprogram frägt den Anwender, ob für alle oder nur für den laufenden User installiert werden soll. Im ersten Falle wird dann als CSIDL bspw. für den Startordner CSIDL_COMMON_PROGRAMS verwendet während für den aktuellen User CSIDL_PROGRAMS abgefragt wird. Dieser Ansatz funktionierte auch bis und mit XP problemlos. Seit aber immer mehr User ohne Admin-Rechte laufen und gezielt für die Installation ein User-Wechsel vorgenommen wird, läuft dies wie erwähnt nicht mehr.
Die Verwendung des Default-Users ist mea. auch nicht geeignet, den dieser wird als Template-User verwendet, wenn in Zukunkt ein neuer User eingerichtet wird.
Christoph Schneider
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:49 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