Seite 5 von 6

Verfasst: 12.02.2009 11:49
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 

Verfasst: 12.02.2009 11:50
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

Verfasst: 12.02.2009 11:52
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!

Verfasst: 12.02.2009 11:53
von jpd
@CNESM,

funktioniert mit userdnsdomain und mit logonserver.

Ciao
jpd

Verfasst: 12.02.2009 11:56
von CNESM
@ jpd

Achso :mrgreen: Also ist es egal, was man verwendet? (Nur interessehalber)

Verfasst: 12.02.2009 12:28
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

Verfasst: 12.02.2009 12:40
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...)

Verfasst: 12.02.2009 12:51
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)


Verfasst: 12.02.2009 13:31
von CNESM
Da haben wir unsere NetServerEnum_ Funktion @ bobobo :mrgreen:

Mit der net Funktion erhalte ich als Rückgabewert nur ein "H"?!?!

Verfasst: 12.02.2009 13:38
von jpd
Hi CNESM,

Mit der net Funktion erhalte ich als Rückgabewert nur ein "H"?!?!
unicode on?