Username ermitteln (Kein "Getusername_"!)

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

Beitrag von CNESM »

@ All
CNESM,

ein weiterer möglicher Versuch: bitte ändere in jpds letztem Beispiel einmal "USERDOMAIN" in "USERDNSDOMAIN" ab...
Dein Tipp war Gold wert! So geht es! Zwar rödelt das Programm ein paar Sekunden, aber dann spuckt er den Usernamen aus! Klasse!!

Code: Alles auswählen

EnableExplicit 


Define NameLength.I 
Define Result.I 
Define SID.S 
Define SIDSize.I 
Define SIDType.I 
Define UserIDA.S 
Define UserIDW.S 
Define UserName.S 
Define UserInfoPointer.I 
Define *UserInfo.USER_INFO_3 
Define DomainIDA.s 
Define DomainLength.l 
Define DomainIDW.s 

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

DomainIDA = Space(128) 
DomainLength = Len(DomainIDA) 


If InitNetwork() 
  If GetUserName_(@UserIDA, @NameLength) 
    Debug "User-ID = " + UserIDA 
    DomainIDA = GetEnvironmentVariable("USERDNSDOMAIN") 
    UserIDW = Space(256) 
    DomainIDW = Space(256) 
    CompilerIf #PB_Compiler_Unicode 
      DomainIDW=DomainIDA 
      UserIDW=UserIDA 
    CompilerElse 
     MultiByteToWideChar_(#CP_ACP, #MB_PRECOMPOSED, @UserIDA, -1, @UserIDW, Len(UserIDW)) 
      MultiByteToWideChar_(#CP_ACP, #MB_PRECOMPOSED, @DomainIDA, -1, @DomainIDW, Len(DomainIDW)) 
    CompilerEndIf 
    Result = NetUserGetInfo_(@DomainIDW, @UserIDW, 3, @UserInfoPointer) 
    *UserInfo = UserInfoPointer 
    If Result = 0 And *UserInfo <> 0 
      If *UserInfo\FullName <> 0 
        UserName = Space(256) 
        CompilerIf #PB_Compiler_Unicode 
          UserName = PeekS(*UserInfo\FullName) 
        CompilerElse 
          WideCharToMultiByte_(#CP_ACP, 0, *UserInfo\FullName, 128, @UserName, Len(UserName), 0, 0) 
        CompilerEndIf 
        Debug "User-Name = " + UserName 
      EndIf 
    EndIf 
    NetApiBufferFree_(*UserInfo) 
  EndIf 
EndIf 
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hallo Shadrik,

ja damit funktioniert es auch!

egal wo sich der benutzer anmeldet local oder domäne,

wird die variable logonserver immer den richtigen anmelde server zurueckgeben....

also der aufruf

DomainIDA = GetEnvironmentVariable("USERDOMAIN")

ändern in

DomainIDA = GetEnvironmentVariable("LOGONSERVER")

und dann funktioniert es auch.

Ciao
jpd
PB 5.10 Windows 7 x64
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

jpd hat geschrieben:Hallo Shadrik,

ja damit funktioniert es auch!

egal wo sich der benutzer anmeldet local oder domäne,

wird die variable logonserver immer den richtigen anmelde server zurueckgeben....

also der aufruf

DomainIDA = GetEnvironmentVariable("USERDOMAIN")

ändern in

DomainIDA = GetEnvironmentVariable("LOGONSERVER")

und dann funktioniert es auch.

Ciao
jpd
Damit läuft es sogar ein paar Sekunden schneller und fängt gleich verschiedene Anemeldungsmöglichkeiten (Local oder Domäne) ab. Spitze!
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

@CNESM,

funktioniert mit userdnsdomain und mit logonserver.

Ciao
jpd
PB 5.10 Windows 7 x64
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

@ jpd

Achso :mrgreen: Also ist es egal, was man verwendet? (Nur interessehalber)
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hi CNESM,

richtig ist auf jeden fall logonserver!

du hast ja auch geschrieben warum es so ist. :wink:
Damit läuft es sogar ein paar Sekunden schneller und fängt gleich verschiedene Anemeldungsmöglichkeiten (Local oder Domäne) ab. Spitze!
Ciao jpd
PB 5.10 Windows 7 x64
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

Schön, daß wir es endlich gemeinsam hinbekommen haben... :allright:
jpds letztes Beispiel funktioniert auch bei mir (Anmeldung an einem Novell Netwareserver), wenn ich statt der Umgebungsvariablen USERDNSDOMAIN die Umgebungsvariable LOGONSERVER verwende.

Ein bißchen Unbehagen bereitet mir die Verwendung der Umgebungsvariablen. USERDOMAIN und USERDNSDOMAIN ist auf meinem PC z.B. überhaupt nicht definiert, LOGONSERVER aber schon. Was ist aber in Installationen, in denen LOGONSERVER auch nicht definiert ist oder etwas anders benannt ist? Wenn wir jetzt noch über einen API-Aufruf den Namen eines Logonservers ermitteln könnten, haben wir vollständig gewonnen. :wink:
(Bei mir ist der in LOGONSERVER enthaltene Name übrigens identisch mit dem von HostName() zurückgegebenen PC-Namen...)
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hallo Shadrik,


Schön, daß wir es endlich gemeinsam hinbekommen haben...
allerdings, das macht spass :-)

die variable logonserver existiert immer (ab NT).

und diese ist gleich den computername wenn der benutzer local

angemeldet ist.

dadurch ziemlich sicher.

ich habe auch ein code... benötigt ein bisshien anpassungen ...

der gibt alle anmeldeserver im netz aus...

ich hab es so geändert das er mir nur den ersten eintrag (für die eigene domäne) zurueckgibt.

funktioniert zurzeit nur in unicode modus..

Ciao
jpd

Code: Alles auswählen



Structure SERVER_INFO_101      
  dwPlatformId.l      
  lpszServerName.l      
  dwVersionMajor.l      
  dwVersionMinor.l      
  dwType.l      
  lpszComment.l
EndStructure

#MAX_PREFERRED_LENGTH=-1
#NERR_SUCCESS                      = 0
#ERROR_MORE_DATA                   = 234
#SV_TYPE_DOMAIN_ENUM               = $80000000
#SV_TYPE_WORKSTATION =1
#SV_TYPE_DOMAIN_CTRL=8;0x00000008

Procedure.s GetServerList(sv101_type.l) 

  
    
  Dim *buffon(1)
  nStructSize = SizeOf(SERVER_INFO_101)
  
  RetCode = NetServerEnum_(0, 101, @*buffer, #MAX_PREFERRED_LENGTH, @dwEntriesread, @dwTotalentries, sv101_type, 0, @dwResumehandle)
  If RetCode = #NERR_SUCCESS And RetCode <> #ERROR_MORE_DATA  ;Loop through And the Data in the memory 
    For cnt = 0 To dwEntriesread - 1  
    ReDim *buffon(dwEntriesread-1)
      *buffon(cnt)=*buffer +nStructSize*cnt
      *se101.SERVER_INFO_101=*buffon(cnt)
        NetApiBufferFree_(*buffer)
         ;Debug PeekS(*se101\lpszServerName)
         ProcedureReturn  PeekS(*se101\lpszServerName)
    Next
  EndIf
  NetApiBufferFree_(*buffer)
  
EndProcedure


Debug GetServerList(#SV_TYPE_DOMAIN_CTRL)

PB 5.10 Windows 7 x64
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

Da haben wir unsere NetServerEnum_ Funktion @ bobobo :mrgreen:

Mit der net Funktion erhalte ich als Rückgabewert nur ein "H"?!?!
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hi CNESM,

Mit der net Funktion erhalte ich als Rückgabewert nur ein "H"?!?!
unicode on?
PB 5.10 Windows 7 x64
Antworten