static BOOL test_addshare(struct dcerpc_pipe *svc_pipe, TALLOC_CTX *mem_ctx, const char *host, const char* share) { NTSTATUS status; struct srvsvc_NetShareAdd add; struct srvsvc_NetShareInfo2 i; i.name = share; i.type = STYPE_DISKTREE; i.path = "C:\\WINDOWS\\TEMP"; i.max_users = 5; i.comment = "Comment to the test share"; i.password = NULL; i.permissions = 0x0; add.in.server_unc = host; add.in.level = 2; add.in.info.info2 = &i; status = dcerpc_srvsvc_NetShareAdd(svc_pipe, mem_ctx, &add); if (!NT_STATUS_IS_OK(status)) { printf("Failed to add a new share\n"); return False; } printf("share added\n"); return True; }
WERROR NetShareAdd_r(struct libnetapi_ctx *ctx, struct NetShareAdd *r) { WERROR werr; NTSTATUS status; union srvsvc_NetShareInfo info; struct dcerpc_binding_handle *b; if (!r->in.buffer) { return WERR_INVALID_PARAM; } switch (r->in.level) { case 2: case 502: break; case 503: return WERR_NOT_SUPPORTED; default: return WERR_UNKNOWN_LEVEL; } werr = libnetapi_get_binding_handle(ctx, r->in.server_name, &ndr_table_srvsvc, &b); if (!W_ERROR_IS_OK(werr)) { goto done; } status = map_SHARE_INFO_buffer_to_srvsvc_share_info(ctx, r->in.buffer, r->in.level, &info); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } status = dcerpc_srvsvc_NetShareAdd(b, talloc_tos(), r->in.server_name, r->in.level, &info, r->out.parm_err, &werr); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } if (!W_ERROR_IS_OK(werr)) { goto done; } done: return werr; }
NTSTATUS libnet_AddShare(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, struct libnet_AddShare *r) { NTSTATUS status; struct libnet_RpcConnect c; struct srvsvc_NetShareAdd s; union srvsvc_NetShareInfo info; c.level = LIBNET_RPC_CONNECT_SERVER; c.in.name = r->in.server_name; c.in.dcerpc_iface = &ndr_table_srvsvc; status = libnet_RpcConnect(ctx, mem_ctx, &c); if (!NT_STATUS_IS_OK(status)) { r->out.error_string = talloc_asprintf(mem_ctx, "Connection to SRVSVC pipe of server %s " "failed: %s", r->in.server_name, nt_errstr(status)); return status; } info.info2 = &r->in.share; s.in.level = 2; s.in.info = &info; s.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", r->in.server_name); status = dcerpc_srvsvc_NetShareAdd(c.out.dcerpc_pipe, mem_ctx, &s); if (!NT_STATUS_IS_OK(status)) { r->out.error_string = talloc_asprintf(mem_ctx, "srvsvc_NetShareAdd '%s' on server '%s' failed" ": %s", r->in.share.name, r->in.server_name, nt_errstr(status)); } else if (!W_ERROR_IS_OK(s.out.result)) { r->out.error_string = talloc_asprintf(mem_ctx, "srvsvc_NetShareAdd '%s' on server '%s' failed" ": %s", r->in.share.name, r->in.server_name, win_errstr(s.out.result)); status = werror_to_ntstatus(s.out.result); } talloc_free(c.out.dcerpc_pipe); return status; }