📄 ntptr_simple_ldb.c
字号:
ret = ldb_delete(sptr_db, msgs[0]->dn); if (ret != 0) { return WERR_FOOBAR; } return WERR_OK;}/* PrintServer Driver functions */static WERROR sptr_EnumPrinterDrivers(struct ntptr_context *ntptr, TALLOC_CTX *mem_ctx, struct spoolss_EnumPrinterDrivers *r){ return WERR_OK;}static WERROR sptr_GetPrinterDriverDirectory(struct ntptr_context *ntptr, TALLOC_CTX *mem_ctx, struct spoolss_GetPrinterDriverDirectory *r){ union spoolss_DriverDirectoryInfo *info; const char *prefix; const char *postfix; /* * NOTE: normally r->in.level is 1, but both w2k3 and nt4 sp6a * are ignoring the r->in.level completely, so we do :-) */ /* * TODO: check the server name is ours * - if it's a invalid UNC then return WERR_INVALID_NAME * - if it's the wrong host name return WERR_INVALID_PARAM * - if it's "" then we need to return a local WINDOWS path */ if (!r->in.server || !r->in.server[0]) { prefix = "C:\\DRIVERS"; } else { prefix = talloc_asprintf(mem_ctx, "%s\\print$", r->in.server); W_ERROR_HAVE_NO_MEMORY(prefix); } if (r->in.environment && strcmp(SPOOLSS_ARCHITECTURE_NT_X86, r->in.environment) == 0) { postfix = "W32X86"; } else { return WERR_INVALID_ENVIRONMENT; } info = talloc(mem_ctx, union spoolss_DriverDirectoryInfo); W_ERROR_HAVE_NO_MEMORY(info); info->info1.directory_name = talloc_asprintf(mem_ctx, "%s\\%s", prefix, postfix); W_ERROR_HAVE_NO_MEMORY(info->info1.directory_name); r->out.info = info; return WERR_OK;}/* Printer functions */static WERROR sptr_EnumPrinters(struct ntptr_context *ntptr, TALLOC_CTX *mem_ctx, struct spoolss_EnumPrinters *r){ struct ldb_context *sptr_db = talloc_get_type(ntptr->private_data, struct ldb_context); struct ldb_message **msgs; int count; int i; union spoolss_PrinterInfo *info; count = sptr_db_search(sptr_db, mem_ctx, NULL, &msgs, NULL, "(&(objectclass=printer))"); if (count == 0) return WERR_OK; if (count < 0) return WERR_GENERAL_FAILURE; info = talloc_array(mem_ctx, union spoolss_PrinterInfo, count); W_ERROR_HAVE_NO_MEMORY(info); switch(r->in.level) { case 1: for (i = 0; i < count; i++) { info[i].info1.flags = samdb_result_uint(msgs[i], "flags", 0); info[i].info1.name = samdb_result_string(msgs[i], "name", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info1.name); info[i].info1.description = samdb_result_string(msgs[i], "description", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info1.description); info[i].info1.comment = samdb_result_string(msgs[i], "comment", NULL); } break; case 2: for (i = 0; i < count; i++) { info[i].info2.servername = samdb_result_string(msgs[i], "servername", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.servername); info[i].info2.printername = samdb_result_string(msgs[i], "printername", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.printername); info[i].info2.sharename = samdb_result_string(msgs[i], "sharename", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.sharename); info[i].info2.portname = samdb_result_string(msgs[i], "portname", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.portname); info[i].info2.drivername = samdb_result_string(msgs[i], "drivername", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.drivername); info[i].info2.comment = samdb_result_string(msgs[i], "comment", NULL); info[i].info2.location = samdb_result_string(msgs[i], "location", NULL); info[i].info2.devmode = NULL; info[i].info2.sepfile = samdb_result_string(msgs[i], "sepfile", NULL); info[i].info2.printprocessor = samdb_result_string(msgs[i], "printprocessor", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.printprocessor); info[i].info2.datatype = samdb_result_string(msgs[i], "datatype", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.datatype); info[i].info2.parameters = samdb_result_string(msgs[i], "parameters", NULL); info[i].info2.secdesc = NULL; info[i].info2.attributes = samdb_result_uint(msgs[i], "attributes", 0); info[i].info2.priority = samdb_result_uint(msgs[i], "priority", 0); info[i].info2.defaultpriority = samdb_result_uint(msgs[i], "defaultpriority", 0); info[i].info2.starttime = samdb_result_uint(msgs[i], "starttime", 0); info[i].info2.untiltime = samdb_result_uint(msgs[i], "untiltime", 0); info[i].info2.status = samdb_result_uint(msgs[i], "status", 0); info[i].info2.cjobs = samdb_result_uint(msgs[i], "cjobs", 0); info[i].info2.averageppm = samdb_result_uint(msgs[i], "averageppm", 0); } break; case 4: for (i = 0; i < count; i++) { info[i].info4.printername = samdb_result_string(msgs[i], "printername", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.printername); info[i].info4.servername = samdb_result_string(msgs[i], "servername", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.servername); info[i].info4.attributes = samdb_result_uint(msgs[i], "attributes", 0); } break; case 5: for (i = 0; i < count; i++) { info[i].info5.printername = samdb_result_string(msgs[i], "name", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info5.printername); info[i].info5.portname = samdb_result_string(msgs[i], "port", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info5.portname); info[i].info5.attributes = samdb_result_uint(msgs[i], "attributes", 0); info[i].info5.device_not_selected_timeout = samdb_result_uint(msgs[i], "device_not_selected_timeout", 0); info[i].info5.transmission_retry_timeout = samdb_result_uint(msgs[i], "transmission_retry_timeout", 0); } break; default: return WERR_UNKNOWN_LEVEL; } r->out.info = info; r->out.count = count; return WERR_OK;}static WERROR sptr_OpenPrinter(struct ntptr_context *ntptr, TALLOC_CTX *mem_ctx, struct spoolss_OpenPrinterEx *r, const char *printer_name, struct ntptr_GenericHandle **printer){ return WERR_INVALID_PRINTER_NAME;}/* port functions */static WERROR sptr_EnumPorts(struct ntptr_context *ntptr, TALLOC_CTX *mem_ctx, struct spoolss_EnumPorts *r){ struct ldb_context *sptr_db = talloc_get_type(ntptr->private_data, struct ldb_context); struct ldb_message **msgs; int count; int i; union spoolss_PortInfo *info; count = sptr_db_search(sptr_db, mem_ctx, NULL, &msgs, NULL, "(&(objectclass=port))"); if (count == 0) return WERR_OK; if (count < 0) return WERR_GENERAL_FAILURE; info = talloc_array(mem_ctx, union spoolss_PortInfo, count); W_ERROR_HAVE_NO_MEMORY(info); switch (r->in.level) { case 1: for (i = 0; i < count; i++) { info[i].info1.port_name = samdb_result_string(msgs[i], "port-name", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info1.port_name); } break; case 2: for (i=0; i < count; i++) { info[i].info2.port_name = samdb_result_string(msgs[i], "port-name", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.port_name); info[i].info2.monitor_name = samdb_result_string(msgs[i], "monitor-name", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.monitor_name); info[i].info2.description = samdb_result_string(msgs[i], "description", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.description); info[i].info2.port_type = samdb_result_uint(msgs[i], "port-type", SPOOLSS_PORT_TYPE_WRITE); info[i].info2.reserved = samdb_result_uint(msgs[i], "reserved", 0); } break; default: return WERR_UNKNOWN_LEVEL; } r->out.info = info; r->out.count = count; return WERR_OK;}/* monitor functions */static WERROR sptr_EnumMonitors(struct ntptr_context *ntptr, TALLOC_CTX *mem_ctx, struct spoolss_EnumMonitors *r){ struct ldb_context *sptr_db = talloc_get_type(ntptr->private_data, struct ldb_context); struct ldb_message **msgs; int count; int i; union spoolss_MonitorInfo *info; count = sptr_db_search(sptr_db, mem_ctx, NULL, &msgs, NULL, "(&(objectclass=monitor))"); if (count == 0) return WERR_OK; if (count < 0) return WERR_GENERAL_FAILURE; info = talloc_array(mem_ctx, union spoolss_MonitorInfo, count); W_ERROR_HAVE_NO_MEMORY(info); switch (r->in.level) { case 1: for (i = 0; i < count; i++) { info[i].info1.monitor_name = samdb_result_string(msgs[i], "monitor-name", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info1.monitor_name); } break; case 2: for (i=0; i < count; i++) { info[i].info2.monitor_name = samdb_result_string(msgs[i], "monitor-name", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.monitor_name); info[i].info2.environment = samdb_result_string(msgs[i], "environment", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.environment); info[i].info2.dll_name = samdb_result_string(msgs[i], "dll-name", ""); W_ERROR_HAVE_NO_MEMORY(info[i].info2.dll_name); } break; default: return WERR_UNKNOWN_LEVEL; } r->out.info = info; r->out.count = count; return WERR_OK; return WERR_OK;}/* Printer Form functions */static WERROR sptr_GetPrinterForm(struct ntptr_GenericHandle *printer, TALLOC_CTX *mem_ctx, struct spoolss_GetForm *r){ struct ldb_context *sptr_db = talloc_get_type(printer->ntptr->private_data, struct ldb_context); struct ldb_message **msgs; struct ldb_dn *base_dn; int count; union spoolss_FormInfo *info; /* TODO: do checks access here * if (!(printer->access_mask & desired_access)) { * return WERR_FOOBAR; * } */ base_dn = ldb_dn_new_fmt(mem_ctx, sptr_db, "CN=Forms,CN=%s,CN=Printers", printer->object_name); W_ERROR_HAVE_NO_MEMORY(base_dn); count = sptr_db_search(sptr_db, mem_ctx, base_dn, &msgs, NULL, "(&(form-name=%s)(objectClass=form))", r->in.form_name); if (count == 0) return WERR_FOOBAR; if (count > 1) return WERR_FOOBAR; if (count < 0) return WERR_GENERAL_FAILURE; info = talloc(mem_ctx, union spoolss_FormInfo); W_ERROR_HAVE_NO_MEMORY(info); switch (r->in.level) { case 1: info->info1.flags = samdb_result_uint(msgs[0], "flags", SPOOLSS_FORM_BUILTIN); info->info1.form_name = samdb_result_string(msgs[0], "form-name", NULL); W_ERROR_HAVE_NO_MEMORY(info->info1.form_name); info->info1.size.width = samdb_result_uint(msgs[0], "size-width", 0); info->info1.size.height = samdb_result_uint(msgs[0], "size-height", 0); info->info1.area.left = samdb_result_uint(msgs[0], "area-left", 0); info->info1.area.top = samdb_result_uint(msgs[0], "area-top", 0); info->info1.area.right = samdb_result_uint(msgs[0], "area-right", 0); info->info1.area.bottom = samdb_result_uint(msgs[0], "area-bottom", 0); break; default: return WERR_UNKNOWN_LEVEL; } r->out.info = info; return WERR_OK;}/* initialialise the simble ldb backend, registering ourselves with the ntptr subsystem */static const struct ntptr_ops ntptr_simple_ldb_ops = { .name = "simple_ldb", .init_context = sptr_init_context, /* PrintServer functions */ .OpenPrintServer = sptr_OpenPrintServer,/* .XcvDataPrintServer = sptr_XcvDataPrintServer,*/ /* PrintServer PrinterData functions *//* .EnumPrintServerData = sptr_EnumPrintServerData,*/ .GetPrintServerData = sptr_GetPrintServerData,/* .SetPrintServerData = sptr_SetPrintServerData, .DeletePrintServerData = sptr_DeletePrintServerData,*/ /* PrintServer Form functions */ .EnumPrintServerForms = sptr_EnumPrintServerForms, .AddPrintServerForm = sptr_AddPrintServerForm, .SetPrintServerForm = sptr_SetPrintServerForm, .DeletePrintServerForm = sptr_DeletePrintServerForm, /* PrintServer Driver functions */ .EnumPrinterDrivers = sptr_EnumPrinterDrivers,/* .AddPrinterDriver = sptr_AddPrinterDriver, .DeletePrinterDriver = sptr_DeletePrinterDriver,*/ .GetPrinterDriverDirectory = sptr_GetPrinterDriverDirectory, /* Port functions */ .EnumPorts = sptr_EnumPorts,/* .OpenPort = sptr_OpenPort, .XcvDataPort = sptr_XcvDataPort,*/ /* Monitor functions */ .EnumMonitors = sptr_EnumMonitors,/* .OpenMonitor = sptr_OpenMonitor, .XcvDataMonitor = sptr_XcvDataMonitor,*/ /* PrintProcessor functions *//* .EnumPrintProcessors = sptr_EnumPrintProcessors,*/ /* Printer functions */ .EnumPrinters = sptr_EnumPrinters, .OpenPrinter = sptr_OpenPrinter,/* .AddPrinter = sptr_AddPrinter, .GetPrinter = sptr_GetPrinter, .SetPrinter = sptr_SetPrinter, .DeletePrinter = sptr_DeletePrinter, .XcvDataPrinter = sptr_XcvDataPrinter,*/ /* Printer Driver functions *//* .GetPrinterDriver = sptr_GetPrinterDriver,*/ /* Printer PrinterData functions *//* .EnumPrinterData = sptr_EnumPrinterData, .GetPrinterData = sptr_GetPrinterData, .SetPrinterData = sptr_SetPrinterData, .DeletePrinterData = sptr_DeletePrinterData,*/ /* Printer Form functions *//* .EnumPrinterForms = sptr_EnumPrinterForms, .AddPrinterForm = sptr_AddPrinterForm,*/ .GetPrinterForm = sptr_GetPrinterForm,/* .SetPrinterForm = sptr_SetPrinterForm, .DeletePrinterForm = sptr_DeletePrinterForm,*/ /* Printer Job functions *//* .EnumJobs = sptr_EnumJobs, .AddJob = sptr_AddJob, .ScheduleJob = sptr_ScheduleJob, .GetJob = sptr_GetJob, .SetJob = sptr_SetJob,*/ /* Printer Printing functions *//* .StartDocPrinter = sptr_StartDocPrinter, .EndDocPrinter = sptr_EndDocPrinter, .StartPagePrinter = sptr_StartPagePrinter, .EndPagePrinter = sptr_EndPagePrinter, .WritePrinter = sptr_WritePrinter, .ReadPrinter = sptr_ReadPrinter,*/};NTSTATUS ntptr_simple_ldb_init(void){ NTSTATUS ret; ret = ntptr_register(&ntptr_simple_ldb_ops); if (!NT_STATUS_IS_OK(ret)) { DEBUG(0,("Failed to register NTPTR '%s' backend!\n", ntptr_simple_ldb_ops.name)); } return ret;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -