Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem beim auslesen des Aktuellen Benutzers (https://www.delphipraxis.net/31986-problem-beim-auslesen-des-aktuellen-benutzers.html)

pikman 16. Okt 2004 17:28


Problem beim auslesen des Aktuellen Benutzers
 
Hallo,

hier ist mein Code zum Auslesen des Benutzers:
Delphi-Quellcode:
var
  Wert: PChar;
  Laenge: integer;
begin
  Laenge := GetEnvironmentVariable('USERNAME',nil,0);
  GetMem(Wert, Laenge);
  GetEnvironmentVariable('USERNAME',Wert,Laenge);
 RESULT := String(Wert);
 ShowMessage(Wert);
  FreeMem(Wert);
Das funktioniert auch super. Nun wird mein Programm aber beim Drucken einer Datei aufgerufen. Also der Druckertreiber startet das Programm.
Wenn nun aber der Druckertreiber das Programm startet bekomme ich bei der oben genanten Funktion SYSTEM als aktuellen Benutzer augegeben.
Ich will aber den Angemeldeten Benutzer bekommen.

Ich hoffe mein Problem ist verständlich rübergekommen, wenn ihr was nicht verstanden habt fragt nach.

Ich danke schon mal im vorraus für Euere Antworten.
MFG

fkerber 16. Okt 2004 17:59

Re: Problem beim auslesen des Aktuellen Benutzers
 
Hi!

Herzlich willkommen in der DP!

Ich vermute mal, dass dein Code immer den Benutzer zurückgibt, von dem aus das Programm gestartet wurde. Das ist in dem Fall wohl SYSTEM.

Dazu mal noch folgende Links zum Weiterlesen:
http://www.delphipraxis.net/internal...ht=angemeld%2A
http://www.delphipraxis.net/internal...ht=angemeld%2A
http://www.delphipraxis.net/internal...ht=angemeld%2A

Ciao Frederic

Drysek 17. Okt 2004 00:32

Re: Problem beim auslesen des Aktuellen Benutzers
 
Hi, ich arbeite mit dem Autor des Threads zusammen und versuche die Problematik nochmal ein wenig genauer zu spezifizieren !

Es geht im Grunde nicht darum den aktuell angemeldeten Nutzer auszulesen. Das wäre ja auch nicht die Schwierigkeit !

Das Problem was wir haben, ist das wenn unser Programm durch übergabe eines Druckauftrages an einen bestimmten Drucker angestoßen wird, der ausführende Benutzer das System ist !
So weit so gut. Wenn jetzt unser Programm den Druckauftrag abfängt und ihn z.B. auf dem Desktop oder in den Eigenen Datein von Windows via TSafeDialog temporär ablegen soll. Tritt das Problem auf. Der Pfad z.B. unter WindowsXP zum Desktop lautet dann nämlich nicht mehr c:\dokumente einstellungen\NutzerName\Desktop sondern c:\dokumente einstellungen\LocalService\Desktop! Und genau da liegt das Problem. Is ja auch klar, weil dem Nutzer SYSTEM LocalService als Zielpfad zugeordnet ist !

Gibt es vielleicht eine Möglichkeit den Druckauftrag als normalen Nutzer also nicht als Nutzer SYSTEM anzustoßen, damit wir das Problem umgehen können ? Irgendwelche speziefischen API Calls für XP oder Win2k wie z.B. "LsaEnumerateLogonSessions" bringen uns auch nicht weiter, da das Ganze ja auch z.B. unter 98 laufen soll *g*

Vielleicht fällt euch ja noch was ein, wäre super !

Greets

Drysek

Svobi1975 21. Okt 2004 16:31

Re: Problem beim auslesen des Aktuellen Benutzers
 
Der Druck wird immer unter dem SYSTEM Account von Windows ausgeführt.

Deshalb bekommt Ihr diese Meldung.

Es gibt eine Andere Möglichkein um den Benutzernamen für den das Dokument gedruckt wird herrauszufinden.

Das .ps File

Dort gibt es einen Eintrag
%%For : Benutzer
Diesen einfach rausparsen und fertig.

Welchen Druckerumleiter benutzt Ihr?

fkerber 21. Okt 2004 16:32

Re: Problem beim auslesen des Aktuellen Benutzers
 
Hi!

Wo liegt denn dieses ps-File?


Ciao Frederic

Svobi1975 21. Okt 2004 16:38

Re: Problem beim auslesen des Aktuellen Benutzers
 
Das kommt drauf an, welchen Redirector Ihr benutzt.

Wenn man RedMon benuzt, kann man sich den Dateinamen als Parameter übergeben lassen

Das ist meine Ausführkonfiguration :

C:\Programme\rePDF\rePDF.exe "%d" "%u" "%1"

%d = Dokumentenname
%u = User (in unserem Fall SYSTEM)
%l = temporäre Datei (meistens im Windows / System32 )

Das steht aber auch in der Redmondoku.

Anmerkung : Die Datei ist nur solange da, solange der Redmon läuft, danach wird Sie gelöscht.
Also kopieren.... dann kann man sich die Datei auch mal anschauen, und man sollte einen PS - Drucker als Treiber aussuchen, da man PS am besten auslesen kann und auch gleich mit Ghostscript weiterverarbeiten kann (zb.: PDF)

Drysek 23. Okt 2004 00:56

Re: Problem beim auslesen des Aktuellen Benutzers
 
Hi Svobi1975,

diese Möglichkeit des Auslesens des Nutzers ist mir auch bekannt!
Das Problem hängt aber wohl eher an der Delphikomponente TSaveDialog.
Also wir greifen den output des Druckers ab, in unserem Fall die ps Datei
und bieten die Möglichkeit des Speicherns der ps Datei über die bereits
genante TSaveDialog Komponente von Delphi an. Diese öffnet sich nach dem der
Druckprozess gestartet wurde automatisch um das ps File zu speichern!
Leider greift die Komponente immer auf den Nutzer System zurück so das sich
der Pfad zum Desktop den man ja als Speicherort über die Komponente auch aus-
wählen kann immer auf den Pfad LocalService\Desktop bezieht und nicht auf das
Desktopverzeichnis des angemeldeten Users :(
Gibts da vielleicht ne Möglichkeit der Komponente zu sagen, dass Sie für Ihre
Speicherpfade nen anderen Nutzer zu Grunde legen soll oder gibts vielleicht
Alternativen zur Komponente TSaveDialog.

Gruß

Drysek

Svobi1975 24. Okt 2004 12:22

Re: Problem beim auslesen des Aktuellen Benutzers
 
Hallo Drysek,

habe in den letzten Tagenauch meinen PDF - Drucker verbessert (bessergesagt versuche ich Ihn 100% Terminalserver fähig zu machen).
Das scheitert leider daran dass die Pfade (Parameter %1) nicht mehr übergeben werden.
Naja mein Problem.


Aber das mit dem Savedialog kenne ich aus einem Ähnlichen Fall. Ich habe mich jetzt damit arrangiert, dass ich die EnvironnementVariable 'Profile') hole und diese dann mit den entsprechenden Daten ersetzte.

Das ist zwar mit der Fasut durchs auge aber so löse ich das Problem mit dem Userverzeichniss.

Nochmal zu meinem Problem. Ich versuche einen Generellen Service auf dem Rechner (in meinem Fall Terminalserver einzurichten , der eine Verteilung der Daten (pro Benutzer) möglich macht.
Diese Verteilten Daten soll dann ein Prozess des Benutzers überprüfen und drucken.
Ich werde mi dem ServerService direkt das Windows temp verzeichniss überwachen.
Die Verteilung werde ich in die Benutzerverzeichnisse Machen.

Ich denke das ist eine gute Idee.

Meinung ?

pikman 26. Okt 2004 18:14

Re: Problem beim auslesen des Aktuellen Benutzers
 
Hallo Svobi1975

ich arbeite mit Drysek zusammen.

Zitat:

Aber das mit dem Savedialog kenne ich aus einem Ähnlichen Fall. Ich habe mich jetzt damit arrangiert, dass ich die EnvironnementVariable 'Profile') hole und diese dann mit den entsprechenden Daten ersetzte.
Kannst du das mal genauer Erläutern wie du das gemacht hast??
Ich kenne keine Umgebungsvariable Namens "Profile".

pikman 27. Okt 2004 15:04

Re: Problem beim auslesen des Aktuellen Benutzers
 
Alles klar,

hab es geschaft. Poste mal den Code false jemand auch so nen Prob hat.

Danke Svobi1975, der Tipp war gold richtig.
Danke natürlich auch an alle anderen.

Delphi-Quellcode:
function TForm1.SetTheRightUserProfile : boolean;
var
   bufferProfilePath: Array[0..1024] of Char;
   strTmp : String;
begin
   if Windows.GetEnvironmentVariable('ALLUSERSPROFILE', bufferProfilePath, sizeof(bufferProfilePath)) <> 0 then begin
      strTmp := bufferProfilePath;
      strTmp := AnsiReplaceStr(strTmp, 'All Users', GetUserName());

      if Windows.SetEnvironmentVariable('USERPROFILE', PCHAR(strTmp)) then begin
         RESULT := TRUE;
      end else begin
         RESULT := FALSE;
      end;
   end else begin
      RESULT := FALSE;
   end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:32 Uhr.
Seite 1 von 2  1 2      

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