r14457: Add a few more special cases for RID 513 in the samr code.
authorGerald Carter <jerry@samba.org>
Wed, 15 Mar 2006 17:40:28 +0000 (17:40 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:15:31 +0000 (11:15 -0500)
Now that I know what all the requirements for this group are
I can generalize the code some more and make it cleaner.
But at least this is working with lusrmgr.msc on XP and 2k now.
(This used to be commit d2c1842978cd50485849bfc4fb6d94767d96cab0)

source3/groupdb/mapping.c
source3/passdb/passdb.c
source3/passdb/pdb_interface.c

index 04471f9d43323e2e478a4b625fdba176fec4b714..830584979b5e4708e4f6dc6f723c61b451d985e4 100644 (file)
@@ -814,8 +814,24 @@ BOOL get_domain_group_from_sid(DOM_SID sid, GROUP_MAP *map)
        ret = pdb_getgrsid(map, sid);
        unbecome_root();
        
-       if ( !ret ) 
+       /* special case check for rid 513 */
+       
+       if ( !ret ) {
+               uint32 rid;
+               
+               sid_peek_rid( &sid, &rid );
+               
+               if ( rid == DOMAIN_GROUP_RID_USERS ) {
+                       fstrcpy( map->nt_name, "None" );
+                       fstrcpy( map->comment, "Ordinary Users" );
+                       sid_copy( &map->sid, &sid );
+                       map->sid_name_use = SID_NAME_DOM_GRP;
+                       
+                       return True;
+               }
+               
                return False;
+       }
 
        DEBUG(10, ("get_domain_group_from_sid: SID found in the TDB\n"));
 
index d795888180fba83a96ad8c9c97b6df2072dd6969..876f04bdfe70b24e4c43ce42104e27cbed344ae3 100644 (file)
@@ -548,6 +548,18 @@ BOOL lookup_global_sam_name(const char *user, int flags, uint32_t *rid,
 {
        GROUP_MAP map;
        BOOL ret;
+       
+       /* Windows treats "MACHINE\None" as a special name for 
+          rid 513 on non-DCs.  You cannot create a user or group
+          name "None" on Windows.  You will get an error that 
+          the group already exists. */
+          
+       if ( strequal( user, "None" ) ) {
+               *rid = DOMAIN_GROUP_RID_USERS;
+               *type = SID_NAME_DOM_GRP;
+               
+               return True;
+       }
 
        /* LOOKUP_NAME_GROUP is a hack to allow valid users = @foo to work
         * correctly in the case where foo also exists as a user. If the flag
index 4061e7b5db91d370400009f3b3fb73ac36ef346f..82890fee2dc2d16567b2a4a86d72b1715b29c72f 100644 (file)
@@ -734,13 +734,31 @@ NTSTATUS pdb_enum_group_members(TALLOC_CTX *mem_ctx,
                                size_t *p_num_members)
 {
        struct pdb_methods *pdb = pdb_get_methods();
+       NTSTATUS result;
 
        if ( !pdb ) {
                return NT_STATUS_UNSUCCESSFUL;
        }
 
-       return pdb->enum_group_members(pdb, mem_ctx, sid, 
-                                                  pp_member_rids, p_num_members);
+       result = pdb->enum_group_members(pdb, mem_ctx, 
+                       sid, pp_member_rids, p_num_members);
+               
+       /* special check for rid 513 */
+               
+       if ( !NT_STATUS_IS_OK( result ) ) {
+               uint32 rid;
+               
+               sid_peek_rid( sid, &rid );
+               
+               if ( rid == DOMAIN_GROUP_RID_USERS ) {
+                       *p_num_members = 0;
+                       *pp_member_rids = NULL;
+                       
+                       return NT_STATUS_OK;
+               }
+       }
+       
+       return result;
 }
 
 NTSTATUS pdb_enum_group_memberships(TALLOC_CTX *mem_ctx, struct samu *user,