WERROR NetShareDel_r(struct libnetapi_ctx *ctx, struct NetShareDel *r) { WERROR werr; NTSTATUS status; struct dcerpc_binding_handle *b; if (!r->in.net_name) { return WERR_INVALID_PARAM; } werr = libnetapi_get_binding_handle(ctx, r->in.server_name, &ndr_table_srvsvc, &b); if (!W_ERROR_IS_OK(werr)) { goto done; } status = dcerpc_srvsvc_NetShareDel(b, talloc_tos(), r->in.server_name, r->in.net_name, r->in.reserved, &werr); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } done: return werr; }
WERROR NetRemoteTOD_r(struct libnetapi_ctx *ctx, struct NetRemoteTOD *r) { NTSTATUS status; WERROR werr; struct srvsvc_NetRemoteTODInfo *info = NULL; struct dcerpc_binding_handle *b; werr = libnetapi_get_binding_handle(ctx, r->in.server_name, &ndr_table_srvsvc.syntax_id, &b); if (!W_ERROR_IS_OK(werr)) { goto done; } status = dcerpc_srvsvc_NetRemoteTOD(b, talloc_tos(), r->in.server_name, &info, &werr); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } if (!W_ERROR_IS_OK(werr)) { goto done; } *r->out.buffer = (uint8_t *)talloc_memdup(ctx, info, sizeof(struct srvsvc_NetRemoteTODInfo)); W_ERROR_HAVE_NO_MEMORY(*r->out.buffer); done: return werr; }
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; }
WERROR NetServerGetInfo_r(struct libnetapi_ctx *ctx, struct NetServerGetInfo *r) { NTSTATUS status; WERROR werr; union srvsvc_NetSrvInfo info; struct dcerpc_binding_handle *b; if (!r->out.buffer) { return WERR_INVALID_PARAM; } switch (r->in.level) { case 100: case 101: case 102: case 402: case 502: case 503: case 1005: break; default: return WERR_UNKNOWN_LEVEL; } werr = libnetapi_get_binding_handle(ctx, r->in.server_name, &ndr_table_srvsvc.syntax_id, &b); if (!W_ERROR_IS_OK(werr)) { goto done; } status = dcerpc_srvsvc_NetSrvGetInfo(b, talloc_tos(), r->in.server_name, r->in.level, &info, &werr); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } if (!W_ERROR_IS_OK(werr)) { goto done; } status = map_server_info_to_SERVER_INFO_buffer(ctx, r->in.level, &info, r->out.buffer); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } done: return werr; }
WERROR NetWkstaGetInfo_r(struct libnetapi_ctx *ctx, struct NetWkstaGetInfo *r) { NTSTATUS status; WERROR werr; union wkssvc_NetWkstaInfo info; struct dcerpc_binding_handle *b; if (!r->out.buffer) { return WERR_INVALID_PARAMETER; } switch (r->in.level) { case 100: case 101: case 102: break; default: return WERR_INVALID_LEVEL; } werr = libnetapi_get_binding_handle(ctx, r->in.server_name, &ndr_table_wkssvc, &b); if (!W_ERROR_IS_OK(werr)) { goto done; } status = dcerpc_wkssvc_NetWkstaGetInfo(b, talloc_tos(), r->in.server_name, r->in.level, &info, &werr); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } if (!W_ERROR_IS_OK(werr)) { goto done; } status = map_wksta_info_to_WKSTA_INFO_buffer(ctx, r->in.level, &info, r->out.buffer); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } done: return werr; }
WERROR DsGetDcName_r(struct libnetapi_ctx *ctx, struct DsGetDcName *r) { WERROR werr; NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; struct dcerpc_binding_handle *b; werr = libnetapi_get_binding_handle(ctx, r->in.server_name, &ndr_table_netlogon, &b); if (!W_ERROR_IS_OK(werr)) { goto done; } status = dcerpc_netr_DsRGetDCNameEx(b, ctx, r->in.server_name, r->in.domain_name, r->in.domain_guid, r->in.site_name, r->in.flags, (struct netr_DsRGetDCNameInfo **)r->out.dc_info, &werr); if (NT_STATUS_IS_OK(status) && W_ERROR_IS_OK(werr)) { goto done; } status = dcerpc_netr_DsRGetDCName(b, ctx, r->in.server_name, r->in.domain_name, r->in.domain_guid, NULL, r->in.flags, (struct netr_DsRGetDCNameInfo **)r->out.dc_info, &werr); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } done: return werr; }
WERROR NetGetAnyDCName_r(struct libnetapi_ctx *ctx, struct NetGetAnyDCName *r) { NTSTATUS status; WERROR werr; struct dcerpc_binding_handle *b; const char *dcname; void *buffer; werr = libnetapi_get_binding_handle(ctx, r->in.server_name, &ndr_table_netlogon, &b); if (!W_ERROR_IS_OK(werr)) { goto done; } status = dcerpc_netr_GetAnyDCName(b, talloc_tos(), r->in.server_name, r->in.domain_name, &dcname, &werr); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } if (!W_ERROR_IS_OK(werr)) { goto done; } if (NetApiBufferAllocate(strlen_m_term(dcname), &buffer)) { werr = WERR_NOT_ENOUGH_MEMORY; goto done; } memcpy(buffer, dcname, strlen_m_term(dcname)); *r->out.buffer = buffer; done: return werr; }
WERROR NetServerSetInfo_r(struct libnetapi_ctx *ctx, struct NetServerSetInfo *r) { NTSTATUS status; WERROR werr; union srvsvc_NetSrvInfo info; struct dcerpc_binding_handle *b; werr = libnetapi_get_binding_handle(ctx, r->in.server_name, &ndr_table_srvsvc.syntax_id, &b); if (!W_ERROR_IS_OK(werr)) { goto done; } switch (r->in.level) { case 1005: info.info1005 = (struct srvsvc_NetSrvInfo1005 *)r->in.buffer; break; default: werr = WERR_NOT_SUPPORTED; goto done; } status = dcerpc_srvsvc_NetSrvSetInfo(b, talloc_tos(), r->in.server_name, r->in.level, &info, r->out.parm_error, &werr); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } done: return werr; }
WERROR NetShareEnum_r(struct libnetapi_ctx *ctx, struct NetShareEnum *r) { WERROR werr; NTSTATUS status; struct srvsvc_NetShareInfoCtr info_ctr; struct srvsvc_NetShareCtr0 ctr0; struct srvsvc_NetShareCtr1 ctr1; struct srvsvc_NetShareCtr2 ctr2; uint32_t i; struct dcerpc_binding_handle *b; if (!r->out.buffer) { return WERR_INVALID_PARAM; } switch (r->in.level) { case 0: case 1: case 2: break; case 502: case 503: return WERR_NOT_SUPPORTED; default: return WERR_UNKNOWN_LEVEL; } ZERO_STRUCT(info_ctr); werr = libnetapi_get_binding_handle(ctx, r->in.server_name, &ndr_table_srvsvc, &b); if (!W_ERROR_IS_OK(werr)) { goto done; } info_ctr.level = r->in.level; switch (r->in.level) { case 0: ZERO_STRUCT(ctr0); info_ctr.ctr.ctr0 = &ctr0; break; case 1: ZERO_STRUCT(ctr1); info_ctr.ctr.ctr1 = &ctr1; break; case 2: ZERO_STRUCT(ctr2); info_ctr.ctr.ctr2 = &ctr2; break; } status = dcerpc_srvsvc_NetShareEnumAll(b, talloc_tos(), r->in.server_name, &info_ctr, r->in.prefmaxlen, r->out.total_entries, r->out.resume_handle, &werr); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } if (!W_ERROR_IS_OK(werr) && !W_ERROR_EQUAL(werr, WERR_MORE_DATA)) { goto done; } for (i=0; i < info_ctr.ctr.ctr1->count; i++) { union srvsvc_NetShareInfo _i; switch (r->in.level) { case 0: _i.info0 = &info_ctr.ctr.ctr0->array[i]; break; case 1: _i.info1 = &info_ctr.ctr.ctr1->array[i]; break; case 2: _i.info2 = &info_ctr.ctr.ctr2->array[i]; break; } status = map_srvsvc_share_info_to_SHARE_INFO_buffer(ctx, r->in.level, &_i, r->out.buffer, r->out.entries_read); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } } done: return werr; }