#include "includes.h"
#include "rpc_server/dcerpc_server.h"
#include "librpc/gen_ndr/ndr_mgmt.h"
+#include "auth/session.h"
+#include "dsdb/common/util.h"
+#include "dsdb/samdb/samdb.h"
+#include "lib/ldb/include/ldb_errors.h"
+#include "../lib/util/util_ldb.h"
+#include "param/param.h"
/*
mgmt_inq_if_ids
static WERROR dcesrv_mgmt_inq_princ_name(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct mgmt_inq_princ_name *r)
{
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ if (r->in.authn_proto == 0x9) {
+ /* Look for our UPN */
+ struct ldb_context *ldb_ctx;
+ struct ldb_result *res;
+ char *account;
+ char *value;
+ int ret;
+
+ struct ldb_dn *machine_dn;
+ const char* attrs[] = {"samAccountName", NULL};
+ struct loadparm_context *lp_ctx = dce_call->conn->dce_ctx->lp_ctx;
+ char *realm = lpcfg_realm(lp_ctx);
+
+ ldb_ctx = samdb_connect(mem_ctx, dce_call->event_ctx,
+ dce_call->conn->dce_ctx->lp_ctx,
+ system_session(dce_call->conn->dce_ctx->lp_ctx), 0);
+
+ ret = samdb_server_reference_dn(ldb_ctx, mem_ctx, &machine_dn);
+ if (ret != LDB_SUCCESS) {
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ }
+ W_ERROR_HAVE_NO_MEMORY(machine_dn);
+
+ ret = ldb_search(ldb_ctx, mem_ctx, &res, machine_dn,
+ LDB_SCOPE_BASE, attrs, NULL);
+
+ if (ret != LDB_SUCCESS) {
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ }
+
+ if (res->count != 1) {
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ }
+ account = ldb_msg_find_attr_as_string(res->msgs[0], "samAccountName", NULL);
+
+ if (account == NULL) {
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ }
+
+ value = talloc_asprintf(mem_ctx, "%s@%s", account, realm);
+ W_ERROR_HAVE_NO_MEMORY(value);
+
+ if (r->in.princ_name_size > strlen(value)) {
+ r->out.princ_name = talloc_steal(r, value);
+ return WERR_OK;
+ } else {
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ }
+
+
+ } else {
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ }
}