An assumption is the mother of all fuck-ups
Het hoeft niet heel ingewikkeld te zijn, als je maar weet met welke termen je waar moet zoeken.
Als je op MSDN van Microsoft zoekt, krijg je een heel nuttig draadje
Ja, ik heb het één en ander in de MSDN gelezen, ik weet alleen niet hoe ik deze code (werkend) in delphi kan kloppen. Ik vond deze functies:curry684 schreef op 04 februari 2004 @ 13:37:
Je hebt vast de MSDN docs over GetUserName al grondig doorgelezen?
Windows.GetUserNameA
Windows.GetUserNameW
Windows.GetUserName
Alleen om de uitvoer in een String te krijgen...
Groet Ronald
An assumption is the mother of all fuck-ups
1
2
3
4
| BOOL GetUserName( LPTSTR lpBuffer, LPDWORD nSize ); |
En als je dan nog in het Example kijkt, moet het niet te missen zijn!Parameters
lpBuffer
[out] Pointer to the buffer to receive the null-terminated string containing the user's logon name. If this buffer is not large enough to contain the entire user name, the function fails. A buffer size of (UNLEN + 1) characters will hold the maximum length user name including the terminating null character. UNLEN is defined in Lmcons.h.
Return Values
If the function succeeds, the return value is a nonzero value, and the variable pointed to by nSize contains the number of TCHARs copied to the buffer specified by lpBuffer, including the terminating null character.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
We adore chaos because we like to restore order - M.C. Escher
Ik zette 'grondig' niet voor niets bold, met GetUserName kun je alleen de 'afkorting' of 'loginname' opvragen. De 'Full name' is een extended property.DjRp schreef op 04 februari 2004 @ 13:56:
[...]
Ja, ik heb het één en ander in de MSDN gelezen, ik weet alleen niet hoe ik deze code (werkend) in delphi kan kloppen. Ik vond deze functies:
Windows.GetUserNameA
Windows.GetUserNameW
Windows.GetUserName
nu maak ik het wel erg duidelijk
Grote vriend Curry,curry684 schreef op 04 februari 2004 @ 14:04:
[...]
Ik zette 'grondig' niet voor niets bold, met GetUserName kun je alleen de 'afkorting' of 'loginname' opvragen. De 'Full name' is een extended property.
nu maak ik het wel erg duidelijk
Ik heb dit geprobeerd:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| const NameUnknown = 0; // Unknown name type. NameFullyQualifiedDN = 1; // Fully qualified distinguished name NameSamCompatible = 2; // Windows NT® 4.0 account name NameDisplay = 3; // A "friendly" display name NameUniqueId = 6; // GUID string that the IIDFromString function returns NameCanonical = 7; // Complete canonical name NameUserPrincipal = 8; // User principal name NameCanonicalEx = 9; NameServicePrincipal = 10; // Generalized service principal name DNSDomainName = 11; // DNS domain name, plus the user name procedure GetUserNameEx(NameFormat: DWORD; lpNameBuffer: LPSTR; nSize: PULONG); stdcall; external 'secur32.dll' Name 'GetUserNameExA'; function LoggedOnUserNameEx(fFormat: DWORD): string; var UserName: array[0..250] of char; Size: DWORD; begin Size := 250; GetUserNameEx(fFormat, @UserName, @Size); Result := UserName; end; procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text := LoggedOnUserNameEx(NameDisplay); end; |
Ik krijg er nu alleen een getalletje (1) uit...
Met de functie LoggedOnUserNameEx(NameSamCompatible) krijg ik
wel de gebruikersnaam maar niet de volledige. (domein/gebruikersnaam)
Groet Ronald
An assumption is the mother of all fuck-ups
Waarom check je de returnvalue van GetUserNameEx niet?DjRp schreef op 04 februari 2004 @ 14:17:
[...]
Ik krijg er nu alleen een getalletje (1) uit...
Met de functie LoggedOnUserNameEx(NameSamCompatible) krijg ik
wel de gebruikersnaam maar niet de volledige. (domein/gebruikersnaam)
Groet Ronald
Overigens staat er nog een nuttige link in mijn vorige post, voor als je de full name niet uit je domein wil halen.
Daar moet je het domain voor weten, met GetUserNameEx(NameDisplay, ...) krijg je gewoon de display/full nameOZ-Gump schreef op 04 februari 2004 @ 14:23:
Zal ik dan mijn nuttige linkje maar eens een keer IN CAPS neerzetten...? Misschien dat hij dan gezien wordt.
GetUserNameEx is in dit geval toch een procedure? Heeft toch geen return value en zo wel waar haal ik die vandaan dan?curry684 schreef op 04 februari 2004 @ 14:20:
[...]
Waarom check je de returnvalue van GetUserNameEx niet?
An assumption is the mother of all fuck-ups
*kuch*DjRp schreef op 04 februari 2004 @ 14:45:
[...]
GetUserNameEx is in dit geval toch een procedure? Heeft toch geen return value en zo wel waar haal ik die vandaan dan?
*kuch*BOOLEAN GetUserNameEx(
EXTENDED_NAME_FORMAT NameFormat,
LPTSTR lpNameBuffer,
PULONG nSize);
Parameters
NameFormat
[in] Format of the name. This parameter is a value from the EXTENDED_NAME_FORMAT enumeration type. It cannot be NameUnknown.
lpNameBuffer
[out] Pointer to a buffer that receives the name in the specified format. The buffer must include space for the terminating null character.
PS: waarom zet je de size voor de buffer handmatig? Waarom gebruik je SizeOf niet? En de laatste keer dat ik keek was 0 tot en met 250 nog 251...
[ Voor 19% gewijzigd door OZ-Gump op 04-02-2004 14:53 ]
Wat doe ik nu in de bovenstaande code verkeerd dan? De uitvoer gaat toch met een pointer (@UserName) naar de variabele UserName (array of char) waar de result van de functie aan gelijk wordt?
Of wordt ik nu gek?
Eer aan de gene die met een duidelijke oplossing komt (stukje (pascal) code of zo) i.p.v. MSDN (C) gezwijmel...
An assumption is the mother of all fuck-ups
GetUserNameEx heeft een return value, en jij maakt er een procedure van.DjRp schreef op 04 februari 2004 @ 14:55:
[...]
Wat doe ik nu in de bovenstaande code verkeerd dan? De uitvoer gaat toch met een pointer (@UserName) naar de variabele UserName (array of char) waar de result van de functie aan gelijk wordt?
Of wordt ik nu gek?
Hou de eer aan jezelf en lees alle hints, tips en documentatie die nu gegeven is. Als je dan nog niet in staat bent om GetUserNameEx te gebruiken dan lijkt het me beter om te stoppen met programmerenEer aan de gene die met een duidelijke oplossing komt (stukje (pascal) code of zo) i.p.v. MSDN (C) gezwijmel...
"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney
Het is geen MSDN (C) gezwijmel, het is De Alomvattende Win32 API. Die kun je beter goed leren lezen ipv dat wij het voorkauwen, want als je zelf niets van Win32 wil weten of hoe je het moet gebruiken kun je idd beter stoppen met Delphi programmerenDjRp schreef op 04 februari 2004 @ 14:55:
[...]
Eer aan de gene die met een duidelijke oplossing komt (stukje (pascal) code of zo) i.p.v. MSDN (C) gezwijmel...
Enige voorwaarde is wel dat, wanneer deze gegevens ingegeven zijn op de server, jij verbinding hebt met de server. Wanneer de gegevens lokaal staan (local user management dus) is er volgens mij niets aan de hand.
Ik dacht dat dit forum enigzins iemand kon helpen met een bepaald probleem. Er worden dan ook genoeg hints en uitleg gegeven, maar op het moment dat iemand het dan nog niet goed begrijpt wordt je de grond in getrapt... Erg jammer.curry684 schreef op 04 februari 2004 @ 15:16:
[...]
Het is geen MSDN (C) gezwijmel, het is De Alomvattende Win32 API. Die kun je beter goed leren lezen ipv dat wij het voorkauwen, want als je zelf niets van Win32 wil weten of hoe je het moet gebruiken kun je idd beter stoppen met Delphi programmeren
Ik heb het idee dat ik er bijna ben, de code ligt dan ook op het puntje van mn beeldscherm. Is er nog iemand die enigzins wel een *vriendelijk* advies kan geven?
Met vriendelijk groet,
Ronald.
An assumption is the mother of all fuck-ups
Kijk eens goed naar de hints die er gegeven zijn. (SizeOf, GetUserNameEx, controles). En als het daarmee niet lukt...
- Geef de relevante code (tenzij dit alles is) en geef aan waar het vastloopt.
- Zet breakpoints in je code en kijk welke waarde je variabelen hebben.
- Probeer het uit op meer dan 1 systeem.
- Vermeld het OS waarop je de code probeert uit te voeren en zoek naar verwante onderwerpen op GoT en groups.google.com
Nou ja, jij hebt lefDjRp schreef op 04 februari 2004 @ 15:24:
[...]
Ik dacht dat dit forum enigzins iemand kon helpen met een bepaald probleem. Er worden dan ook genoeg hints en uitleg gegeven, maar op het moment dat iemand het dan nog niet goed begrijpt wordt je de grond in getrapt... Erg jammer.
Ik heb het idee dat ik er bijna ben, de code ligt dan ook op het puntje van mn beeldscherm. Is er nog iemand die enigzins wel een *vriendelijk* advies kan geven?
Er besteden hier 4+ mensen een hoop tijd om je zo ver mogelijk in de goede richting te sturen zonder de feitelijke code voor je te schrijven, en vervolgens pik jij echt meer dan TIEN subtiele hints niet op en ga je ons voor onvriendelijke n00bbashers of zo uit zitten maken omdat we je code niet schrijven?
* curry684 noteert user die geen hulp meer gaat krijgen van ondergetekende
Meneer Curry,curry684 schreef op 04 februari 2004 @ 16:23:
[...]
Nou ja, jij hebt lef
Er besteden hier 4+ mensen een hoop tijd om je zo ver mogelijk in de goede richting te sturen zonder de feitelijke code voor je te schrijven, en vervolgens pik jij echt meer dan TIEN subtiele hints niet op en ga je ons voor onvriendelijke n00bbashers of zo uit zitten maken omdat we je code niet schrijven?
* curry684 noteert user die geen hulp meer gaat krijgen van ondergetekende
Op dit moment heb ik zo'n 4 uur besteed aan het verkrijgen van de volledige gebruikers naam. Ik heb behoorlijk veel doorgelezen en bestudeerd en ik verwacht ook niet dat iemand code voor mij gaat opschrijven. Bij het testen krijg ik alleen telkens een waarde "1" terug. Ik heb ook gelezen dat het opvragen van de volledige gebruikers naam moet werken met een NT4 domein (waar ik op draai met een W2k bak). Maar ik twijfel er aan, want de procedure zoals ik boven heb op geschreven (en dat is alles) werkt wel met de waarde "NameSamCompatible".
Ik krijg dus ook geen foutmeldingen of iets dergelijke.
Excuses voor gedrag
Ronald.
[ Voor 7% gewijzigd door RpR op 04-02-2004 16:56 ]
An assumption is the mother of all fuck-ups
Een goeie! Maar het is het niet... Wanneer ik "NameSamCompatible" gebruik krijg ik de waarde "DENBOER\SYSOP" (domein: denboer, username: sysop).OZ-Gump schreef op 04 februari 2004 @ 16:56:
Kijk voor de grap eens wat er bij de voledige gebruikersnaam staat ingevuld in het domein.... Toch niet toevallig '1', omdat bij installatie die optie niet zo nuttig leek...?
Wanneer ik met een beheer tool zoals Hyena, of op de NT4 Server zelf kijk, staat er onder Full name: "System Operator".
En tevens worden bij alle andere waardes zoals "DNSDomainName" of "NameFullyQualifiedDN" ook de waarde 1 terug gelanceerd.
An assumption is the mother of all fuck-ups
Niet als flame bedoeld, maar ik zal je even een quote uit de algemene FAQ geven:
Met deze melding doe ik je dus automatisch de groetenWij tweakers doen elkaar permanent de groeten. Het is dus niet nodig om steeds ruimteverspillende "greetz [user]" of iets dergelijks onder je post te plakken. Als je perse zoiets wilt kun je daar je signature voor gebruiken (zie latere uitleg).
Een goede grap mag vrienden kosten.
1
2
3
4
5
6
7
8
9
10
11
| function GetLoginName: string; var buffer: array[0..255] of char; size: dword; begin size := 256; if GetUserName(buffer, size) then Result := buffer else Result := '' end; |
[ Voor 3% gewijzigd door sn0x0r op 30-05-2019 22:49 ]
1
2
3
4
5
6
7
8
9
| char l_Buffer[256]; ULONG l_Long = 256; for(int i = 0; i <= 12; i++) { if(!GetUserNameExA((EXTENDED_NAME_FORMAT)i, l_Buffer, &l_Long)) printf("%d failed with error %d\n", i, GetLastError()); else printf("%d : %s\n", i, l_Buffer); } |
Produceert als output:
1
2
3
4
5
6
7
8
9
10
11
12
13
| 0 failed with error 1332 1 failed with error 1332 2 : LUCIFER\Niels 3 failed with error 1332 4 failed with error 1332 5 failed with error 1332 6 failed with error 1332 7 failed with error 1332 8 failed with error 1332 9 failed with error 1332 10 failed with error 1332 11 failed with error 1332 12 failed with error 1332 |
En error 1332 is: "No mapping between account names and security IDs was done."
Dat klopt ook met de documentatie van GetUserNameEx, die netjes zegt:
Alleen geen idee hoe je dat oplost...If the user name is not available in the specified format, the error is ERROR_NONE_MAPPED. If the domain controller is not available to perform the lookup, the error is ERROR_NO_SUCH_DOMAIN.
Verwijderd
JaDjRp schreef op 04 februari 2004 @ 13:26:
Is het mogelijk om via een bepaalde weg de VOLLE naam van de ingelogde (WinNT/2000) gebruiker op te vragen?
uhhIk heb genoeg mogelijkheden gevonden om de huidig ingelogde gebruikersnaam op te vragen (is vaak een afkorting). Maar bij een Windows NT domein gebruiker kan ook "Full name" worden ingevuld en hier valt weinig over te vinden...
NetUserGetInfo
"If you're using Windows NT/2000/XP, you can retrieve user account
information using the NetUserGetInfo function. You should request a
level of at least 2, which contains the user's full name."
Google framework voorbeeld code
[ Voor 37% gewijzigd door Verwijderd op 04-02-2004 23:55 ]
Naar een "lange nacht" (en wat hulp van Sinaasappelsap's code) heb ik een projectje kunnen bouwen met een goed werkende functie die aan de hand van de username en de PDC de volledige gebruikersnaam teruggeeft!
Het werkt alleen helaas alleen maar op een W2k machine, niet op een NT4 station!
Sinaasappel:
Curry: Bedankt voor alle hulp...
[ Voor 117% gewijzigd door RpR op 05-02-2004 20:08 . Reden: Probleem nog niet opgelost! ]
An assumption is the mother of all fuck-ups
Kan je niet alleen je code neerzetten die de full-name grabbed ?
The best thing about UDP jokes is that I don't care if you get them or not.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| type
PUserInfo2 = ^TUserInfo2;
TUserInfo2 = packed record
usri2_name: PWideChar;
usri2_password: PWideChar;
usri2_password_age: DWORD;
usri2_priv: DWORD;
usri2_home_dir: PWideChar;
usri2_comment: PWideChar;
usri2_flags: DWORD;
usri2_script_path: PWideChar;
usri2_auth_flags: DWORD;
usri2_full_name: PWideChar;
usri2_usr_comment: PWideChar;
usri2_parms: PWideChar;
usri2_workstations: PWideChar;
usri2_last_logon: DWORD;
usri2_last_logoff: DWORD;
usri2_acct_expires: DWORD;
usri2_max_storage: DWORD;
usri2_units_per_week: DWORD;
usri2_logon_hours: PBYTE;
usri2_bad_pw_count: DWORD;
usri2_num_logons: DWORD;
usri2_logon_server: PWideChar;
usri2_country_code: DWORD;
usri2_code_page: DWORD;
end; |
Dan de functie:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| function GetFullUserName(UsernameW: widestring; ComputerNameW: widestring): String;
begin
NetApiLibrary := LoadLibrary('netapi32.dll');
if NetApiLibrary <> 0 then
begin
try
@NetUserGetInfo := GetProcAddress(NetApiLibrary, 'NetUserGetInfo');
@NetApiBufferFree := GetProcAddress(NetApiLibrary, 'NetApiBufferFree');
if (@NetUserGetInfo <> nil) and (@NetApiBufferFree <> nil) then
begin
NetResult := NetUserGetInfo(PWideChar(ComputerNameW), PWideChar(UserNameW), 2, UserInfo);
try
Result := PWideChar(PUserInfo2(UserInfo)^.usri2_full_name);
NetApiBufferFree(UserInfo);
except
Result := 'Error getting userinfo';
end;
end;
finally
FreeLibrary(NetApiLibrary);
end;
end;
end; |
Alleen het blijkt helaas dat dit niet werkt op een NT4 station!
Wel werkt het op een W2k bak in combinatie met een NT4 domein...
Iemand een verklaring?
An assumption is the mother of all fuck-ups
Het heeft te maken met de API's van je Operating System, aangezien die toch per OS veranderen, en ze de indeling van login structuur ook altijd weer veranderen, hebben ze dus per OS een functie/procedure die deze kan aanroepen.
LoadLibrary('netapi32.dll'); <-- gebruik je voor vele andere dingen, en als ik me niet vergis zit deze alleen in 2000 en hoger. Maar dat weet ik niet zeker.
Dan kan je het wel met nt 4.0 doen.
The best thing about UDP jokes is that I don't care if you get them or not.
NetApi32.dll wordt ook wel gebruikt door NT4 (misschien alleen SP6), maar deze versie verschilt logischerwijs met de dll van W2k. De foutmelding geeft ook aan dat de aangeroepen functie niet werkt/bestaat.sn0x0r schreef op 05 februari 2004 @ 22:16:
LoadLibrary('netapi32.dll'); <-- gebruik je voor vele andere dingen, en als ik me niet vergis zit deze alleen in 2000 en hoger. Maar dat weet ik niet zeker.
Is er ergens informatie te vinden over de NT4 versie van deze dll?
Misschien op MSDN?
An assumption is the mother of all fuck-ups