Hello!

Jerry you are right about script and permissions!

I'm looking again to usrmgr.exe and has corrected most of the problems of which I spoke earlier
This patch is corrected most problems, but i can't fixed, current moment, problems where "not root" create "global group" ... sorry :(


This patch not create security holes and another holes ... :)

I'm testing and is looking good ...
Is try help you, i hope :)

Sergey Loskutov
--- srv_samr_nt.c.orig  2005-03-16 09:33:15.394423183 -1000
+++ srv_samr_nt.c       2005-03-17 17:41:13.297259499 -1000
@@ -2865,8 +2865,10 @@
         * id21.  I don't know if they need to be set.    --jerry
         */
  
-       if (IS_SAM_CHANGED(pwd, PDB_GROUPSID))
-               set_unix_primary_group(pwd);
+       if (IS_SAM_CHANGED(pwd, PDB_GROUPSID) && !set_unix_primary_group(pwd) ) 
{
+          pdb_free_sam(&pwd);
+          return False;
+       }
 
        /* write the change out */
        if(!pdb_update_sam_account(pwd)) {
@@ -2933,8 +2935,10 @@
  
        ZERO_STRUCT(plaintext_buf);
  
-       if (IS_SAM_CHANGED(pwd, PDB_GROUPSID))
-               set_unix_primary_group(pwd);
+       if (IS_SAM_CHANGED(pwd, PDB_GROUPSID) && !set_unix_primary_group(pwd) ) 
{
+               pdb_free_sam(&pwd);
+               return False;
+       }
 
        if(!pdb_update_sam_account(pwd)) {
                pdb_free_sam(&pwd);
@@ -3624,12 +3628,16 @@
 
        sid_copy(&user_sid, get_global_sam_sid());
        sid_append_rid(&user_sid, q_u->rid);
-
+       
+        
        ret = pdb_init_sam(&sam_user);
+       
        if (!NT_STATUS_IS_OK(ret))
                return ret;
        
+       become_root(); 
        check = pdb_getsampwsid(sam_user, &user_sid);
+       unbecome_root();
        
        if (check != True) {
                pdb_free_sam(&sam_user);
@@ -3708,6 +3716,7 @@
        uint32 acc_granted;
        SE_PRIV se_rights;
        BOOL can_add_accounts;
+       BOOL ret;
 
        /*
         * delete the group member named q_u->rid
@@ -3740,7 +3749,12 @@
 
        /* check if the user exists before trying to remove it from the group */
        pdb_init_sam(&sam_pass);
-       if (!pdb_getsampwsid(sam_pass, &user_sid)) {
+       
+       become_root();
+       ret = pdb_getsampwsid(sam_pass, &user_sid);
+       unbecome_root();
+       
+       if (!ret) {
                DEBUG(5,("User %s doesn't exist.\n", 
pdb_get_username(sam_pass)));
                pdb_free_sam(&sam_pass);
                return NT_STATUS_NO_SUCH_USER;
@@ -4253,6 +4267,7 @@
        GROUP_MAP map;
        GROUP_INFO_CTR *ctr;
        uint32 acc_granted;
+       BOOL ret;
 
        if (!get_lsa_policy_samr_sid(p, &q_u->pol, &group_sid, &acc_granted))
                return NT_STATUS_INVALID_HANDLE;
@@ -4276,9 +4291,13 @@
                default:
                        return NT_STATUS_INVALID_INFO_CLASS;
        }
+       
+       become_root();
+       ret = pdb_update_group_mapping_entry(&map);
+       unbecome_root();
 
-       if(!pdb_update_group_mapping_entry(&map)) {
-               return NT_STATUS_NO_SUCH_GROUP;
+       if(!ret) {
+         return NT_STATUS_NO_SUCH_GROUP;
        }
 
        return NT_STATUS_OK;
@@ -4430,6 +4449,7 @@
        BOOL                    is_user = False;
        NTSTATUS                result;
        enum SID_NAME_USE       type = SID_NAME_UNKNOWN;
+       BOOL                    ret;
        
        sid_copy( &delete_sid, &q_u->sid.sid );
        
@@ -4466,18 +4486,27 @@
        
        pdb_init_sam(&sam_pass);
        
-       if ( pdb_getsampwsid(sam_pass, &delete_sid) ) {
-               is_user = True;
+       become_root();  
+
+       ret = pdb_getsampwsid(sam_pass, &delete_sid);
+       
+       if ( ret ) {
+         is_user = True;
        } else {
-               /* maybe it is a group */
-               if( !pdb_getgrsid(&map, delete_sid) ) {
-                       DEBUG(3,("_samr_remove_sid_foreign_domain: %s is not a 
user or a group!\n",
-                               sid_string_static(&delete_sid)));
-                       result = NT_STATUS_INVALID_SID;
-                       goto done;
-               }
+         /* maybe it is a group */
+         ret = pdb_getgrsid(&map, delete_sid);
+       }
+
+       unbecome_root();
+       
+       if ( !ret ) {
+               DEBUG(3,("_samr_remove_sid_foreign_domain: %s is not a user or 
a group!\n",
+                       sid_string_static(&delete_sid)));
+               result = NT_STATUS_INVALID_SID;
+               goto done;
        }
        
+       
        /* we can only delete a user from a group since we don't have 
           nested groups anyways.  So in the latter case, just say OK */
           
@@ -4486,7 +4515,10 @@
                int             num_groups, i;
                struct group    *grp2;
                
-               if ( pdb_enum_group_mapping(type, &mappings, &num_groups, 
False) && num_groups>0 ) {
+               become_root();
+               ret = pdb_enum_group_mapping(type, &mappings, &num_groups, 
False);
+               unbecome_root();
+               if ( ret && num_groups>0 ) {
                
                        /* interate over the groups */
                        for ( i=0; i<num_groups; i++ ) {
-- 
To unsubscribe from this list go to the following URL and read the
instructions:  https://lists.samba.org/mailman/listinfo/samba

Reply via email to