📄 srv_srvsvc_nt.c
字号:
struct current_user user; pstring command; fstring share_name; int ret; int snum; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op; DEBUG(5,("_srv_net_share_del: %d\n", __LINE__)); unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); if ( strequal(share_name,"IPC$") || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) || strequal(share_name,"global") ) { return WERR_ACCESS_DENIED; } snum = find_service(share_name); if (snum < 0) return WERR_NO_SUCH_SHARE; /* No change to printer shares. */ if (lp_print_ok(snum)) return WERR_ACCESS_DENIED; get_current_user(&user,p); is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); if (user.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) { DEBUG(10,("_srv_net_share_del: No delete share command\n")); return WERR_ACCESS_DENIED; } slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"", lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum)); DEBUG(10,("_srv_net_share_del: Running [%s]\n", command )); /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ if ( is_disk_op ) become_root(); if ( (ret = smbrun(command, NULL)) == 0 ) { /* Tell everyone we updated smb.conf. */ message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); } if ( is_disk_op ) unbecome_root(); /********* END SeDiskOperatorPrivilege BLOCK *********/ DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret )); if ( ret != 0 ) return WERR_ACCESS_DENIED; /* Delete the SD in the database. */ delete_share_security(snum); lp_killservice(snum); return WERR_OK;}WERROR _srv_net_share_del_sticky(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u){ DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__)); return _srv_net_share_del(p, q_u, r_u);}/*******************************************************************time of day********************************************************************/WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u){ TIME_OF_DAY_INFO *tod; struct tm *t; time_t unixdate = time(NULL); /* We do this call first as if we do it *after* the gmtime call it overwrites the pointed-to values. JRA */ uint32 zone = get_time_zone(unixdate)/60; DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) ) return WERR_NOMEM; r_u->tod = tod; r_u->ptr_srv_tod = 0x1; r_u->status = WERR_OK; DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); t = gmtime(&unixdate); /* set up the */ init_time_of_day_info(tod, unixdate, 0, t->tm_hour, t->tm_min, t->tm_sec, 0, zone, 10000, t->tm_mday, t->tm_mon + 1, 1900+t->tm_year, t->tm_wday); DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); return r_u->status;}/*********************************************************************************** Win9x NT tools get security descriptor.***********************************************************************************/WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u, SRV_R_NET_FILE_QUERY_SECDESC *r_u){ SEC_DESC *psd = NULL; size_t sd_size; DATA_BLOB null_pw; pstring filename; pstring qualname; files_struct *fsp = NULL; SMB_STRUCT_STAT st; BOOL bad_path; NTSTATUS nt_status; struct current_user user; connection_struct *conn = NULL; BOOL became_user = False; ZERO_STRUCT(st); r_u->status = WERR_OK; unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); /* Null password is ok - we are already an authenticated user... */ null_pw = data_blob(NULL, 0); get_current_user(&user, p); become_root(); conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname)); r_u->status = ntstatus_to_werror(nt_status); goto error_exit; } if (!become_user(conn, conn->vuid)) { DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n")); r_u->status = WERR_ACCESS_DENIED; goto error_exit; } became_user = True; unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename)); unix_convert(filename, conn, NULL, &bad_path, &st); if (bad_path) { DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", filename)); r_u->status = WERR_ACCESS_DENIED; goto error_exit; } if (!check_name(filename,conn)) { DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", filename)); r_u->status = WERR_ACCESS_DENIED; goto error_exit; } fsp = open_file_stat(conn, filename, &st); if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) fsp = open_directory(conn, filename, &st, READ_CONTROL_ACCESS, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0, NULL); if (!fsp) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); r_u->status = WERR_ACCESS_DENIED; goto error_exit; } } sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd); if (sd_size == 0) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename)); r_u->status = WERR_ACCESS_DENIED; goto error_exit; } r_u->ptr_response = 1; r_u->size_response = sd_size; r_u->ptr_secdesc = 1; r_u->size_secdesc = sd_size; r_u->sec_desc = psd; psd->dacl->revision = (uint16) NT4_ACL_REVISION; close_file(fsp, True); unbecome_user(); close_cnum(conn, user.vuid); return r_u->status;error_exit: if(fsp) { close_file(fsp, True); } if (became_user) unbecome_user(); if (conn) close_cnum(conn, user.vuid); return r_u->status;}/*********************************************************************************** Win9x NT tools set security descriptor.***********************************************************************************/WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u, SRV_R_NET_FILE_SET_SECDESC *r_u){ BOOL ret; pstring filename; pstring qualname; DATA_BLOB null_pw; files_struct *fsp = NULL; SMB_STRUCT_STAT st; BOOL bad_path; NTSTATUS nt_status; struct current_user user; connection_struct *conn = NULL; BOOL became_user = False; ZERO_STRUCT(st); r_u->status = WERR_OK; unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); /* Null password is ok - we are already an authenticated user... */ null_pw = data_blob(NULL, 0); get_current_user(&user, p); become_root(); conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname)); r_u->status = ntstatus_to_werror(nt_status); goto error_exit; } if (!become_user(conn, conn->vuid)) { DEBUG(0,("_srv_net_file_set_secdesc: Can't become connected user!\n")); r_u->status = WERR_ACCESS_DENIED; goto error_exit; } became_user = True; unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename)); unix_convert(filename, conn, NULL, &bad_path, &st); if (bad_path) { DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", filename)); r_u->status = WERR_ACCESS_DENIED; goto error_exit; } if (!check_name(filename,conn)) { DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", filename)); r_u->status = WERR_ACCESS_DENIED; goto error_exit; } fsp = open_file_stat(conn, filename, &st); if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) fsp = open_directory(conn, filename, &st, FILE_READ_ATTRIBUTES, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0, NULL); if (!fsp) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); r_u->status = WERR_ACCESS_DENIED; goto error_exit; } } ret = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc); if (ret == False) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename)); r_u->status = WERR_ACCESS_DENIED; goto error_exit; } close_file(fsp, True); unbecome_user(); close_cnum(conn, user.vuid); return r_u->status;error_exit: if(fsp) { close_file(fsp, True); } if (became_user) { unbecome_user(); } if (conn) { close_cnum(conn, user.vuid); } return r_u->status;}/*********************************************************************************** It may be that we want to limit users to creating shares on certain areas of the UNIX file area. We could define areas by mapping Windows style disks to points on the UNIX directory hierarchy. These disks would the disks listed by this function. Users could then create shares relative to these disks. Watch out for moving these disks around. "Nigel Williams" <nigel@veritas.com>.***********************************************************************************/static const char *server_disks[] = {"C:"};static uint32 get_server_disk_count(void){ return sizeof(server_disks)/sizeof(server_disks[0]);}static uint32 init_server_disk_enum(uint32 *resume){ uint32 server_disk_count = get_server_disk_count(); /*resume can be an offset into the list for now*/ if(*resume & 0x80000000) *resume = 0; if(*resume > server_disk_count) *resume = server_disk_count; return server_disk_count - *resume;}static const char *next_server_disk_enum(uint32 *resume){ const char *disk; if(init_server_disk_enum(resume) == 0) return NULL; disk = server_disks[*resume]; (*resume)++; DEBUG(10, ("next_server_disk_enum: reporting disk %s. resume handle %d.\n", disk, *resume)); return disk;}WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u){ uint32 i; const char *disk_name; TALLOC_CTX *ctx = p->mem_ctx; uint32 resume=get_enum_hnd(&q_u->enum_hnd); r_u->status=WERR_OK; r_u->total_entries = init_server_disk_enum(&resume); r_u->disk_enum_ctr.unknown = 0; if(!(r_u->disk_enum_ctr.disk_info = TALLOC_ARRAY(ctx, DISK_INFO, MAX_SERVER_DISK_ENTRIES))) { return WERR_NOMEM; } r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0; /*allow one DISK_INFO for null terminator*/ for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) { r_u->disk_enum_ctr.entries_read++; /*copy disk name into a unicode string*/ init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name); } /* add a terminating null string. Is this there if there is more data to come? */ r_u->disk_enum_ctr.entries_read++; init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, ""); init_enum_hnd(&r_u->enum_hnd, resume); return r_u->status;}/****************************************************************************************************************************************/WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u){ fstring sharename; switch ( q_u->type ) { case 0x9: rpcstr_pull(sharename, q_u->uni_name.buffer, sizeof(sharename), q_u->uni_name.uni_str_len*2, 0); if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) { DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename)); return WERR_INVALID_NAME; } break; default: return WERR_UNKNOWN_LEVEL; } return WERR_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -