dcesrv_samr.c
来自「samba最新软件」· C语言 代码 · 共 2,389 行 · 第 1/5 页
C
2,389 行
d_state->builtin = true; } else { d_state->builtin = false; } d_state->lp_ctx = dce_call->conn->dce_ctx->lp_ctx; h_domain = dcesrv_handle_new(dce_call->context, SAMR_HANDLE_DOMAIN); if (!h_domain) { talloc_free(d_state); return NT_STATUS_NO_MEMORY; } h_domain->data = talloc_steal(h_domain, d_state); *r->out.domain_handle = h_domain->wire_handle; return NT_STATUS_OK;}/* return DomInfo1*/static NTSTATUS dcesrv_samr_info_DomInfo1(struct samr_domain_state *state, TALLOC_CTX *mem_ctx, struct ldb_message **dom_msgs, struct samr_DomInfo1 *info){ info->min_password_length = samdb_result_uint(dom_msgs[0], "minPwdLength", 0); info->password_history_length = samdb_result_uint(dom_msgs[0], "pwdHistoryLength", 0); info->password_properties = samdb_result_uint(dom_msgs[0], "pwdProperties", 0); info->max_password_age = samdb_result_int64(dom_msgs[0], "maxPwdAge", 0); info->min_password_age = samdb_result_int64(dom_msgs[0], "minPwdAge", 0); return NT_STATUS_OK;}/* return DomInfo2*/static NTSTATUS dcesrv_samr_info_DomInfo2(struct samr_domain_state *state, TALLOC_CTX *mem_ctx, struct ldb_message **dom_msgs, struct samr_DomInfo2 *info){ /* This pulls the NetBIOS name from the cn=NTDS Settings,cn=<NETBIOS name of PDC>,.... string */ info->primary.string = samdb_result_fsmo_name(state->sam_ctx, mem_ctx, dom_msgs[0], "fSMORoleOwner"); if (!info->primary.string) { info->primary.string = lp_netbios_name(state->lp_ctx); } info->force_logoff_time = ldb_msg_find_attr_as_uint64(dom_msgs[0], "forceLogoff", 0x8000000000000000LL); info->comment.string = samdb_result_string(dom_msgs[0], "comment", NULL); info->domain_name.string = state->domain_name; info->sequence_num = ldb_msg_find_attr_as_uint64(dom_msgs[0], "modifiedCount", 0); switch (state->role) { case ROLE_DOMAIN_CONTROLLER: /* This pulls the NetBIOS name from the cn=NTDS Settings,cn=<NETBIOS name of PDC>,.... string */ if (samdb_is_pdc(state->sam_ctx)) { info->role = SAMR_ROLE_DOMAIN_PDC; } else { info->role = SAMR_ROLE_DOMAIN_BDC; } break; case ROLE_DOMAIN_MEMBER: info->role = SAMR_ROLE_DOMAIN_MEMBER; break; case ROLE_STANDALONE: info->role = SAMR_ROLE_STANDALONE; break; } /* No users in BUILTIN, and the LOCAL group types are only in builtin, and the global group type is never in BUILTIN */ info->num_users = samdb_search_count(state->sam_ctx, mem_ctx, state->domain_dn, "(objectClass=user)"); info->num_groups = samdb_search_count(state->sam_ctx, mem_ctx, state->domain_dn, "(&(objectClass=group)(sAMAccountType=%u))", ATYPE_GLOBAL_GROUP); info->num_aliases = samdb_search_count(state->sam_ctx, mem_ctx, state->domain_dn, "(&(objectClass=group)(sAMAccountType=%u))", ATYPE_LOCAL_GROUP); return NT_STATUS_OK;}/* return DomInfo3*/static NTSTATUS dcesrv_samr_info_DomInfo3(struct samr_domain_state *state, TALLOC_CTX *mem_ctx, struct ldb_message **dom_msgs, struct samr_DomInfo3 *info){ info->force_logoff_time = ldb_msg_find_attr_as_uint64(dom_msgs[0], "forceLogoff", 0x8000000000000000LL); return NT_STATUS_OK;}/* return DomInfo4*/static NTSTATUS dcesrv_samr_info_DomInfo4(struct samr_domain_state *state, TALLOC_CTX *mem_ctx, struct ldb_message **dom_msgs, struct samr_DomInfo4 *info){ info->comment.string = samdb_result_string(dom_msgs[0], "comment", NULL); return NT_STATUS_OK;}/* return DomInfo5*/static NTSTATUS dcesrv_samr_info_DomInfo5(struct samr_domain_state *state, TALLOC_CTX *mem_ctx, struct ldb_message **dom_msgs, struct samr_DomInfo5 *info){ info->domain_name.string = state->domain_name; return NT_STATUS_OK;}/* return DomInfo6*/static NTSTATUS dcesrv_samr_info_DomInfo6(struct samr_domain_state *state, TALLOC_CTX *mem_ctx, struct ldb_message **dom_msgs, struct samr_DomInfo6 *info){ /* This pulls the NetBIOS name from the cn=NTDS Settings,cn=<NETBIOS name of PDC>,.... string */ info->primary.string = samdb_result_fsmo_name(state->sam_ctx, mem_ctx, dom_msgs[0], "fSMORoleOwner"); if (!info->primary.string) { info->primary.string = lp_netbios_name(state->lp_ctx); } return NT_STATUS_OK;}/* return DomInfo7*/static NTSTATUS dcesrv_samr_info_DomInfo7(struct samr_domain_state *state, TALLOC_CTX *mem_ctx, struct ldb_message **dom_msgs, struct samr_DomInfo7 *info){ switch (state->role) { case ROLE_DOMAIN_CONTROLLER: /* This pulls the NetBIOS name from the cn=NTDS Settings,cn=<NETBIOS name of PDC>,.... string */ if (samdb_is_pdc(state->sam_ctx)) { info->role = SAMR_ROLE_DOMAIN_PDC; } else { info->role = SAMR_ROLE_DOMAIN_BDC; } break; case ROLE_DOMAIN_MEMBER: info->role = SAMR_ROLE_DOMAIN_MEMBER; break; case ROLE_STANDALONE: info->role = SAMR_ROLE_STANDALONE; break; } return NT_STATUS_OK;}/* return DomInfo8*/static NTSTATUS dcesrv_samr_info_DomInfo8(struct samr_domain_state *state, TALLOC_CTX *mem_ctx, struct ldb_message **dom_msgs, struct samr_DomInfo8 *info){ info->sequence_num = ldb_msg_find_attr_as_uint64(dom_msgs[0], "modifiedCount", time(NULL)); info->domain_create_time = ldb_msg_find_attr_as_uint(dom_msgs[0], "creationTime", 0x0LL); return NT_STATUS_OK;}/* return DomInfo9*/static NTSTATUS dcesrv_samr_info_DomInfo9(struct samr_domain_state *state, TALLOC_CTX *mem_ctx, struct ldb_message **dom_msgs, struct samr_DomInfo9 *info){ info->unknown = 1; return NT_STATUS_OK;}/* return DomInfo11*/static NTSTATUS dcesrv_samr_info_DomInfo11(struct samr_domain_state *state, TALLOC_CTX *mem_ctx, struct ldb_message **dom_msgs, struct samr_DomInfo11 *info){ NTSTATUS status; status = dcesrv_samr_info_DomInfo2(state, mem_ctx, dom_msgs, &info->info2); if (!NT_STATUS_IS_OK(status)) { return status; } info->lockout_duration = ldb_msg_find_attr_as_int64(dom_msgs[0], "lockoutDuration", -18000000000LL); info->lockout_window = ldb_msg_find_attr_as_int64(dom_msgs[0], "lockOutObservationWindow", -18000000000LL); info->lockout_threshold = ldb_msg_find_attr_as_int64(dom_msgs[0], "lockoutThreshold", 0); return NT_STATUS_OK;}/* return DomInfo12*/static NTSTATUS dcesrv_samr_info_DomInfo12(struct samr_domain_state *state, TALLOC_CTX *mem_ctx, struct ldb_message **dom_msgs, struct samr_DomInfo12 *info){ info->lockout_duration = ldb_msg_find_attr_as_int64(dom_msgs[0], "lockoutDuration", -18000000000LL); info->lockout_window = ldb_msg_find_attr_as_int64(dom_msgs[0], "lockOutObservationWindow", -18000000000LL); info->lockout_threshold = ldb_msg_find_attr_as_int64(dom_msgs[0], "lockoutThreshold", 0); return NT_STATUS_OK;}/* return DomInfo13*/static NTSTATUS dcesrv_samr_info_DomInfo13(struct samr_domain_state *state, TALLOC_CTX *mem_ctx, struct ldb_message **dom_msgs, struct samr_DomInfo13 *info){ info->sequence_num = ldb_msg_find_attr_as_uint64(dom_msgs[0], "modifiedCount", time(NULL)); info->domain_create_time = ldb_msg_find_attr_as_uint(dom_msgs[0], "creationTime", 0x0LL); info->unknown1 = 0; info->unknown2 = 0; return NT_STATUS_OK;}/* samr_QueryDomainInfo */static NTSTATUS dcesrv_samr_QueryDomainInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct samr_QueryDomainInfo *r){ struct dcesrv_handle *h; struct samr_domain_state *d_state; struct ldb_message **dom_msgs; const char * const *attrs = NULL; r->out.info = NULL; DCESRV_PULL_HANDLE(h, r->in.domain_handle, SAMR_HANDLE_DOMAIN); d_state = h->data; r->out.info = talloc(mem_ctx, union samr_DomainInfo); if (!r->out.info) { return NT_STATUS_NO_MEMORY; } switch (r->in.level) { case 1: { static const char * const attrs2[] = { "minPwdLength", "pwdHistoryLength", "pwdProperties", "maxPwdAge", "minPwdAge", NULL }; attrs = attrs2; break; } case 2: { static const char * const attrs2[] = {"forceLogoff", "comment", "modifiedCount", "fSMORoleOwner", NULL}; attrs = attrs2; break; } case 3: { static const char * const attrs2[] = {"forceLogoff", NULL}; attrs = attrs2; break; } case 4: { static const char * const attrs2[] = {"comment", NULL}; attrs = attrs2; break; } case 5: { attrs = NULL; break; } case 6: { static const char * const attrs2[] = {"fSMORoleOwner", NULL}; attrs = attrs2; break; } case 7: { attrs = NULL; break; } case 8: { static const char * const attrs2[] = { "modifiedCount", "creationTime", NULL }; attrs = attrs2; break; } case 9: attrs = NULL; break; case 11: { static const char * const attrs2[] = { "comment", "forceLogoff", "modifiedCount", "lockoutDuration", "lockOutObservationWindow", "lockoutThreshold", NULL}; attrs = attrs2; break; } case 12: { static const char * const attrs2[] = { "lockoutDuration", "lockOutObservationWindow", "lockoutThreshold", NULL}; attrs = attrs2; break; } case 13: { static const char * const attrs2[] = { "modifiedCount", "creationTime", NULL }; attrs = attrs2; break; } } /* some levels don't need a search */ if (attrs) { int ret; ret = gendb_search_dn(d_state->sam_ctx, mem_ctx, d_state->domain_dn, &dom_msgs, attrs); if (ret != 1) { return NT_STATUS_INTERNAL_DB_CORRUPTION; } } ZERO_STRUCTP(r->out.info); switch (r->in.level) { case 1: return dcesrv_samr_info_DomInfo1(d_state, mem_ctx, dom_msgs, &r->out.info->info1); case 2: return dcesrv_samr_info_DomInfo2(d_state, mem_ctx, dom_msgs, &r->out.info->info2); case 3: return dcesrv_samr_info_DomInfo3(d_state, mem_ctx, dom_msgs, &r->out.info->info3); case 4: return dcesrv_samr_info_DomInfo4(d_state, mem_ctx, dom_msgs, &r->out.info->info4); case 5: return dcesrv_samr_info_DomInfo5(d_state, mem_ctx, dom_msgs, &r->out.info->info5); case 6: return dcesrv_samr_info_DomInfo6(d_state, mem_ctx, dom_msgs, &r->out.info->info6); case 7: return dcesrv_samr_info_DomInfo7(d_state, mem_ctx, dom_msgs, &r->out.info->info7); case 8: return dcesrv_samr_info_DomInfo8(d_state, mem_ctx, dom_msgs, &r->out.info->info8); case 9: return dcesrv_samr_info_DomInfo9(d_state, mem_ctx, dom_msgs, &r->out.info->info9); case 11: return dcesrv_samr_info_DomInfo11(d_state, mem_ctx, dom_msgs, &r->out.info->info11); case 12: return dcesrv_samr_info_DomInfo12(d_state, mem_ctx, dom_msgs, &r->out.info->info12); case 13: return dcesrv_samr_info_DomInfo13(d_state, mem_ctx, dom_msgs, &r->out.info->info13); } return NT_STATUS_INVALID_INFO_CLASS;}/* samr_SetDomainInfo */static NTSTATUS dcesrv_samr_SetDomainInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct samr_SetDomainInfo *r){ struct dcesrv_handle *h; struct samr_domain_state *d_state; struct ldb_message *msg; int ret; struct ldb_context *sam_ctx; DCESRV_PULL_HANDLE(h, r->in.domain_handle, SAMR_HANDLE_DOMAIN); d_state = h->data; sam_ctx = d_state->sam_ctx; msg = ldb_msg_new(mem_ctx); if (msg == NULL) { return NT_STATUS_NO_MEMORY; } msg->dn = talloc_reference(mem_ctx, d_state->domain_dn); if (!msg->dn) { return NT_STATUS_NO_MEMORY; } switch (r->in.level) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?