Hallo zusammen,
Und zwar möchte ich den Windows-User auslesen, sodass in einer Versionshistory direkt gespeichert wird welcher Windows User was geändert hat. Folgenden Code habe ich benutzt:
ZitatOption Compare Database
Option Explicit
Private Declare Function GetUserName _
Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Function Benutzer() As String
Dim UserN As String * 101
Dim Laenge As Long
Dim Ergebnis As Variant
Laenge = 100
Ergebnis = GetUserName(UserN, Laenge)
Benutzer = Left(UserN, Laenge - 1)
End Function
Dieser liest auch den aktuellen Windows-User aus und schreibt ihn in meine Versions-Hisory, allerdings wird immer in alle Datensatzänderungen der aktuelle User hineingeschrieben und nicht nur in den Datensatz der tatsächlich nur geändert wurde. Weis jemand woran dies liegen könnte? ::)
Lg
Malibum :)
Hallo,
Schwer zu sagen, da im gezeigten Code gar nichts in eine Tabelle geschrieben wird :(
gruss ekkehard
Hallo,
ja die Funktion gebe ich in der Tabelle für das Feld als Quelle an.
Zitat[Benutzer] [=Benutzer()]
:-\
Gruß
Malibum
Hallo,
Zitat
ja die Funktion gebe ich in der Tabelle für das Feld als Quelle an.
[Benutzer] [=Benutzer()]
???????????
In einem Tabellenfeld kann keine benutzerdefinierte Funktion eingesetzt werden.
Im Steuerelementinhalt eines Formular-Textfeldes wird zwar mit
=Benutzer() der Rückgabewert der Funktion angezeigt, aber deswegen noch lange nicht in ein Tabellenfeld gespeichert.
Das Problem scheint wohl eher die verwendete (und vor uns geheimgehaltene) Methode zum Schreiben von Datensätzen in die History-Tabelle zu sein, als den Benutzernamen festzustellen.
Hallo,
ja ich konnte es lösen. Die Funktion musste ich in dem "Ereigniss auslösen" vor Aktualisierung eintragen, in dem auch gleichzeitig der Datensatz in die History kopiert wird...
Gruß ;)
Hallo malibum,
noch ein Nachtrag:
Den Benutzer kannst du auch einfacher auslesen:
MsgBox Environ("USERNAME")
http://dbwiki.net/wiki/VBA_Tipp:_Windows_Umgebungsvariablen_und_spezielle_Verzeichnisse (http://dbwiki.net/wiki/VBA_Tipp:_Windows_Umgebungsvariablen_und_spezielle_Verzeichnisse)
Gruß
Josef
@Josef,
Umgebungsvariablen lassen sich manipulieren, weshalb eine API-Version zum Beschaffen des Benutzernamens IMO zu bevorzugen ist. Deshalb gehört Environ wohl auch zu den Sandbox-Funktionen, die nicht direkt ohne einen BA-Wrapper in Ausdrücken (Abfragen, Textboxen) verwendet werden können.C:\Users\lachtaube>set USERNAME
USERNAME=lachtaube
C:\Users\lachtaube>set USERNAME=FooBar
C:\Users\lachtaube>set USERNAME
USERNAME=FooBar
C:\Users\lachtaube>
@Lachtaube,
ZitatUmgebungsvariablen lassen sich manipulieren
ich habe deinen Code mal ausprobiert (im DOS-Fenster oder wie das Ding heißt), und habe den Benutzernamen, wie von dir beschrieben, auf
FooBar geändert, und dann abgefragt. Funktioniert. Es wird
FooBar angezeigt.
Wenn ich dann aber zugleich in Access
MsgBox Environ("USERNAME") aufrufe , wird mir trotzdem der richtige (alte) Benutzername angezeigt. Das würde ich so deuten, dass die Environ-Funktion nicht manipulierbar ist.
Gruß
Josef
ZitatDas würde ich so deuten, dass die Environ-Funktion nicht manipulierbar ist.
Doch, wenn du in gezeigter dosbox access startest.
Josef, dann starte einmal Access mit start msaccess aus der Konsole nach Änderung der Umgebungsvariablen.
@Lachtaube,
ZitatJosef, dann starte einmal Access mit start msaccess aus der Konsole nach Änderung der Umgebungsvariablen.
stimmt, jetzt wird der geänderte Benutzername angezeigt.
Aber wer tut denn sowas? ;)
So "böse" Menschen gibt es doch gar nicht? :) ;)
Gruß
Josef
@Lachtaube und daolix,
nachdem ihr mir alles so schön erklärt habt (danke dafür),
noch eine Nachfrage:
Wenn ich die Umgebungsvariablen über den Windows Scripting Host ermittle, sind sie doch nicht manipulierbar, oder?
Dim WSH As Object
Dim WSHEnv As Object
Set WSH = CreateObject("WScript.Shell")
Set WSHEnv = WSH.Environment("VOLATILE")
MsgBox WSHEnv("USERNAME")
Gruß
Josef
Dim WSH As Object
Dim WSHEnv As Object
Set WSH = CreateObject("WScript.Shell")
Set WSHEnv = WSH.Environment("VOLATILE")
WSHEnv("USERNAME") = "FooBar"
MsgBox WSHEnv("USERNAME")
Zitat von: Joss am Februar 09, 2017, 14:42:34Wenn ich die Umgebungsvariablen über den Windows Scripting Host ermittle, sind sie doch nicht manipulierbar, oder?
Umgebungsvariablen können von jedem Benutzer, auch ohne Admin-Berechtigung, gesetzt oder zumindest für den jeweiligen Kontext überschrieben werden. Wie du sie ausliest, ist völlig egal.
Danke für die Antworten.
Wieder was gelernt. :)
Dass aber auch überall die Manipulations-Gefahren "lauern" müssen! ;)
Gruß
Josef