Username ermitteln (Kein "Getusername_"!)
@ 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 ....
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 ....
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...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![]()
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
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
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
Hallo jpd,
vielen Dank für Deinen Hinweis, daß der Domainname bei NetUserGetInfo() als erster Parameter übergeben werden muß.
Manchmal sehe ich den Wald vor lauter Bäumen nicht
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.
vielen Dank für Deinen Hinweis, daß der Domainname bei NetUserGetInfo() als erster Parameter übergeben werden muß.

Manchmal sehe ich den Wald vor lauter Bäumen nicht

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.
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:
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:
Aber auch hier keine Ausgabe des "User-Name"User-ID = P46789
Domänen-Name = 123_ADS
PC-Name = HH00408D
User-ID mit vorangestelltem Domänennamen: 123_ADS\P46789
Hallo Ihr beiden 
sorry aber was ich gestern abend gemacht habe ist falsch!
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

sorry aber was ich gestern abend gemacht habe ist falsch!

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
Ich hatte auch den Eindruck, daß ich wohl nach Deinem Posting des Beispiel-Codes etwas zu euphorisch warjpd hat geschrieben:man kann der funktion netusergetinfo,
als erster parameter den servername weitergeben und nicht die domäne

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.
...
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"...jpd hat geschrieben:auf meiner platte liegt bestimmt so nen "schnippsel" wie man
aus den domainname den anmeldename des server zurueckgibt...