mirror of
https://github.com/samba-team/samba.git
synced 2025-09-19 13:44:20 +03:00
s4/dcdiag: Handle ListRoles command for dcdiag:KnowsOfRoleHolders test
This commit is contained in:
@@ -4054,3 +4054,24 @@ WERROR dsdb_get_fsmo_role_info(TALLOC_CTX *tmp_ctx,
|
|||||||
}
|
}
|
||||||
return WERR_OK;
|
return WERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *samdb_dn_to_dnshostname(struct ldb_context *ldb,
|
||||||
|
TALLOC_CTX *mem_ctx,
|
||||||
|
struct ldb_dn *server_dn)
|
||||||
|
{
|
||||||
|
int ldb_ret;
|
||||||
|
struct ldb_result *res = NULL;
|
||||||
|
const char * const attrs[] = { "dNSHostName", NULL};
|
||||||
|
|
||||||
|
ldb_ret = ldb_search(ldb, mem_ctx, &res,
|
||||||
|
server_dn,
|
||||||
|
LDB_SCOPE_BASE,
|
||||||
|
attrs, NULL);
|
||||||
|
if (ldb_ret != LDB_SUCCESS) {
|
||||||
|
DEBUG(4, ("Failed to find dNSHostName for dn %s, ldb error: %s",
|
||||||
|
ldb_dn_get_linearized(server_dn), ldb_errstring(ldb)));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return samdb_result_string(res->msgs[0], "dNSHostName", NULL);
|
||||||
|
}
|
||||||
|
@@ -1309,3 +1309,76 @@ NTSTATUS crack_auto_name_to_nt4_name(TALLOC_CTX *mem_ctx,
|
|||||||
|
|
||||||
return crack_name_to_nt4_name(mem_ctx, ev_ctx, lp_ctx, format_offered, name, nt4_domain, nt4_account);
|
return crack_name_to_nt4_name(mem_ctx, ev_ctx, lp_ctx, format_offered, name, nt4_domain, nt4_account);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
WERROR dcesrv_drsuapi_ListRoles(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
|
||||||
|
const struct drsuapi_DsNameRequest1 *req1,
|
||||||
|
struct drsuapi_DsNameCtr1 **ctr1)
|
||||||
|
{
|
||||||
|
struct drsuapi_DsNameInfo1 *names;
|
||||||
|
uint32_t i;
|
||||||
|
uint32_t count = 5;/*number of fsmo role owners we are going to return*/
|
||||||
|
|
||||||
|
*ctr1 = talloc(mem_ctx, struct drsuapi_DsNameCtr1);
|
||||||
|
W_ERROR_HAVE_NO_MEMORY(*ctr1);
|
||||||
|
names = talloc_array(mem_ctx, struct drsuapi_DsNameInfo1, count);
|
||||||
|
W_ERROR_HAVE_NO_MEMORY(names);
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
WERROR werr;
|
||||||
|
struct ldb_dn *role_owner_dn, *fsmo_role_dn, *server_dn;
|
||||||
|
werr = dsdb_get_fsmo_role_info(mem_ctx, sam_ctx, i,
|
||||||
|
&fsmo_role_dn, &role_owner_dn);
|
||||||
|
if(!W_ERROR_IS_OK(werr)) {
|
||||||
|
return werr;
|
||||||
|
}
|
||||||
|
server_dn = ldb_dn_copy(mem_ctx, role_owner_dn);
|
||||||
|
ldb_dn_remove_child_components(server_dn, 1);
|
||||||
|
names[i].status = DRSUAPI_DS_NAME_STATUS_OK;
|
||||||
|
names[i].dns_domain_name = samdb_dn_to_dnshostname(sam_ctx, mem_ctx,
|
||||||
|
server_dn);
|
||||||
|
if(!names[i].dns_domain_name) {
|
||||||
|
DEBUG(4, ("list_roles: Failed to find dNSHostName for server %s",
|
||||||
|
ldb_dn_get_linearized(server_dn)));
|
||||||
|
}
|
||||||
|
names[i].result_name = talloc_strdup(mem_ctx, ldb_dn_get_linearized(role_owner_dn));
|
||||||
|
}
|
||||||
|
|
||||||
|
(*ctr1)->count = count;
|
||||||
|
(*ctr1)->array = names;
|
||||||
|
|
||||||
|
return WERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
WERROR dcesrv_drsuapi_CrackNamesByNameFormat(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
|
||||||
|
const struct drsuapi_DsNameRequest1 *req1,
|
||||||
|
struct drsuapi_DsNameCtr1 **ctr1)
|
||||||
|
{
|
||||||
|
struct drsuapi_DsNameInfo1 *names;
|
||||||
|
uint32_t i, count;
|
||||||
|
WERROR status;
|
||||||
|
|
||||||
|
*ctr1 = talloc(mem_ctx, struct drsuapi_DsNameCtr1);
|
||||||
|
W_ERROR_HAVE_NO_MEMORY(*ctr1);
|
||||||
|
|
||||||
|
count = req1->count;
|
||||||
|
names = talloc_array(mem_ctx, struct drsuapi_DsNameInfo1, count);
|
||||||
|
W_ERROR_HAVE_NO_MEMORY(names);
|
||||||
|
|
||||||
|
for (i=0; i < count; i++) {
|
||||||
|
status = DsCrackNameOneName(sam_ctx, mem_ctx,
|
||||||
|
req1->format_flags,
|
||||||
|
req1->format_offered,
|
||||||
|
req1->format_desired,
|
||||||
|
req1->names[i].str,
|
||||||
|
&names[i]);
|
||||||
|
if (!W_ERROR_IS_OK(status)) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(*ctr1)->count = count;
|
||||||
|
(*ctr1)->array = names;
|
||||||
|
|
||||||
|
return WERR_OK;
|
||||||
|
}
|
||||||
|
@@ -406,14 +406,12 @@ static WERROR dcesrv_drsuapi_DsGetNT4ChangeLog(struct dcesrv_call_state *dce_cal
|
|||||||
DRSUAPI_UNSUPPORTED(drsuapi_DsGetNT4ChangeLog);
|
DRSUAPI_UNSUPPORTED(drsuapi_DsGetNT4ChangeLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
drsuapi_DsCrackNames
|
drsuapi_DsCrackNames
|
||||||
*/
|
*/
|
||||||
static WERROR dcesrv_drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
static WERROR dcesrv_drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
||||||
struct drsuapi_DsCrackNames *r)
|
struct drsuapi_DsCrackNames *r)
|
||||||
{
|
{
|
||||||
WERROR status;
|
|
||||||
struct drsuapi_bind_state *b_state;
|
struct drsuapi_bind_state *b_state;
|
||||||
struct dcesrv_handle *h;
|
struct dcesrv_handle *h;
|
||||||
|
|
||||||
@@ -427,37 +425,36 @@ static WERROR dcesrv_drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TA
|
|||||||
|
|
||||||
switch (r->in.level) {
|
switch (r->in.level) {
|
||||||
case 1: {
|
case 1: {
|
||||||
struct drsuapi_DsNameCtr1 *ctr1;
|
switch(r->in.req->req1.format_offered){
|
||||||
struct drsuapi_DsNameInfo1 *names;
|
case DRSUAPI_DS_NAME_FORMAT_UPN_AND_ALTSECID:
|
||||||
uint32_t i, count;
|
case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT_NAME_SANS_DOMAIN_EX:
|
||||||
|
case DRSUAPI_DS_NAME_FORMAT_LIST_GLOBAL_CATALOG_SERVERS:
|
||||||
ctr1 = talloc(mem_ctx, struct drsuapi_DsNameCtr1);
|
case DRSUAPI_DS_NAME_FORMAT_UPN_FOR_LOGON:
|
||||||
W_ERROR_HAVE_NO_MEMORY(ctr1);
|
case DRSUAPI_DS_NAME_FORMAT_LIST_SERVERS_WITH_DCS_IN_SITE:
|
||||||
|
case DRSUAPI_DS_NAME_FORMAT_STRING_SID_NAME:
|
||||||
count = r->in.req->req1.count;
|
case DRSUAPI_DS_NAME_FORMAT_ALT_SECURITY_IDENTITIES_NAME:
|
||||||
names = talloc_array(mem_ctx, struct drsuapi_DsNameInfo1, count);
|
case DRSUAPI_DS_NAME_FORMAT_LIST_NCS:
|
||||||
W_ERROR_HAVE_NO_MEMORY(names);
|
case DRSUAPI_DS_NAME_FORMAT_LIST_DOMAINS:
|
||||||
|
case DRSUAPI_DS_NAME_FORMAT_MAP_SCHEMA_GUID:
|
||||||
for (i=0; i < count; i++) {
|
case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT_NAME_SANS_DOMAIN:
|
||||||
status = DsCrackNameOneName(b_state->sam_ctx, mem_ctx,
|
case DRSUAPI_DS_NAME_FORMAT_LIST_INFO_FOR_SERVER:
|
||||||
r->in.req->req1.format_flags,
|
case DRSUAPI_DS_NAME_FORMAT_LIST_SERVERS_FOR_DOMAIN_IN_SITE:
|
||||||
r->in.req->req1.format_offered,
|
case DRSUAPI_DS_NAME_FORMAT_LIST_DOMAINS_IN_SITE:
|
||||||
r->in.req->req1.format_desired,
|
case DRSUAPI_DS_NAME_FORMAT_LIST_SERVERS_IN_SITE:
|
||||||
r->in.req->req1.names[i].str,
|
case DRSUAPI_DS_NAME_FORMAT_LIST_SITES:
|
||||||
&names[i]);
|
DEBUG(0, ("DsCrackNames: Unsupported operation requested: %X",
|
||||||
if (!W_ERROR_IS_OK(status)) {
|
r->in.req->req1.format_offered));
|
||||||
return status;
|
return WERR_OK;
|
||||||
}
|
case DRSUAPI_DS_NAME_FORMAT_LIST_ROLES:
|
||||||
|
return dcesrv_drsuapi_ListRoles(b_state->sam_ctx, mem_ctx,
|
||||||
|
&r->in.req->req1, &r->out.ctr->ctr1);
|
||||||
|
default:/* format_offered is in the enum drsuapi_DsNameFormat*/
|
||||||
|
return dcesrv_drsuapi_CrackNamesByNameFormat(b_state->sam_ctx, mem_ctx,
|
||||||
|
&r->in.req->req1, &r->out.ctr->ctr1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctr1->count = count;
|
|
||||||
ctr1->array = names;
|
|
||||||
r->out.ctr->ctr1 = ctr1;
|
|
||||||
|
|
||||||
return WERR_OK;
|
return WERR_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return WERR_UNKNOWN_LEVEL;
|
return WERR_UNKNOWN_LEVEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user