![]() |
Problem beim auslesen des Aktuellen Benutzers
Hallo,
hier ist mein Code zum Auslesen des Benutzers:
Delphi-Quellcode:
Das funktioniert auch super. Nun wird mein Programm aber beim Drucken einer Datei aufgerufen. Also der Druckertreiber startet das Programm.
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); 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 |
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: ![]() ![]() ![]() Ciao Frederic |
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 |
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? |
Re: Problem beim auslesen des Aktuellen Benutzers
Hi!
Wo liegt denn dieses ps-File? Ciao Frederic |
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) |
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 |
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 ? |
Re: Problem beim auslesen des Aktuellen Benutzers
Hallo Svobi1975
ich arbeite mit Drysek zusammen. Zitat:
Ich kenne keine Umgebungsvariable Namens "Profile". |
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. |
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