Username ermitteln (Kein "Getusername_"!)

Anfängerfragen zum Programmieren mit PureBasic.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Username ermitteln (Kein "Getusername_"!)

Beitrag von CNESM »

Hallo Leute,

heute morgen hatte ich die Präsentation eines in PB enwickelten Datenbank-System. Obwohl das Thema für mich recht neu war, hab ich das Ganze recht gut umsetzen können, auch wenn es anfängliche Probleme gab. ("DSN?", "ODBC?" Ohh my God :-D) Wie nach jeder Besprechungen kommen jetzt noch ein paar Änderungswünsche. Dazu gehören diesmal, das neben dem Anmeldenummer auch der richtige Name des Benutzer mit gespeichert werden soll, damit man genau erkennt, wer hinter welcher Anmeldung steckt:

Bei uns in der Firma ist das so geregelt:

1.) An der Vista Anmeldung meldet man sich mit seiner Stammnummer (Beispiel: "P46789") und seinem Passwort an:

Bild

2.) Im Startmenu wird dann aber automatisch der Name des Benutzers ("Mustermann, Max") angezeigt:

Bild

Jetzt meine Frage: Wie komme ich an den im Startmenüe eingertragenen Namen? Getusername und alle sonstigen Google Treffer liefern mir stehts nur meine Stammnummer ("P46789"). Nach welchen Begriff muss ich suchen oder geht das ganze nur über eine Abfrage des Servers?

In der Vergangenheit habe ich das Ganze noch mit SAP abhandeln können. Da gibt es eine BAPI die Userinformationen zum übergebenen User in einer Structure zurückliefert. Leider funktioniert die Variante nur bei Firmen, die auch SAP haben *g*, nur leider ist das bei den Auslandsgesellschaften nicht immer der Fall. Daher brauche ich eine andere Lösung!

Danke für eventuelle Lösungswege :) Stichwort würde mich schon reiche :-)

THX

P.S. Gibts bei Hyperlinks keine "Center" Funktion ?"!?!? Ist mir bisher noch nie aufgefallen, das es das nicht gibt ;-)
Zuletzt geändert von CNESM am 06.02.2009 16:17, insgesamt 2-mal geändert.
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

> P.S. Gibts bei Hyperlinks keine "Center" Funktion ?"!?!? Ist mir bisher noch nie aufgefallen, das es das nicht gibt

Was hat denn das eine mit dem anderen zu tun? :)
Win11 x64 | PB 6.20
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

Eigentlich nix, aber dafür einen eigenen Thread aufmachen, find ich etwas übertrieben. Mir ist das gestern nur aufgefallen. Habs dann halt über API gemacht, aber würd mich halt nur mal interessieren, warums dafür keine PB-eigene Funktion gibt.
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

is trotzdem witzig.
es geht um benutzer und als PS um Hyperlinks.

@HyperlinkCenter: Naja, vielleicht gibt's da irgendein API, falls HyperLinks
überhaupt in API unterstützt werden.
Win11 x64 | PB 6.20
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Wie wäre es denn mit Umgebungsvariablen?

Probier mal

Code: Alles auswählen

Debug GetEnvironmentVariable("USERNAME")
Ansonsten schau mal den Beispielcode unter ExamineEnvironmentVariables() an, und versuch da, eine passende Variable rauszufinden.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

@ AND51

Hatte ich auch schon probiert. Gibt mir leider auch nur die Stammnummer zurück, aber vom angemeldeten Benuzternamen keine Spur:
ALLUSERSPROFILE = C:\ProgramData
APPDATA = C:\Users\P46789\AppData\Roaming
CommonProgramFiles = C:\Program Files\Common Files
COMPUTERNAME = HH00408D
ComSpec = C:\Windows\system32\cmd.exe
DEFLOGDIR = C:\ProgramData\McAfee\DesktopProtection
DFSTRACINGON = FALSE
EmpirumServer = SDW0014
FP_NO_HOST_CHECK = NO
HOMEDRIVE = R:
HOMEPATH = \
HOMESHARE = \\hsyw3cp14\WCHUser\P46789
LOCALAPPDATA = C:\Users\P46789\AppData\Local
LOGONSERVER = \\HHW3T05
NUMBER_OF_PROCESSORS = 2
OS = Windows_NT
Path = C:\Users\P46789\Documents\Purebasic\PureBasic\Compilers\;C:\Windows\syste
m32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1
.0\;C:\Program Files\IXOS\bin;C:\PROGRA~1\ULTRAE~1
PATHEXT = .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE = x86
PROCESSOR_IDENTIFIER = x86 Family 6 Model 23 Stepping 6, GenuineIntel
PROCESSOR_LEVEL = 6
PROCESSOR_REVISION = 1706
ProgramData = C:\ProgramData
ProgramFiles = C:\Program Files
PUBLIC = C:\Users\Public
SESSIONNAME = Console
SystemDrive = C:
SystemRoot = C:\Windows
TEMP = C:\Users\P46789\AppData\Local\Temp
TMP = C:\Users\P46789\AppData\Local\Temp
TRACE_FORMAT_SEARCH_PATH = \\NTREL202.ntdev.corp.microsoft.com\4F18C3A5-CA09-4DB
D-B6FC-219FDD4C6BE0\TraceFormat
USERDNSDOMAIN = 123.COM
USERDOMAIN = 123_ADS
USERNAME = P46789
USERPROFILE = C:\Users\P46789
VSEDEFLOGDIR = C:\ProgramData\McAfee\DesktopProtection
windir = C:\Windows

Druecken Sie Enter zum Beenden.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

So funktioniert bei mir unter Windows XP SP2 im ANSI-Modus die Ermittlung von User-ID und User-Name:

Code: Alles auswählen

EnableExplicit

Define UserIDA.S
Define UserIDW.S
Define NameLength.I
Define Result.I
Define UserName.S
Define UserInfoPointer.I
Define *UserInfo.USER_INFO_3

UserIDA = Space(128)
UserIDW = Space(256)
NameLength = Len(UserIDA)

If GetUserName_(@UserIDA, @NameLength)
  Debug "User-ID: " + UserIDA
  If MultiByteToWideChar_(#CP_ACP, #MB_PRECOMPOSED, @UserIDA, -1, @UserIDW, Len(UserIDW))
    Result = NetUserGetInfo_(0, @UserIDW, 3, @UserInfoPointer)
    *UserInfo = UserInfoPointer

    If Result = 0 And *UserInfo <> 0
      If *UserInfo\FullName <> 0
        UserName = Space(256)

        If WideCharToMultiByte_(#CP_ACP, 0, *UserInfo\FullName, 255, @UserName, Len(UserName), 0, 0)
          Debug "User-Name: " + UserName
        EndIf
      EndIf
    EndIf

    NetApiBufferFree_(*UserInfo)
  EndIf
EndIf
Als Grundlage habe ich dieses Code-Beispiel von Rings verwendet: http://www.purebasic.fr/english/viewtop ... 12&start=5.
Die USER_INFO_3-Struktur der NetUserGetInfo-Funktion liefert übrigens noch eine Menge weiterer Informationen, wie z.B. die bisherige Anzahl Logons, den Heimatverzeichnis-Pfad, die Zeit des letzten Logons und Logoffs usw.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

@ Shardik

Ebenfalls kein Erfolg. Die User-ID gibt er aus (Stammnummer), aber die *UserInfo Structure ist bei mir gleich 0, somit keine Ausgabe der Debug-Zeile "User-Name:". Schade ... :(

Das beispiel von Rings gibt ebenfalls keinerlei Ergebnisse aus ...

Irgendwo muss das doch gespeichert sein :?
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

Hallo CNESM,

ich glaube herausgefunden zu haben, warum es bei Dir nicht klappt. Die Struktur USER_INFO_3 gilt nur in einem Netzwerk bei Anmeldung über einen Server und funktioniert in unserem Firmennetzwerk ausgezeichnet, aber wahrscheinlich nicht auf einem Standalone-PC. Ich habe daher in meinem Code-Beispiel USER_INFO_3 gegen USER_INFO_10 (ist in PB 4.30 nicht vordefiniert!) ausgetauscht. Dieses Beispiel funktioniert übrigens ebenfalls im Firmennetzwerk, auf einem Standalone-PC kann ich es leider erst heute abend zuhause testen:

Code: Alles auswählen

EnableExplicit 

Structure USER_INFO_10
  uName.L
  Comment.L
  UserComment.L
  FullName.L
EndStructure

Define UserIDA.S 
Define UserIDW.S 
Define NameLength.I 
Define Result.I 
Define UserName.S 
Define UserInfoPointer.I 
Define *UserInfo.USER_INFO_10 

UserIDA = Space(128) 
UserIDW = Space(256) 
NameLength = Len(UserIDA) 

If GetUserName_(@UserIDA, @NameLength) 
  Debug "User-ID: " + UserIDA 
  If MultiByteToWideChar_(#CP_ACP, #MB_PRECOMPOSED, @UserIDA, -1, @UserIDW, Len(UserIDW)) 
    Result = NetUserGetInfo_(0, @UserIDW, 10, @UserInfoPointer) 
    *UserInfo = UserInfoPointer 

    If Result = 0 And *UserInfo <> 0 
      If *UserInfo\FullName <> 0 
        UserName = Space(256) 

        If WideCharToMultiByte_(#CP_ACP, 0, *UserInfo\FullName, 128, @UserName, Len(UserName), 0, 0) 
          Debug "User-Name: " + UserName 
        EndIf 
      EndIf 
    EndIf 

    NetApiBufferFree_(*UserInfo) 
  EndIf 
EndIf
Zuletzt geändert von Shardik am 09.02.2009 21:07, insgesamt 1-mal geändert.
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Einfach unter benutzerkonten den Namen ändern,
so gehts hier (Getestet unter XP SP3 Pro ):

Code: Alles auswählen

EnableExplicit

Structure USER_INFO_10
  uName.L
  Comment.L
  UserComment.L
  FullName.L
EndStructure

Define UserIDA.S
Define UserIDW.S
Define NameLength.I
Define Result.I
Define UserName.S
Define UserInfoPointer.I
Define *UserInfo.USER_INFO_10

UserIDA = Space(128)
UserIDW = Space(256)
NameLength = Len(UserIDA)

If GetUserName_(@UserIDA, @NameLength)
  Debug "User-ID: " + UserIDA
  If MultiByteToWideChar_(#CP_ACP, #MB_PRECOMPOSED, @UserIDA, -1, @UserIDW, Len(UserIDW))
    Result = NetUserGetInfo_(0, @UserIDW, 10, @UserInfoPointer)
    *UserInfo = UserInfoPointer

    If Result = 0 And *UserInfo <> 0
      If *UserInfo\FullName <> 0
        UserName = Space(256*2)
        
        Result=WideCharToMultiByte_(#CP_ACP, 0, *UserInfo\FullName, -1, @UserName, Len(UserName), 0, 0)
        If Result
          Debug "User-Name: " + UserName
        EndIf
      EndIf
    EndIf

    NetApiBufferFree_(*UserInfo)
  EndIf
EndIf
Rings hat geschrieben:ziert sich nich beim zitieren
Antworten