I use GetUserNameEx() as well.
If that fails, or is unavailable, I fallback to WMI instead. I use GetUserName() and LookupAccountName() to get domain and username, and then query the FullName from the Win32_UserAccount table.
Also look at NetGetUserInfo() with level=10 (other levels also have a full name as well).