Index: libads/ads_struct.c =================================================================== --- libads/ads_struct.c (revision 13634) +++ libads/ads_struct.c (working copy) @@ -139,6 +139,7 @@ SAFE_FREE((*ads)->schema.sfu_gidnumber_attr); SAFE_FREE((*ads)->schema.sfu_shell_attr); SAFE_FREE((*ads)->schema.sfu_homedir_attr); + SAFE_FREE((*ads)->schema.sfu_gecos_attr); ZERO_STRUCTP(*ads); Index: libads/ldap.c =================================================================== --- libads/ldap.c (revision 13634) +++ libads/ldap.c (working copy) @@ -2628,7 +2630,7 @@ { BOOL ret = False; TALLOC_CTX *ctx = NULL; - const char *gidnumber, *uidnumber, *homedir, *shell; + const char *gidnumber, *uidnumber, *homedir, *shell, *gecos; ctx = talloc_init("ads_check_sfu_mapping"); if (ctx == NULL) @@ -2654,6 +2656,11 @@ goto done; ads->schema.sfu_shell_attr = SMB_STRDUP(shell); + gecos = ads_get_attrname_by_oid(ads, ctx, ADS_ATTR_SFU_GECOS_OID); + if (gecos == NULL) + goto done; + ads->schema.sfu_gecos_attr = SMB_STRDUP(gecos); + ret = True; done: if (ctx) Index: nsswitch/winbindd_ads.c =================================================================== --- nsswitch/winbindd_ads.c (revision 13634) +++ nsswitch/winbindd_ads.c (working copy) @@ -153,7 +157,8 @@ "name", "objectSid", "primaryGroupID", "sAMAccountType", ADS_ATTR_SFU_HOMEDIR_OID, - ADS_ATTR_SFU_SHELL_OID, + ADS_ATTR_SFU_SHELL_OID, + ADS_ATTR_SFU_GECOS_OID, NULL}; int i, count; ADS_STATUS rc; @@ -193,7 +198,7 @@ i = 0; for (msg = ads_first_entry(ads, res); msg; msg = ads_next_entry(ads, msg)) { - char *name, *gecos; + char *name, *gecos = NULL; char *homedir = NULL; char *shell = NULL; uint32 group; @@ -206,13 +211,19 @@ } name = ads_pull_username(ads, mem_ctx, msg); - gecos = ads_pull_string(ads, mem_ctx, msg, "name"); + if (use_nss_info("sfu")) { homedir = ads_pull_string(ads, mem_ctx, msg, ads->schema.sfu_homedir_attr); - shell = ads_pull_string(ads, mem_ctx, msg, - ads->schema.sfu_shell_attr); + shell = ads_pull_string(ads, mem_ctx, msg, + ads->schema.sfu_shell_attr); + gecos = ads_pull_string(ads, mem_ctx, msg, + ads->schema.sfu_gecos_attr); } + + if (gecos == NULL) { + gecos = ads_pull_string(ads, mem_ctx, msg, "name"); + } if (!ads_pull_sid(ads, msg, "objectSid", &(*info)[i].user_sid)) { @@ -437,7 +448,8 @@ "name", "primaryGroupID", ADS_ATTR_SFU_HOMEDIR_OID, - ADS_ATTR_SFU_SHELL_OID, + ADS_ATTR_SFU_SHELL_OID, + ADS_ATTR_SFU_GECOS_OID, NULL}; ADS_STATUS rc; int count; @@ -475,15 +487,20 @@ } info->acct_name = ads_pull_username(ads, mem_ctx, msg); - info->full_name = ads_pull_string(ads, mem_ctx, msg, "name"); if (use_nss_info("sfu")) { - info->homedir = ads_pull_string(ads, mem_ctx, msg, - ads->schema.sfu_homedir_attr); - info->shell = ads_pull_string(ads, mem_ctx, msg, - ads->schema.sfu_shell_attr); + info->homedir = ads_pull_string(ads, mem_ctx, msg, + ads->schema.sfu_homedir_attr); + info->shell = ads_pull_string(ads, mem_ctx, msg, + ads->schema.sfu_shell_attr); + info->full_name = ads_pull_string(ads, mem_ctx, msg, + ads->schema.sfu_gecos_attr); } + if (info->full_name == NULL) { + info->full_name = ads_pull_string(ads, mem_ctx, msg, "name"); + } + if (!ads_pull_uint32(ads, msg, "primaryGroupID", &group_rid)) { DEBUG(1,("No primary group for %s !?\n", sid_string_static(sid))); Index: include/ads.h =================================================================== --- include/ads.h (revision 13634) +++ include/ads.h (working copy) @@ -48,6 +48,7 @@ char *sfu_shell_attr; char *sfu_uidnumber_attr; char *sfu_gidnumber_attr; + char *sfu_gecos_attr; } schema; } ADS_STRUCT; @@ -99,6 +100,7 @@ #define ADS_ATTR_SFU_GIDNUMBER_OID "1.2.840.113556.1.6.18.1.311" #define ADS_ATTR_SFU_HOMEDIR_OID "1.2.840.113556.1.6.18.1.344" #define ADS_ATTR_SFU_SHELL_OID "1.2.840.113556.1.6.18.1.312" +#define ADS_ATTR_SFU_GECOS_OID "1.2.840.113556.1.6.18.1.337" /* ldap bitwise searches */ #define ADS_LDAP_MATCHING_RULE_BIT_AND "1.2.840.113556.1.4.803"