From 0eae576b194a8e37a117b0bc4528e1ba4c4848f1 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Sat, 24 May 2008 00:58:45 +0200 Subject: drsuapi: fix the build. Guenther (This used to be commit b2421c81164da2a5ea4bb2391e4f2c410938db42) --- source3/rpcclient/cmd_drsuapi.c | 111 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 source3/rpcclient/cmd_drsuapi.c (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c new file mode 100644 index 0000000000..759985d134 --- /dev/null +++ b/source3/rpcclient/cmd_drsuapi.c @@ -0,0 +1,111 @@ +/* + Unix SMB/CIFS implementation. + RPC pipe client + + Copyright (C) Guenther Deschner 2008 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "includes.h" +#include "rpcclient.h" + +static WERROR cmd_drsuapi_cracknames(struct rpc_pipe_client *cli, + TALLOC_CTX *mem_ctx, int argc, + const char **argv) +{ + NTSTATUS status; + WERROR werr; + int i; + + struct GUID bind_guid; + struct drsuapi_DsBindInfoCtr bind_info; + struct policy_handle bind_handle; + + int32_t level = 1; + union drsuapi_DsNameRequest req; + struct drsuapi_DsNameRequest1 req1; + int32_t level_out; + union drsuapi_DsNameCtr ctr; + struct drsuapi_DsNameString names[1]; + + if (argc < 2) { + printf("usage: %s name\n", argv[0]); + return WERR_OK; + } + + ZERO_STRUCT(bind_info); + + GUID_from_string(DRSUAPI_DS_BIND_GUID, &bind_guid); + + status = rpccli_drsuapi_DsBind(cli, mem_ctx, + &bind_guid, + NULL, + &bind_handle, + &werr); + + if (!NT_STATUS_IS_OK(status)) { + return ntstatus_to_werror(status); + } + + ZERO_STRUCT(req1); + + names[0].str = argv[1]; + + req1.codepage = 1252; /* german */ + req1.language = 0x00000407; /* german */ + req1.count = 1; + req1.names = names; + req1.format_flags = DRSUAPI_DS_NAME_FLAG_NO_FLAGS; + req1.format_offered = DRSUAPI_DS_NAME_FORMAT_UKNOWN; + req1.format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779; + + req.req1 = req1; + + status = rpccli_drsuapi_DsCrackNames(cli, mem_ctx, + &bind_handle, + level, + &req, + &level_out, + &ctr, + &werr); + + if (!NT_STATUS_IS_OK(status)) { + return ntstatus_to_werror(status); + } + + if (!W_ERROR_IS_OK(werr)) { + return werr; + } + + for (i=0; i < ctr.ctr1->count; i++) { + printf("status: %d\n", + ctr.ctr1->array[i].status); + printf("dns_domain_name: %s\n", + ctr.ctr1->array[i].dns_domain_name); + printf("result_name: %s\n", + ctr.ctr1->array[i].result_name); + } + + return werr; +} + +/* List of commands exported by this module */ + +struct cmd_set drsuapi_commands[] = { + + { "DRSUAPI" }, + { "dscracknames", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_cracknames, PI_DRSUAPI, NULL, "Crack Name", "" }, + { NULL } +}; -- cgit From 36f67dc5e00e96320adf870504c1e40feca034ec Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Sat, 24 May 2008 01:24:03 +0200 Subject: Revert "drsuapi: fix the build." This reverts commit b2421c81164da2a5ea4bb2391e4f2c410938db42. (This used to be commit f853f3b0aceb7e8454f9f7de38237eecec4317fd) --- source3/rpcclient/cmd_drsuapi.c | 111 ---------------------------------------- 1 file changed, 111 deletions(-) delete mode 100644 source3/rpcclient/cmd_drsuapi.c (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c deleted file mode 100644 index 759985d134..0000000000 --- a/source3/rpcclient/cmd_drsuapi.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - Unix SMB/CIFS implementation. - RPC pipe client - - Copyright (C) Guenther Deschner 2008 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "includes.h" -#include "rpcclient.h" - -static WERROR cmd_drsuapi_cracknames(struct rpc_pipe_client *cli, - TALLOC_CTX *mem_ctx, int argc, - const char **argv) -{ - NTSTATUS status; - WERROR werr; - int i; - - struct GUID bind_guid; - struct drsuapi_DsBindInfoCtr bind_info; - struct policy_handle bind_handle; - - int32_t level = 1; - union drsuapi_DsNameRequest req; - struct drsuapi_DsNameRequest1 req1; - int32_t level_out; - union drsuapi_DsNameCtr ctr; - struct drsuapi_DsNameString names[1]; - - if (argc < 2) { - printf("usage: %s name\n", argv[0]); - return WERR_OK; - } - - ZERO_STRUCT(bind_info); - - GUID_from_string(DRSUAPI_DS_BIND_GUID, &bind_guid); - - status = rpccli_drsuapi_DsBind(cli, mem_ctx, - &bind_guid, - NULL, - &bind_handle, - &werr); - - if (!NT_STATUS_IS_OK(status)) { - return ntstatus_to_werror(status); - } - - ZERO_STRUCT(req1); - - names[0].str = argv[1]; - - req1.codepage = 1252; /* german */ - req1.language = 0x00000407; /* german */ - req1.count = 1; - req1.names = names; - req1.format_flags = DRSUAPI_DS_NAME_FLAG_NO_FLAGS; - req1.format_offered = DRSUAPI_DS_NAME_FORMAT_UKNOWN; - req1.format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779; - - req.req1 = req1; - - status = rpccli_drsuapi_DsCrackNames(cli, mem_ctx, - &bind_handle, - level, - &req, - &level_out, - &ctr, - &werr); - - if (!NT_STATUS_IS_OK(status)) { - return ntstatus_to_werror(status); - } - - if (!W_ERROR_IS_OK(werr)) { - return werr; - } - - for (i=0; i < ctr.ctr1->count; i++) { - printf("status: %d\n", - ctr.ctr1->array[i].status); - printf("dns_domain_name: %s\n", - ctr.ctr1->array[i].dns_domain_name); - printf("result_name: %s\n", - ctr.ctr1->array[i].result_name); - } - - return werr; -} - -/* List of commands exported by this module */ - -struct cmd_set drsuapi_commands[] = { - - { "DRSUAPI" }, - { "dscracknames", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_cracknames, PI_DRSUAPI, NULL, "Crack Name", "" }, - { NULL } -}; -- cgit From fb05d41cb728995973d6da4b7f3b61211e9fd24d Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Sat, 24 May 2008 01:28:22 +0200 Subject: drsuapi: add very basic drsuapi rpcclient command set. Guenther (This used to be commit bd13c87bac54d4bbae7b3cd7c9dc991d143d4d89) --- source3/rpcclient/cmd_drsuapi.c | 111 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 source3/rpcclient/cmd_drsuapi.c (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c new file mode 100644 index 0000000000..759985d134 --- /dev/null +++ b/source3/rpcclient/cmd_drsuapi.c @@ -0,0 +1,111 @@ +/* + Unix SMB/CIFS implementation. + RPC pipe client + + Copyright (C) Guenther Deschner 2008 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "includes.h" +#include "rpcclient.h" + +static WERROR cmd_drsuapi_cracknames(struct rpc_pipe_client *cli, + TALLOC_CTX *mem_ctx, int argc, + const char **argv) +{ + NTSTATUS status; + WERROR werr; + int i; + + struct GUID bind_guid; + struct drsuapi_DsBindInfoCtr bind_info; + struct policy_handle bind_handle; + + int32_t level = 1; + union drsuapi_DsNameRequest req; + struct drsuapi_DsNameRequest1 req1; + int32_t level_out; + union drsuapi_DsNameCtr ctr; + struct drsuapi_DsNameString names[1]; + + if (argc < 2) { + printf("usage: %s name\n", argv[0]); + return WERR_OK; + } + + ZERO_STRUCT(bind_info); + + GUID_from_string(DRSUAPI_DS_BIND_GUID, &bind_guid); + + status = rpccli_drsuapi_DsBind(cli, mem_ctx, + &bind_guid, + NULL, + &bind_handle, + &werr); + + if (!NT_STATUS_IS_OK(status)) { + return ntstatus_to_werror(status); + } + + ZERO_STRUCT(req1); + + names[0].str = argv[1]; + + req1.codepage = 1252; /* german */ + req1.language = 0x00000407; /* german */ + req1.count = 1; + req1.names = names; + req1.format_flags = DRSUAPI_DS_NAME_FLAG_NO_FLAGS; + req1.format_offered = DRSUAPI_DS_NAME_FORMAT_UKNOWN; + req1.format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779; + + req.req1 = req1; + + status = rpccli_drsuapi_DsCrackNames(cli, mem_ctx, + &bind_handle, + level, + &req, + &level_out, + &ctr, + &werr); + + if (!NT_STATUS_IS_OK(status)) { + return ntstatus_to_werror(status); + } + + if (!W_ERROR_IS_OK(werr)) { + return werr; + } + + for (i=0; i < ctr.ctr1->count; i++) { + printf("status: %d\n", + ctr.ctr1->array[i].status); + printf("dns_domain_name: %s\n", + ctr.ctr1->array[i].dns_domain_name); + printf("result_name: %s\n", + ctr.ctr1->array[i].result_name); + } + + return werr; +} + +/* List of commands exported by this module */ + +struct cmd_set drsuapi_commands[] = { + + { "DRSUAPI" }, + { "dscracknames", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_cracknames, PI_DRSUAPI, NULL, "Crack Name", "" }, + { NULL } +}; -- cgit From b83131a16fa7b06b03cd66296ce2409475940055 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Sun, 25 May 2008 00:27:17 +0200 Subject: rpcclient: simplify drsuapi dscracknames call slightly. Guenther (This used to be commit 5611cf42530072bc244a7bed258d3ac959bd0b65) --- source3/rpcclient/cmd_drsuapi.c | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c index 759985d134..f625aa6300 100644 --- a/source3/rpcclient/cmd_drsuapi.c +++ b/source3/rpcclient/cmd_drsuapi.c @@ -30,12 +30,10 @@ static WERROR cmd_drsuapi_cracknames(struct rpc_pipe_client *cli, int i; struct GUID bind_guid; - struct drsuapi_DsBindInfoCtr bind_info; struct policy_handle bind_handle; int32_t level = 1; union drsuapi_DsNameRequest req; - struct drsuapi_DsNameRequest1 req1; int32_t level_out; union drsuapi_DsNameCtr ctr; struct drsuapi_DsNameString names[1]; @@ -45,8 +43,6 @@ static WERROR cmd_drsuapi_cracknames(struct rpc_pipe_client *cli, return WERR_OK; } - ZERO_STRUCT(bind_info); - GUID_from_string(DRSUAPI_DS_BIND_GUID, &bind_guid); status = rpccli_drsuapi_DsBind(cli, mem_ctx, @@ -59,19 +55,15 @@ static WERROR cmd_drsuapi_cracknames(struct rpc_pipe_client *cli, return ntstatus_to_werror(status); } - ZERO_STRUCT(req1); - names[0].str = argv[1]; - req1.codepage = 1252; /* german */ - req1.language = 0x00000407; /* german */ - req1.count = 1; - req1.names = names; - req1.format_flags = DRSUAPI_DS_NAME_FLAG_NO_FLAGS; - req1.format_offered = DRSUAPI_DS_NAME_FORMAT_UKNOWN; - req1.format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779; - - req.req1 = req1; + req.req1.codepage = 1252; /* german */ + req.req1.language = 0x00000407; /* german */ + req.req1.count = 1; + req.req1.names = names; + req.req1.format_flags = DRSUAPI_DS_NAME_FLAG_NO_FLAGS; + req.req1.format_offered = DRSUAPI_DS_NAME_FORMAT_UKNOWN; + req.req1.format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779; status = rpccli_drsuapi_DsCrackNames(cli, mem_ctx, &bind_handle, -- cgit From 6db0efbea075a0cbe660bc6edf6aca384c761a2a Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Sun, 25 May 2008 01:52:40 +0200 Subject: rpcclient: call drsuapi_DsUnbind() when finished with DsCrackNames call. Guenther (This used to be commit d70376fc4faaf9a55337c57035e42afa6a007d1a) --- source3/rpcclient/cmd_drsuapi.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c index f625aa6300..6c8fe3df49 100644 --- a/source3/rpcclient/cmd_drsuapi.c +++ b/source3/rpcclient/cmd_drsuapi.c @@ -74,11 +74,12 @@ static WERROR cmd_drsuapi_cracknames(struct rpc_pipe_client *cli, &werr); if (!NT_STATUS_IS_OK(status)) { - return ntstatus_to_werror(status); + werr = ntstatus_to_werror(status); + goto out; } if (!W_ERROR_IS_OK(werr)) { - return werr; + goto out; } for (i=0; i < ctr.ctr1->count; i++) { @@ -90,6 +91,11 @@ static WERROR cmd_drsuapi_cracknames(struct rpc_pipe_client *cli, ctr.ctr1->array[i].result_name); } + out: + if (is_valid_policy_hnd(&bind_handle)) { + rpccli_drsuapi_DsUnbind(cli, mem_ctx, &bind_handle, &werr); + } + return werr; } -- cgit From 09f55d0ef62391946b4f98737c788bce06f58a41 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Sun, 25 May 2008 01:53:21 +0200 Subject: rpcclient: add drsuapi dsgetdcinfo call. Guenther (This used to be commit 1e883c88cb667a1485de8e8bbaebb43542f43065) --- source3/rpcclient/cmd_drsuapi.c | 161 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c index 6c8fe3df49..8617f56bb8 100644 --- a/source3/rpcclient/cmd_drsuapi.c +++ b/source3/rpcclient/cmd_drsuapi.c @@ -99,11 +99,172 @@ static WERROR cmd_drsuapi_cracknames(struct rpc_pipe_client *cli, return werr; } +static void display_domain_controller_info_01(struct drsuapi_DsGetDCConnection01 *r) +{ + printf("client_ip_address:\t%s\n", r->client_ip_address); + printf("unknown2:\t%d\n", r->unknown2); + printf("connection_time:\t%d\n", r->connection_time); + printf("unknown4:\t%d\n", r->unknown4); + printf("unknown5:\t%d\n", r->unknown5); + printf("unknown6:\t%d\n", r->unknown6); + printf("client_account:\t%s\n", r->client_account); +} + +static void display_domain_controller_info_1(struct drsuapi_DsGetDCInfo1 *r) +{ + printf("netbios_name:\t%s\n", r->netbios_name); + printf("dns_name:\t%s\n", r->dns_name); + printf("site_name:\t%s\n", r->site_name); + printf("computer_dn:\t%s\n", r->computer_dn); + printf("server_dn:\t%s\n", r->server_dn); + printf("is_pdc:\t\t%s\n", r->is_pdc ? "true" : "false"); + printf("is_enabled:\t%s\n", r->is_enabled ? "true" : "false"); +} + +static void display_domain_controller_info_2(struct drsuapi_DsGetDCInfo2 *r) +{ + printf("netbios_name:\t%s\n", r->netbios_name); + printf("dns_name:\t%s\n", r->dns_name); + printf("site_name:\t%s\n", r->site_name); + printf("site_dn:\t%s\n", r->site_dn); + printf("computer_dn:\t%s\n", r->computer_dn); + printf("server_dn:\t%s\n", r->server_dn); + printf("ntds_dn:\t%s\n", r->ntds_dn); + printf("is_pdc:\t\t%s\n", r->is_pdc ? "true" : "false"); + printf("is_enabled:\t%s\n", r->is_enabled ? "true" : "false"); + printf("is_gc:\t\t%s\n", r->is_gc ? "true" : "false"); + printf("site_guid:\t%s\n", GUID_string(talloc_tos(), &r->site_guid)); + printf("computer_guid:\t%s\n", GUID_string(talloc_tos(), &r->computer_guid)); + printf("server_guid:\t%s\n", GUID_string(talloc_tos(), &r->server_guid)); + printf("ntds_guid:\t%s\n", GUID_string(talloc_tos(), &r->ntds_guid)); +} + +static void display_domain_controller_info_3(struct drsuapi_DsGetDCInfo3 *r) +{ + printf("netbios_name:\t%s\n", r->netbios_name); + printf("dns_name:\t%s\n", r->dns_name); + printf("site_name:\t%s\n", r->site_name); + printf("site_dn:\t%s\n", r->site_dn); + printf("computer_dn:\t%s\n", r->computer_dn); + printf("server_dn:\t%s\n", r->server_dn); + printf("ntds_dn:\t%s\n", r->ntds_dn); + printf("is_pdc:\t\t%s\n", r->is_pdc ? "true" : "false"); + printf("is_enabled:\t%s\n", r->is_enabled ? "true" : "false"); + printf("is_gc:\t\t%s\n", r->is_gc ? "true" : "false"); + printf("is_rodc:\t%s\n", r->is_rodc ? "true" : "false"); + printf("site_guid:\t%s\n", GUID_string(talloc_tos(), &r->site_guid)); + printf("computer_guid:\t%s\n", GUID_string(talloc_tos(), &r->computer_guid)); + printf("server_guid:\t%s\n", GUID_string(talloc_tos(), &r->server_guid)); + printf("ntds_guid:\t%s\n", GUID_string(talloc_tos(), &r->ntds_guid)); +} + +static void display_domain_controller_info(int32_t level, + union drsuapi_DsGetDCInfoCtr *ctr) +{ + int i; + + switch (level) { + case DRSUAPI_DC_CONNECTION_CTR_01: + for (i=0; ictr01.count; i++) { + printf("----------\n"); + display_domain_controller_info_01(&ctr->ctr01.array[i]); + } + break; + case DRSUAPI_DC_INFO_CTR_1: + for (i=0; ictr1.count; i++) { + printf("----------\n"); + display_domain_controller_info_1(&ctr->ctr1.array[i]); + } + break; + case DRSUAPI_DC_INFO_CTR_2: + for (i=0; ictr2.count; i++) { + printf("----------\n"); + display_domain_controller_info_2(&ctr->ctr2.array[i]); + } + break; + case DRSUAPI_DC_INFO_CTR_3: + for (i=0; ictr3.count; i++) { + printf("----------\n"); + display_domain_controller_info_3(&ctr->ctr3.array[i]); + } + break; + default: + break; + } +} + +static WERROR cmd_drsuapi_getdcinfo(struct rpc_pipe_client *cli, + TALLOC_CTX *mem_ctx, int argc, + const char **argv) +{ + NTSTATUS status; + WERROR werr; + + struct GUID bind_guid; + struct policy_handle bind_handle; + + const char *domain = NULL; + int32_t level = 1; + int32_t level_out; + union drsuapi_DsGetDCInfoRequest req; + union drsuapi_DsGetDCInfoCtr ctr; + + if (argc < 2) { + printf("usage: %s domain [level]\n", argv[0]); + return WERR_OK; + } + + domain = argv[1]; + if (argc >= 3) { + level = atoi(argv[2]); + } + + GUID_from_string(DRSUAPI_DS_BIND_GUID, &bind_guid); + + status = rpccli_drsuapi_DsBind(cli, mem_ctx, + &bind_guid, + NULL, + &bind_handle, + &werr); + + if (!NT_STATUS_IS_OK(status)) { + return ntstatus_to_werror(status); + } + + req.req1.domain_name = domain; + req.req1.level = level; + + status = rpccli_drsuapi_DsGetDomainControllerInfo(cli, mem_ctx, + &bind_handle, + 1, + &req, + &level_out, + &ctr, + &werr); + if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); + goto out; + } + + if (!W_ERROR_IS_OK(werr)) { + goto out; + } + + display_domain_controller_info(level_out, &ctr); + out: + if (is_valid_policy_hnd(&bind_handle)) { + rpccli_drsuapi_DsUnbind(cli, mem_ctx, &bind_handle, &werr); + } + + return werr; +} + /* List of commands exported by this module */ struct cmd_set drsuapi_commands[] = { { "DRSUAPI" }, { "dscracknames", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_cracknames, PI_DRSUAPI, NULL, "Crack Name", "" }, + { "dsgetdcinfo", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_getdcinfo, PI_DRSUAPI, NULL, "Get Domain Controller Info", "" }, { NULL } }; -- cgit From 8fd045f9187b24e46f95146af5bc63cd632df0c0 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 11 Jun 2008 10:12:29 +0200 Subject: rpcclient: add more generic internal dscracknames call. Guenther (This used to be commit 2351b0845ca78707901daca6a6d0425959c6f28e) --- source3/rpcclient/cmd_drsuapi.c | 83 ++++++++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 26 deletions(-) (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c index 8617f56bb8..ca041be597 100644 --- a/source3/rpcclient/cmd_drsuapi.c +++ b/source3/rpcclient/cmd_drsuapi.c @@ -21,6 +21,56 @@ #include "includes.h" #include "rpcclient.h" +static WERROR cracknames(struct rpc_pipe_client *cli, + TALLOC_CTX *mem_ctx, + struct policy_handle *bind_handle, + enum drsuapi_DsNameFormat format_offered, + enum drsuapi_DsNameFormat format_desired, + int argc, + const char **argv, + union drsuapi_DsNameCtr *ctr) +{ + NTSTATUS status; + WERROR werr; + int i; + int32_t level = 1; + union drsuapi_DsNameRequest req; + int32_t level_out; + struct drsuapi_DsNameString *names; + + names = TALLOC_ZERO_ARRAY(mem_ctx, struct drsuapi_DsNameString, argc); + W_ERROR_HAVE_NO_MEMORY(names); + + for (i=0; i Date: Thu, 17 Jul 2008 18:53:00 +0200 Subject: rpcclient: for testing, add dsgetncchanges command. Guenther (This used to be commit 54f14b382441491c09daa76960f54a2d090a8bd6) --- source3/rpcclient/cmd_drsuapi.c | 229 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c index ca041be597..2593a43140 100644 --- a/source3/rpcclient/cmd_drsuapi.c +++ b/source3/rpcclient/cmd_drsuapi.c @@ -290,6 +290,234 @@ static WERROR cmd_drsuapi_getdcinfo(struct rpc_pipe_client *cli, return werr; } +static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli, + TALLOC_CTX *mem_ctx, int argc, + const char **argv) +{ + NTSTATUS status; + WERROR werr; + + struct policy_handle bind_handle; + + struct GUID bind_guid; + struct drsuapi_DsBindInfoCtr bind_info; + struct drsuapi_DsBindInfo28 info28; + + const char *nc_dn = NULL; + + DATA_BLOB session_key; + + int32_t level = 8; + int32_t level_out = 0; + union drsuapi_DsGetNCChangesRequest req; + union drsuapi_DsGetNCChangesCtr ctr; + struct drsuapi_DsReplicaObjectIdentifier nc; + struct dom_sid null_sid; + + struct drsuapi_DsGetNCChangesCtr1 *ctr1 = NULL; + struct drsuapi_DsGetNCChangesCtr6 *ctr6 = NULL; + int32_t out_level = 0; + int y; + + if (argc > 2) { + printf("usage: %s naming_context_dn\n", argv[0]); + return WERR_OK; + } + + if (argc >= 2) { + nc_dn = argv[1]; + } + + ZERO_STRUCT(info28); + + ZERO_STRUCT(null_sid); + ZERO_STRUCT(req); + + GUID_from_string(DRSUAPI_DS_BIND_GUID, &bind_guid); + + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_BASE; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_ASYNC_REPLICATION; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_REMOVEAPI; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_MOVEREQ_V2; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_GETCHG_COMPRESS; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V1; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_RESTORE_USN_OPTIMIZATION; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_KCC_EXECUTE; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_ADDENTRY_V2; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_LINKED_VALUE_REPLICATION; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V2; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_INSTANCE_TYPE_NOT_REQ_ON_MOD; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_CRYPTO_BIND; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_GET_REPL_INFO; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_STRONG_ENCRYPTION; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V01; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_TRANSITIVE_MEMBERSHIP; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_ADD_SID_HISTORY; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_POST_BETA3; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_GET_MEMBERSHIPS2; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V6; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_NONDOMAIN_NCS; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V5; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V6; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_ADDENTRYREPLY_V3; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V7; + info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_VERIFY_OBJECT; + info28.site_guid = GUID_zero(); + info28.u1 = 508; + info28.repl_epoch = 0; + + bind_info.length = 28; + bind_info.info.info28 = info28; + + status = rpccli_drsuapi_DsBind(cli, mem_ctx, + &bind_guid, + &bind_info, + &bind_handle, + &werr); + + if (!NT_STATUS_IS_OK(status)) { + return ntstatus_to_werror(status); + } + + if (!W_ERROR_IS_OK(werr)) { + return werr; + } + + if (!nc_dn) { + + union drsuapi_DsNameCtr crack_ctr; + const char *name; + + name = talloc_asprintf(mem_ctx, "%s\\", lp_workgroup()); + W_ERROR_HAVE_NO_MEMORY(name); + + werr = cracknames(cli, mem_ctx, + &bind_handle, + DRSUAPI_DS_NAME_FORMAT_UKNOWN, + DRSUAPI_DS_NAME_FORMAT_FQDN_1779, + 1, + &name, + &crack_ctr); + if (!W_ERROR_IS_OK(werr)) { + return werr; + } + + if (crack_ctr.ctr1->count != 1) { + return WERR_NO_SUCH_DOMAIN; + } + + if (crack_ctr.ctr1->array[0].status != DRSUAPI_DS_NAME_STATUS_OK) { + return WERR_NO_SUCH_DOMAIN; + } + + nc_dn = talloc_strdup(mem_ctx, crack_ctr.ctr1->array[0].result_name); + W_ERROR_HAVE_NO_MEMORY(nc_dn); + + printf("using: %s\n", nc_dn); + } + + nc.dn = nc_dn; + nc.guid = GUID_zero(); + nc.sid = null_sid; + + req.req8.naming_context = &nc; + req.req8.replica_flags = DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE | + DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP | + DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS | + DRSUAPI_DS_REPLICA_NEIGHBOUR_RETURN_OBJECT_PARENTS | + DRSUAPI_DS_REPLICA_NEIGHBOUR_NEVER_SYNCED; + req.req8.max_object_count = 402; + req.req8.max_ndr_size = 402116; + + for (y=0; ;y++) { + + if (level == 8) { + DEBUG(1,("start[%d] tmp_higest_usn: %llu , highest_usn: %llu\n",y, + (long long)req.req8.highwatermark.tmp_highest_usn, + (long long)req.req8.highwatermark.highest_usn)); + } + + status = rpccli_drsuapi_DsGetNCChanges(cli, mem_ctx, + &bind_handle, + level, + &req, + &level_out, + &ctr, + &werr); + if (!NT_STATUS_IS_OK(status)) { + printf("Failed to get NC Changes: %s", + get_friendly_werror_msg(werr)); + goto out; + } + + if (!W_ERROR_IS_OK(werr)) { + status = werror_to_ntstatus(werr); + goto out; + } + + if (level_out == 1) { + out_level = 1; + ctr1 = &ctr.ctr1; + } else if (level_out == 2) { + out_level = 1; + ctr1 = ctr.ctr2.ctr.mszip1.ctr1; + } + + status = cli_get_session_key(mem_ctx, cli, &session_key); + if (!NT_STATUS_IS_OK(status)) { + printf("Failed to get Session Key: %s", + nt_errstr(status)); + return ntstatus_to_werror(status); + } + + if (out_level == 1) { + DEBUG(1,("end[%d] tmp_highest_usn: %llu , highest_usn: %llu\n",y, + (long long)ctr1->new_highwatermark.tmp_highest_usn, + (long long)ctr1->new_highwatermark.highest_usn)); +#if 0 + libnet_dssync_decrypt_attributes(mem_ctx, + &session_key, + ctr1->first_object); +#endif + if (ctr1->more_data) { + req.req5.highwatermark = ctr1->new_highwatermark; + continue; + } + } + + if (level_out == 6) { + out_level = 6; + ctr6 = &ctr.ctr6; + } else if (level_out == 7 + && ctr.ctr7.level == 6 + && ctr.ctr7.type == DRSUAPI_COMPRESSION_TYPE_MSZIP) { + out_level = 6; + ctr6 = ctr.ctr7.ctr.mszip6.ctr6; + } + + if (out_level == 6) { + DEBUG(1,("end[%d] tmp_highest_usn: %llu , highest_usn: %llu\n",y, + (long long)ctr6->new_highwatermark.tmp_highest_usn, + (long long)ctr6->new_highwatermark.highest_usn)); +#if 0 + libnet_dssync_decrypt_attributes(mem_ctx, + &session_key, + ctr6->first_object); +#endif + if (ctr6->more_data) { + req.req8.highwatermark = ctr6->new_highwatermark; + continue; + } + } + + break; + } + + out: + return werr; +} + /* List of commands exported by this module */ struct cmd_set drsuapi_commands[] = { @@ -297,5 +525,6 @@ struct cmd_set drsuapi_commands[] = { { "DRSUAPI" }, { "dscracknames", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_cracknames, PI_DRSUAPI, NULL, "Crack Name", "" }, { "dsgetdcinfo", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_getdcinfo, PI_DRSUAPI, NULL, "Get Domain Controller Info", "" }, + { "dsgetncchanges", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_getncchanges, PI_DRSUAPI, NULL, "Get NC Changes", "" }, { NULL } }; -- cgit From f52b17f25cf2b332433562bfe998b1469ac1ed66 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Thu, 17 Jul 2008 23:27:38 +0200 Subject: rpcclient: use level 5 or level 8 in dsgetncchanges command based on bind-info. Michael (This used to be commit 3ab2e7fada1f31e87337065b5bc30a7b92a6d117) --- source3/rpcclient/cmd_drsuapi.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c index 2593a43140..a1604d82a0 100644 --- a/source3/rpcclient/cmd_drsuapi.c +++ b/source3/rpcclient/cmd_drsuapi.c @@ -319,6 +319,13 @@ static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli, int32_t out_level = 0; int y; + uint32_t supported_extensions = 0; + uint32_t replica_flags = DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE | + DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP | + DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS | + DRSUAPI_DS_REPLICA_NEIGHBOUR_RETURN_OBJECT_PARENTS | + DRSUAPI_DS_REPLICA_NEIGHBOUR_NEVER_SYNCED; + if (argc > 2) { printf("usage: %s naming_context_dn\n", argv[0]); return WERR_OK; @@ -384,6 +391,12 @@ static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli, return werr; } + if (bind_info.length == 24) { + supported_extensions = bind_info.info.info24.supported_extensions; + } else if (bind_info.length == 28) { + supported_extensions = bind_info.info.info28.supported_extensions; + } + if (!nc_dn) { union drsuapi_DsNameCtr crack_ctr; @@ -421,14 +434,19 @@ static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli, nc.guid = GUID_zero(); nc.sid = null_sid; - req.req8.naming_context = &nc; - req.req8.replica_flags = DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE | - DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP | - DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS | - DRSUAPI_DS_REPLICA_NEIGHBOUR_RETURN_OBJECT_PARENTS | - DRSUAPI_DS_REPLICA_NEIGHBOUR_NEVER_SYNCED; - req.req8.max_object_count = 402; - req.req8.max_ndr_size = 402116; + if (supported_extensions & DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8) { + level = 8; + req.req8.naming_context = &nc; + req.req8.replica_flags = replica_flags; + req.req8.max_object_count = 402; + req.req8.max_ndr_size = 402116; + } else { + level = 5; + req.req5.naming_context = &nc; + req.req5.replica_flags = replica_flags; + req.req5.max_object_count = 402; + req.req5.max_ndr_size = 402116; + } for (y=0; ;y++) { -- cgit From 4f0e0e5e83e027edff7ef9875c9ef46be562e3a1 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 18 Jul 2008 15:10:51 +0200 Subject: rpcclient: add ability to fetch single objects with dsgetncchanges command call as "dsgetncchanges single" after calling "seal" Michael (This used to be commit c9ab2953c5af0dd3cddbe6c4cdd2b8da2734aa84) --- source3/rpcclient/cmd_drsuapi.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c index a1604d82a0..31feeceb73 100644 --- a/source3/rpcclient/cmd_drsuapi.c +++ b/source3/rpcclient/cmd_drsuapi.c @@ -308,6 +308,7 @@ static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli, DATA_BLOB session_key; int32_t level = 8; + bool single = false; int32_t level_out = 0; union drsuapi_DsGetNCChangesRequest req; union drsuapi_DsGetNCChangesCtr ctr; @@ -326,8 +327,8 @@ static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli, DRSUAPI_DS_REPLICA_NEIGHBOUR_RETURN_OBJECT_PARENTS | DRSUAPI_DS_REPLICA_NEIGHBOUR_NEVER_SYNCED; - if (argc > 2) { - printf("usage: %s naming_context_dn\n", argv[0]); + if (argc > 3) { + printf("usage: %s [naming_context_or_object_dn [single]]\n", argv[0]); return WERR_OK; } @@ -335,6 +336,15 @@ static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli, nc_dn = argv[1]; } + if (argc == 3) { + if (strequal(argv[2], "single")) { + single = true; + } else { + printf("warning: ignoring unknown argument '%s'\n", + argv[2]); + } + } + ZERO_STRUCT(info28); ZERO_STRUCT(null_sid); @@ -440,12 +450,18 @@ static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli, req.req8.replica_flags = replica_flags; req.req8.max_object_count = 402; req.req8.max_ndr_size = 402116; + if (single) { + req.req8.extended_op = DRSUAPI_EXOP_REPL_OBJ; + } } else { level = 5; req.req5.naming_context = &nc; req.req5.replica_flags = replica_flags; req.req5.max_object_count = 402; req.req5.max_ndr_size = 402116; + if (single) { + req.req5.extended_op = DRSUAPI_EXOP_REPL_OBJ; + } } for (y=0; ;y++) { -- cgit From 82b5f54f96b1161b8357a69b985c75f2853573ef Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 20 Jul 2008 18:17:52 +0200 Subject: Refactoring: rpcclient uses ndr_syntax_id instead of pipe_idx (This used to be commit 85db87c451dacf80e9575c04e9e08c625b3f1199) --- source3/rpcclient/cmd_drsuapi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c index 31feeceb73..630354fe51 100644 --- a/source3/rpcclient/cmd_drsuapi.c +++ b/source3/rpcclient/cmd_drsuapi.c @@ -557,8 +557,8 @@ static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli, struct cmd_set drsuapi_commands[] = { { "DRSUAPI" }, - { "dscracknames", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_cracknames, PI_DRSUAPI, NULL, "Crack Name", "" }, - { "dsgetdcinfo", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_getdcinfo, PI_DRSUAPI, NULL, "Get Domain Controller Info", "" }, - { "dsgetncchanges", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_getncchanges, PI_DRSUAPI, NULL, "Get NC Changes", "" }, + { "dscracknames", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_cracknames, &ndr_table_drsuapi.syntax_id, NULL, "Crack Name", "" }, + { "dsgetdcinfo", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_getdcinfo, &ndr_table_drsuapi.syntax_id, NULL, "Get Domain Controller Info", "" }, + { "dsgetncchanges", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_getncchanges, &ndr_table_drsuapi.syntax_id, NULL, "Get NC Changes", "" }, { NULL } }; -- cgit From 2d7660dcc3df2148be07152cf2337336ae54de85 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 22 Jul 2008 12:16:46 +0200 Subject: rpcclient: make DsGetNCChanges work against w2k8 (add knowledge of DsBindInfo48) Michael (This used to be commit 27ce662f5d4e1185cedc59c52f94458fb6425f5c) --- source3/rpcclient/cmd_drsuapi.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c index 630354fe51..1cef6b910b 100644 --- a/source3/rpcclient/cmd_drsuapi.c +++ b/source3/rpcclient/cmd_drsuapi.c @@ -405,6 +405,8 @@ static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli, supported_extensions = bind_info.info.info24.supported_extensions; } else if (bind_info.length == 28) { supported_extensions = bind_info.info.info28.supported_extensions; + } else if (bind_info.length == 48) { + supported_extensions = bind_info.info.info48.supported_extensions; } if (!nc_dn) { -- cgit From 2bd58bf3839d9c8b04deb84bd8d5cdc2ad9e9d97 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 22 Jul 2008 16:18:03 +0200 Subject: Change occurrences of the u1 member of DsBindInfo* to pid after idl change. Michael (This used to be commit 42f3d681cac4a443347d1ed253848d45f8746f89) --- source3/rpcclient/cmd_drsuapi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c index 1cef6b910b..ab77b4ccff 100644 --- a/source3/rpcclient/cmd_drsuapi.c +++ b/source3/rpcclient/cmd_drsuapi.c @@ -381,7 +381,7 @@ static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli, info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V7; info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_VERIFY_OBJECT; info28.site_guid = GUID_zero(); - info28.u1 = 508; + info28.pid = 508; info28.repl_epoch = 0; bind_info.length = 28; -- cgit From 3ed6cfad019f9d0efee03d7eb7469e6d713d58c2 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Mon, 28 Jul 2008 14:08:34 +0200 Subject: rpcclient: Set the pid filed of the outgoing DsBindInfo to 0. This is for debugging and informational purposes only. The assignment is implementation specific. (WSPP docs, sec. 5.35). Michael (This used to be commit 18ea033909a5363c92530ed2a06a2b89be5e7c79) --- source3/rpcclient/cmd_drsuapi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpcclient/cmd_drsuapi.c') diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c index ab77b4ccff..71757f5ea3 100644 --- a/source3/rpcclient/cmd_drsuapi.c +++ b/source3/rpcclient/cmd_drsuapi.c @@ -381,7 +381,7 @@ static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli, info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V7; info28.supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_VERIFY_OBJECT; info28.site_guid = GUID_zero(); - info28.pid = 508; + info28.pid = 0; info28.repl_epoch = 0; bind_info.length = 28; -- cgit