Username ermitteln (Kein "Getusername_"!)

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

Beitrag von CNESM »

@ Shardik

Um die Sachen nach deiner Art und Weise (also ohne CMD) nutzen zu können, müsste man doch folgende Funktionen verwenden oder?

NetServerEnum_
NetServerGETInfo_
NetShareEnum_
NetUseEnum_
NetUseGetInfo_
NetUserGetInfo_
NetWkstaGetInfo_
NetWkstaUserGetInfo_

Ist jetzt nur eine theoretische Vermutung ....
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

CNESM hat geschrieben:...

Ist jetzt nur eine theoretische Vermutung ....
danke dafür :bounce:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

CNESM hat geschrieben:Ich hab mal ein bissle mit der Funktion NetUserGetInfo_() und den neuen Erkenntnissen rumgespielt, aber trotzdem keine Ausgabe des FullRealNames erwirken können. Vielleicht man ich auch nur wieder etwas falsch :freak:
Ich habe mein Beispiel noch einmal erweitert und ermittle nun mit LookupAccountName() zunächst den Domänennamen, um ihn dann beim NetUserGetInfo()-Aufruf vor die User-ID setzen zu können. Dabei habe ich festgestellt, daß bei fehlender Domänenmitgliedschaft einfach der PC-Name (Workstation-Name) als Domänenname zurückgegeben wird. Dieser PC-Name als vorangestellter Domänenname funktioniert allerdings nicht. Deshalb prüfe ich ab, ob der zurückgegebene Domänenname identisch ist mit dem PC-Namen ist und lasse den Domänen-/PC-Namen in diesem Fall weg. Es wäre aber interessant zu wissen, ob meine Lösung nun auch tatsächlich mit einem korrekt zurückgegebenen Domänennamen funktioniert...

Code: Alles auswählen

EnableExplicit

Define DomainName.S
Define DomainNameSize.I
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

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

If InitNetwork()
  If GetUserName_(@UserIDA, @NameLength)
    Debug "User-ID = " + UserIDA

    ; BOOL LookupAccountName(
    ;     LPCTSTR lpSystemName,	         // address of string for system name
    ;     LPCTSTR lpAccountName,	        // address of string for account name
    ;     PSID Sid,	                     // address of security identifier
    ;     LPDWORD cbSid,	                // address of size of security identifier
    ;     LPTSTR ReferencedDomainName,	  // address of string for referenced domain 
    ;     LPDWORD cbReferencedDomainName,  // address of size of domain string
    ;     PSID_NAME_USE peUse 	          // address of SID-type indicator
    ;    );

    LookupAccountName_(0, @UserIDA, @SID, @SIDSize, @DomainName, @DomainNameSize, @SIDType)

    SID = Space(SIDSize)
    DomainName = Space(DomainNameSize)

    If LookupAccountName_(0, @UserIDA, @SID, @SIDSize, @DomainName, @DomainNameSize, @SIDType)
      Debug "Domänen-Name = " + DomainName
      Debug "PC-Name = " + Hostname()

      If DomainName <> Hostname()
        UserIDA = DomainName + "" + UserIDA
        Debug "User-ID mit vorangestelltem Domänennamen: " + UserIDA
      EndIf

      UserIDW = Space(256)

      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, 128, @UserName, Len(UserName), 0, 0)
              Debug "User-Name = " + UserName
            EndIf
          EndIf
        EndIf

        NetApiBufferFree_(*UserInfo)
      EndIf
    EndIf
  EndIf
EndIf
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hi,

der computername bzw. domainname ist als erster parameter bei
NetUserGetInfo zu übergeben..

anbei eine variante das den vollständigen Name des angemeldeten benutzer ermittlelt.

Ciao
jpd

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("USERDOMAIN")
    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 
  
  

PB 5.10 Windows 7 x64
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

Hallo jpd,

vielen Dank für Deinen Hinweis, daß der Domainname bei NetUserGetInfo() als erster Parameter übergeben werden muß. :allright:
Manchmal sehe ich den Wald vor lauter Bäumen nicht :oops:
Ich bin durch "net user xxx /domain" auf die falsche Fährte gelockt worden, weil CNESM hier ja bei der User-ID seine Domain voranstellen mußte...

Dein Beispiel läuft bei mir im Firmennetzwerk mit Novell Anmeldeserver ohne Änderungen einwandfrei. Ich habe mir erlaubt, auch mein Beispiel noch einmal anzupassen, das sich eigentlich nur von Deinem unterscheidet, indem der Domain-/PC-Name nicht über die Umgebungsvariable USERDOMAIN sondern über LookupAccountName() ermittelt wird.

Code: Alles auswählen

EnableExplicit

Define DomainNameA.S
Define DomainNameW.S
Define DomainNameSize.I
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

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

If InitNetwork()
  If GetUserName_(@UserIDA, @NameLength)
    Debug "User-ID = " + UserIDA
    LookupAccountName_(0, @UserIDA, @SID, @SIDSize, @DomainNameA, @DomainNameSize, @SIDType)
    SID = Space(SIDSize)
    DomainNameA = Space(DomainNameSize)

    If LookupAccountName_(0, @UserIDA, @SID, @SIDSize, @DomainNameA, @DomainNameSize, @SIDType)
      Debug "Domänen-Name = " + DomainNameA
      DomainNameW = Space(256)
      UserIDW = Space(256)

      If MultiByteToWideChar_(#CP_ACP, #MB_PRECOMPOSED, @DomainNameA, -1, @DomainNameW, Len(DomainNameW))
        If MultiByteToWideChar_(#CP_ACP, #MB_PRECOMPOSED, @UserIDA, -1, @UserIDW, Len(UserIDW))
          Result = NetUserGetInfo_(@DomainNameW, @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, 128, @UserName, Len(UserName), 0, 0)
                Debug "User-Name = " + UserName
              EndIf
            EndIf
          EndIf

          NetApiBufferFree_(*UserInfo)
        EndIf
      EndIf
    EndIf
  EndIf
EndIf
Zuletzt geändert von Shardik am 12.02.2009 09:17, insgesamt 1-mal geändert.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

Gute morgen jpd und Shardik,

eure beiden Beispiele sehen schon mal nicht schlecht aus, funktionieren aber wie meine Beispiele ebenfalls nicht bei der Ausgabe des User-Namens.

@ Shardik

Bei deinen Beispiel erhalte ich weiterhin nur meine ID, der Username wird nicht ausgegeben.

@ jpd

Hier bekomme ich die erste drei Angaben ausgegeben:
User-ID = P46789
Domänen-Name = 123_ADS
PC-Name = HH00408D
User-ID mit vorangestelltem Domänennamen: 123_ADS\P46789
Aber auch hier keine Ausgabe des "User-Name"
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

Hallo CNESM,

wenn jpds Beispiel nicht funktioniert, wird auch mein letztes Beispiel bei Dir nicht funktionieren... :|
Setze bitte einmal zur Problemeingrenzung hinter den NetUserGetInfo()-Aufruf ein "Debug Result" und gebe uns dann in Deinem nächsten Posting den Wert an.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

CNESM,

ein weiterer möglicher Versuch: bitte ändere in jpds letztem Beispiel einmal "USERDOMAIN" in "USERDNSDOMAIN" ab...
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hallo Ihr beiden :-)

sorry aber was ich gestern abend gemacht habe ist falsch! :oops:

leider hatte ich keine domäne zum testen..



man kann der funktion netusergetinfo,

als erster parameter den servername weitergeben und nicht die domäne,

habe kurz ein test gemacht als 1 parameter den name des anmeldeserver und als user einfach den username

und das klappt...

auf meiner platte liegt bestimmt so nen "schnippsel" wie man

aus den domainname den anmeldename des server zurueckgibt...

melde mich später nochmal

Ciao
jpd
PB 5.10 Windows 7 x64
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

jpd hat geschrieben:man kann der funktion netusergetinfo,

als erster parameter den servername weitergeben und nicht die domäne
Ich hatte auch den Eindruck, daß ich wohl nach Deinem Posting des Beispiel-Codes etwas zu euphorisch war :wink: (weil es bei mir auch auf Anhieb lief). Beim erneuten Blick in die MSDN-Beschreibung kamen auch mir dann wieder die ersten Zweifel:
MSDN hat geschrieben:NetUserGetInfo Function

The NetUserGetInfo function retrieves information about a particular user account on a server.
Syntax

NET_API_STATUS NetUserGetInfo(
__in LPCWSTR servername,
__in LPCWSTR username,
__in DWORD level,
__out LPBYTE *bufptr
);

Parameters

servername [in]
A pointer to a constant string that specifies the DNS or NetBIOS name of the remote server on which the function is to execute. If this parameter is NULL, the local computer is used.

Windows NT: This string must begin with \\.

username [in]
A pointer to a constant string that specifies the name of the user account for which to return information. For more information, see the following Remarks section.
...
jpd hat geschrieben:auf meiner platte liegt bestimmt so nen "schnippsel" wie man

aus den domainname den anmeldename des server zurueckgibt...
Vielleicht sollte CNESM einmal versuchen, beim NetUserGetInfo()-Aufruf als 1.Parameter den Namen seines Anmelde-Servers zu übergeben. Dies wäre laut seiner Umgebungsvariablen LOGONSERVER die Zeichenkette "\\HHW3T05"...
Antworten