Implement NETLOGON GetDCName client side. You can ask a DC for the name of
authorVolker Lendecke <vlendec@samba.org>
Fri, 2 Apr 2004 12:56:18 +0000 (12:56 +0000)
committerVolker Lendecke <vlendec@samba.org>
Fri, 2 Apr 2004 12:56:18 +0000 (12:56 +0000)
a DC it trusts.

Volker
(This used to be commit ae6840320ff47827c2817549fe3133a57e3fe77f)

source3/include/rpc_netlogon.h
source3/rpc_client/cli_netlogon.c
source3/rpc_parse/parse_net.c
source3/rpcclient/cmd_netlogon.c

index 74e3a50ee4a64c345cbde9eca192d0d0df9d61a6..a5b93b0238a3479428907ba562f1538f7361bd6e 100644 (file)
@@ -33,6 +33,7 @@
 #define NET_SRVPWSET           0x06
 #define NET_SAM_DELTAS         0x07
 #define NET_LOGON_CTRL         0x0c
+#define NET_GETDCNAME          0x0d
 #define NET_AUTH2              0x0f
 #define NET_LOGON_CTRL2                0x0e
 #define NET_SAM_SYNC           0x10
@@ -298,6 +299,25 @@ typedef struct net_r_logon_ctrl2_info
 
 } NET_R_LOGON_CTRL2;
 
+/* NET_Q_GETDCNAME - Ask a DC for a trusted DC name */
+
+typedef struct net_q_getdcname
+{
+       uint32  ptr_logon_server;
+       UNISTR2 uni_logon_server;
+       uint32  ptr_domainname;
+       UNISTR2 uni_domainname;
+} NET_Q_GETDCNAME;
+
+/* NET_R_GETDCNAME - Ask a DC for a trusted DC name */
+
+typedef struct net_r_getdcname
+{
+       uint32  ptr_dcname;
+       UNISTR2 uni_dcname;
+       NTSTATUS status;
+} NET_R_GETDCNAME;
+
 /* NET_Q_TRUST_DOM_LIST - LSA Query Trusted Domains */
 typedef struct net_q_trust_dom_info
 {
index 70ac4603034a6f57eb7a0d863c3a2c1046351e0a..f6d88a195016dc84fa89282319c9fed1f98c7581 100644 (file)
@@ -331,6 +331,55 @@ NTSTATUS cli_netlogon_logon_ctrl2(struct cli_state *cli, TALLOC_CTX *mem_ctx,
        return result;
 }
 
+/* GetDCName */
+
+NTSTATUS cli_netlogon_getdcname(struct cli_state *cli, TALLOC_CTX *mem_ctx,
+                               const char *domainname, fstring dcname)
+{
+       prs_struct qbuf, rbuf;
+       NET_Q_GETDCNAME q;
+       NET_R_GETDCNAME r;
+       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+
+       ZERO_STRUCT(q);
+       ZERO_STRUCT(r);
+
+       /* Initialise parse structures */
+
+       prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
+
+       /* Initialise input parameters */
+
+       init_net_q_getdcname(&q, cli->srv_name_slash, domainname);
+
+       /* Marshall data and send request */
+
+       if (!net_io_q_getdcname("", &q, &qbuf, 0) ||
+           !rpc_api_pipe_req(cli, NET_GETDCNAME, &qbuf, &rbuf)) {
+               result = NT_STATUS_UNSUCCESSFUL;
+               goto done;
+       }
+
+       /* Unmarshall response */
+
+       if (!net_io_r_getdcname("", &r, &rbuf, 0)) {
+               result = NT_STATUS_UNSUCCESSFUL;
+               goto done;
+       }
+
+       result = r.status;
+
+       if (NT_STATUS_IS_OK(result))
+               rpcstr_pull_unistr2_fstring(dcname, &r.uni_dcname);
+
+ done:
+       prs_mem_free(&qbuf);
+       prs_mem_free(&rbuf);
+
+       return result;
+}
+
 /****************************************************************************
 Generate the next creds to use.
 ****************************************************************************/
index 90cd348f5a81c8e3b53dd9b6a82662da8c6e47bf..a98738b51f0adbe45754ae770f42fca7d70b2ecc 100644 (file)
@@ -424,6 +424,90 @@ BOOL net_io_r_logon_ctrl(const char *desc, NET_R_LOGON_CTRL *r_l, prs_struct *ps
        return True;
 }
 
+/*******************************************************************
+ Inits an NET_R_GETDCNAME structure.
+********************************************************************/
+void init_net_q_getdcname(NET_Q_GETDCNAME *r_t, const char *logon_server,
+                         const char *domainname)
+{
+       DEBUG(5,("init_r_getdcname\n"));
+
+       r_t->ptr_logon_server = (logon_server != NULL);
+       init_unistr2(&r_t->uni_logon_server, logon_server, UNI_STR_TERMINATE);
+       r_t->ptr_domainname = (domainname != NULL);
+       init_unistr2(&r_t->uni_domainname, domainname, UNI_STR_TERMINATE);
+}
+
+/*******************************************************************
+ Reads or writes an NET_Q_GETDCNAME structure.
+********************************************************************/
+
+BOOL net_io_q_getdcname(const char *desc, NET_Q_GETDCNAME *r_t, prs_struct *ps,
+                       int depth)
+{
+       if (r_t == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "net_io_q_getdcname");
+       depth++;
+
+       if (!prs_uint32("ptr_logon_server", ps, depth, &r_t->ptr_logon_server))
+               return False;
+
+       if (!smb_io_unistr2("logon_server", &r_t->uni_logon_server,
+                           r_t->ptr_logon_server, ps, depth))
+               return False;
+
+       if (!prs_align(ps))
+               return False;
+
+       if (!prs_uint32("ptr_domainname", ps, depth, &r_t->ptr_domainname))
+               return False;
+
+       if (!smb_io_unistr2("domainname", &r_t->uni_domainname,
+                           r_t->ptr_domainname, ps, depth))
+               return False;
+
+       return True;
+}
+
+
+/*******************************************************************
+ Inits an NET_R_GETDCNAME structure.
+********************************************************************/
+void init_net_r_getdcname(NET_R_GETDCNAME *r_t, const char *dcname)
+{
+       DEBUG(5,("init_r_getdcname\n"));
+
+       init_unistr2(&r_t->uni_dcname, dcname, UNI_STR_TERMINATE);
+}
+
+/*******************************************************************
+ Reads or writes an NET_R_GETDCNAME structure.
+********************************************************************/
+
+BOOL net_io_r_getdcname(const char *desc, NET_R_GETDCNAME *r_t, prs_struct *ps,
+                       int depth)
+{
+       if (r_t == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "net_io_r_getdcname");
+       depth++;
+
+       if (!prs_uint32("ptr_dcname", ps, depth, &r_t->ptr_dcname))
+               return False;
+
+       if (!smb_io_unistr2("dcname", &r_t->uni_dcname,
+                           r_t->ptr_dcname, ps, depth))
+               return False;
+
+       if (!prs_ntstatus("status", ps, depth, &r_t->status))
+               return False;
+
+       return True;
+}
+
 /*******************************************************************
  Inits an NET_R_TRUST_DOM_LIST structure.
 ********************************************************************/
index a48b59bf6a38ec31b4a49dd77aec08c5b53dfa5c..9e281fefce444538df98cc215f23e3e195139b81 100644 (file)
@@ -45,6 +45,31 @@ static NTSTATUS cmd_netlogon_logon_ctrl2(struct cli_state *cli,
        return result;
 }
 
+static NTSTATUS cmd_netlogon_getdcname(struct cli_state *cli, 
+                                      TALLOC_CTX *mem_ctx, int argc, 
+                                      const char **argv)
+{
+       fstring dcname;
+       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+
+       if (argc != 2) {
+               fprintf(stderr, "Usage: %s domainname\n", argv[0]);
+               return NT_STATUS_OK;
+       }
+
+       result = cli_netlogon_getdcname(cli, mem_ctx, argv[1], dcname);
+
+       if (!NT_STATUS_IS_OK(result))
+               goto done;
+
+       /* Display results */
+
+       printf("%s\n", dcname);
+
+ done:
+       return result;
+}
+
 static NTSTATUS cmd_netlogon_logon_ctrl(struct cli_state *cli, 
                                         TALLOC_CTX *mem_ctx, int argc, 
                                         const char **argv)
@@ -309,6 +334,7 @@ struct cmd_set netlogon_commands[] = {
        { "NETLOGON" },
 
        { "logonctrl2", RPC_RTYPE_NTSTATUS, cmd_netlogon_logon_ctrl2, NULL, PI_NETLOGON, "Logon Control 2",     "" },
+       { "getdcname", RPC_RTYPE_NTSTATUS, cmd_netlogon_getdcname, NULL, PI_NETLOGON, "Get trusted DC name",     "" },
        { "logonctrl",  RPC_RTYPE_NTSTATUS, cmd_netlogon_logon_ctrl,  NULL, PI_NETLOGON, "Logon Control",       "" },
        { "samsync",    RPC_RTYPE_NTSTATUS, cmd_netlogon_sam_sync,    NULL, PI_NETLOGON, "Sam Synchronisation", "" },
        { "samdeltas",  RPC_RTYPE_NTSTATUS, cmd_netlogon_sam_deltas,  NULL, PI_NETLOGON, "Query Sam Deltas",    "" },