s/sid_to_string/sid_to_fstring/
[kamenim/samba-autobuild/.git] / source3 / rpcclient / cmd_netlogon.c
index 3010ed529707436ea3542f1fd1e9063c37b7fa2a..e997bb5090536444c31fd908c3cc8a5a47629f48 100644 (file)
@@ -1,13 +1,12 @@
 /* 
-   Unix SMB/Netbios implementation.
-   Version 1.9.
-   NT Domain Authentication SMB / MSRPC client
-   Copyright (C) Andrew Tridgell 1994-1997
-   Copyright (C) Luke Kenneth Casson Leighton 1996-1997
-   
+   Unix SMB/CIFS implementation.
+   RPC pipe client
+
+   Copyright (C) Tim Potter 2000
+
    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 2 of the License, or
+   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,
    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, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#include "includes.h"
+#include "rpcclient.h"
 
+static NTSTATUS cmd_netlogon_logon_ctrl2(struct rpc_pipe_client *cli, 
+                                         TALLOC_CTX *mem_ctx, int argc, 
+                                         const char **argv)
+{
+       uint32 query_level = 1;
+       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
 
-#ifdef SYSLOG
-#undef SYSLOG
-#endif
+       if (argc > 1) {
+               fprintf(stderr, "Usage: %s\n", argv[0]);
+               return NT_STATUS_OK;
+       }
 
-#include "includes.h"
-#include "nterr.h"
+       result = rpccli_netlogon_logon_ctrl2(cli, mem_ctx, query_level);
+
+       if (!NT_STATUS_IS_OK(result))
+               goto done;
+
+       /* Display results */
+
+ done:
+       return result;
+}
+
+static WERROR cmd_netlogon_getanydcname(struct rpc_pipe_client *cli, 
+                                       TALLOC_CTX *mem_ctx, int argc, 
+                                       const char **argv)
+{
+       fstring dcname;
+       WERROR result = WERR_GENERAL_FAILURE;
+       int old_timeout;
+
+       if (argc != 2) {
+               fprintf(stderr, "Usage: %s domainname\n", argv[0]);
+               return WERR_OK;
+       }
 
-extern int DEBUGLEVEL;
+       /* Make sure to wait for our DC's reply */
+       old_timeout = cli_set_timeout(cli->cli, MAX(cli->cli->timeout,30000)); /* 30 seconds. */
 
-#define DEBUG_TESTING
+       result = rpccli_netlogon_getanydcname(cli, mem_ctx, cli->cli->desthost, argv[1], dcname);
 
-extern struct user_credentials *usr_creds;
+       cli_set_timeout(cli->cli, old_timeout);
 
-extern FILE* out_hnd;
+       if (!W_ERROR_IS_OK(result))
+               goto done;
 
+       /* Display results */
 
-/****************************************************************************
-experimental nt login.
-****************************************************************************/
-void cmd_netlogon_login_test(struct client_info *info, int argc, char *argv[])
+       printf("%s\n", dcname);
+
+ done:
+       return result;
+}
+
+static WERROR cmd_netlogon_getdcname(struct rpc_pipe_client *cli, 
+                                    TALLOC_CTX *mem_ctx, int argc, 
+                                    const char **argv)
 {
-#if 0
-       extern BOOL global_machine_password_needs_changing;
-#endif
+       fstring dcname;
+       WERROR result = WERR_GENERAL_FAILURE;
+       int old_timeout;
 
-       fstring nt_user_name;
-       fstring password;
-       BOOL res = True;
-       char *nt_password;
-       unsigned char trust_passwd[16];
-       fstring trust_acct;
+       if (argc != 2) {
+               fprintf(stderr, "Usage: %s domainname\n", argv[0]);
+               return WERR_OK;
+       }
 
-       fstring srv_name;
-       fstrcpy(srv_name, "\\\\");
-       fstrcat(srv_name, info->dest_host);
-       strupper(srv_name);
+       /* Make sure to wait for our DC's reply */
+       old_timeout = cli_set_timeout(cli->cli, MAX(cli->cli->timeout,30000)); /* 30 seconds. */
 
-#if 0
-       /* machine account passwords */
-       pstring new_mach_pwd;
+       result = rpccli_netlogon_getdcname(cli, mem_ctx, cli->cli->desthost, argv[1], dcname);
 
-       /* initialisation */
-       new_mach_pwd[0] = 0;
-#endif
+       cli_set_timeout(cli->cli, old_timeout);
 
-       argc--;
-       argv++;
+       if (!W_ERROR_IS_OK(result))
+               goto done;
+
+       /* Display results */
+
+       printf("%s\n", dcname);
+
+ done:
+       return result;
+}
+
+static WERROR cmd_netlogon_dsr_getdcname(struct rpc_pipe_client *cli,
+                                        TALLOC_CTX *mem_ctx, int argc,
+                                        const char **argv)
+{
+       WERROR result;
+       uint32 flags = DS_RETURN_DNS_NAME;
+       const char *server_name = cli->cli->desthost;
+       const char *domain_name;
+       struct GUID domain_guid = GUID_zero();
+       struct GUID site_guid = GUID_zero();
+       struct DS_DOMAIN_CONTROLLER_INFO *info = NULL;
+
+       if (argc < 2) {
+               fprintf(stderr, "Usage: %s [domain_name] [domain_guid] "
+                               "[site_guid] [flags]\n", argv[0]);
+               return WERR_OK;
+       }
 
-       if (argc < 1)
-       {
-               fstrcpy(nt_user_name, usr_creds->user_name);
-               if (nt_user_name[0] == 0)
-               {
-                       report(out_hnd,"ntlogin: must specify username with anonymous connection\n");
-                       return;
+       if (argc >= 2)
+               domain_name = argv[1];
+
+       if (argc >= 3) {
+               if (!NT_STATUS_IS_OK(GUID_from_string(argv[2], &domain_guid))) {
+                       return WERR_NOMEM;
+               }
+       }
+
+       if (argc >= 4) {
+               if (!NT_STATUS_IS_OK(GUID_from_string(argv[3], &site_guid))) {
+                       return WERR_NOMEM;
+               }
+       }
+
+       if (argc >= 5)
+               sscanf(argv[4], "%x", &flags);
+
+       debug_dsdcinfo_flags(1,flags);
+
+       result = rpccli_netlogon_dsr_getdcname(cli, mem_ctx, server_name, domain_name, 
+                                              &domain_guid, &site_guid, flags,
+                                              &info);
+
+       if (W_ERROR_IS_OK(result)) {
+               d_printf("DsGetDcName gave\n");
+               display_ds_domain_controller_info(mem_ctx, info);
+               return WERR_OK;
+       }
+
+       printf("rpccli_netlogon_dsr_getdcname returned %s\n",
+              dos_errstr(result));
+
+       return result;
+}
+
+static WERROR cmd_netlogon_dsr_getdcnameex(struct rpc_pipe_client *cli,
+                                          TALLOC_CTX *mem_ctx, int argc,
+                                          const char **argv)
+{
+       WERROR result;
+       uint32 flags = DS_RETURN_DNS_NAME;
+       const char *server_name = cli->cli->desthost;
+       const char *domain_name;
+       const char *site_name = NULL;
+       struct GUID domain_guid = GUID_zero();
+       struct DS_DOMAIN_CONTROLLER_INFO *info = NULL;
+
+       if (argc < 2) {
+               fprintf(stderr, "Usage: %s [domain_name] [domain_guid] "
+                               "[site_name] [flags]\n", argv[0]);
+               return WERR_OK;
+       }
+
+       if (argc >= 2)
+               domain_name = argv[1];
+
+       if (argc >= 3) {
+               if (!NT_STATUS_IS_OK(GUID_from_string(argv[2], &domain_guid))) {
+                       return WERR_NOMEM;
                }
        }
-       else
-       {
-               fstrcpy(nt_user_name, argv[0]);
+
+       if (argc >= 4)
+               site_name = argv[3];
+
+       if (argc >= 5)
+               sscanf(argv[4], "%x", &flags);
+
+       debug_dsdcinfo_flags(1,flags);
+
+       result = rpccli_netlogon_dsr_getdcnameex(cli, mem_ctx, server_name, domain_name, 
+                                                &domain_guid, site_name, flags,
+                                                &info);
+
+       if (W_ERROR_IS_OK(result)) {
+               d_printf("DsGetDcNameEx gave\n");
+               display_ds_domain_controller_info(mem_ctx, info);
+               return WERR_OK;
+       }
+
+       printf("rpccli_netlogon_dsr_getdcnameex returned %s\n",
+              dos_errstr(result));
+
+       return result;
+}
+
+static WERROR cmd_netlogon_dsr_getdcnameex2(struct rpc_pipe_client *cli,
+                                           TALLOC_CTX *mem_ctx, int argc,
+                                           const char **argv)
+{
+       WERROR result;
+       uint32 flags = DS_RETURN_DNS_NAME;
+       const char *server_name = cli->cli->desthost;
+       const char *domain_name = NULL;
+       const char *client_account = NULL;
+       uint32 mask = 0;
+       const char *site_name = NULL;
+       struct GUID domain_guid = GUID_zero();
+       struct DS_DOMAIN_CONTROLLER_INFO *info = NULL;
+
+       if (argc < 2) {
+               fprintf(stderr, "Usage: %s [client_account] [acb_mask] "
+                               "[domain_name] [domain_guid] [site_name] "
+                               "[flags]\n", argv[0]);
+               return WERR_OK;
+       }
+
+       if (argc >= 2)
+               client_account = argv[1];
+
+       if (argc >= 3)
+               mask = atoi(argv[2]);
+
+       if (argc >= 4)
+               domain_name = argv[3];
+
+       if (argc >= 5) {
+               if (!NT_STATUS_IS_OK(GUID_from_string(argv[4], &domain_guid))) {
+                       return WERR_NOMEM;
+               }
        }
 
-       argc--;
-       argv++;
+       if (argc >= 6)
+               site_name = argv[5];
+
+       if (argc >= 7)
+               sscanf(argv[6], "%x", &flags);
+
+       debug_dsdcinfo_flags(1,flags);
 
-       if (argc < 2)
-       {
-               nt_password = argv[0];
+       result = rpccli_netlogon_dsr_getdcnameex2(cli, mem_ctx, server_name, 
+                                                 client_account, mask,
+                                                 domain_name, &domain_guid,
+                                                 site_name, flags,
+                                                 &info);
+
+       if (W_ERROR_IS_OK(result)) {
+               d_printf("DsGetDcNameEx2 gave\n");
+               display_ds_domain_controller_info(mem_ctx, info);
+               return WERR_OK;
        }
-       else
-       {
-               nt_password = getpass("Enter NT Login password:");
+
+       printf("rpccli_netlogon_dsr_getdcnameex2 returned %s\n",
+              dos_errstr(result));
+
+       return result;
+}
+
+
+static WERROR cmd_netlogon_dsr_getsitename(struct rpc_pipe_client *cli,
+                                          TALLOC_CTX *mem_ctx, int argc,
+                                          const char **argv)
+{
+       WERROR result;
+       char *sitename;
+
+       if (argc != 2) {
+               fprintf(stderr, "Usage: %s computername\n", argv[0]);
+               return WERR_OK;
        }
 
-       DEBUG(5,("do_nt_login_test: username %s from: %s\n",
-                   nt_user_name, info->myhostname));
+       result = rpccli_netlogon_dsr_getsitename(cli, mem_ctx, argv[1], &sitename);
 
-       fstrcpy(trust_acct, info->myhostname);
-       fstrcat(trust_acct, "$");
+       if (!W_ERROR_IS_OK(result)) {
+               printf("rpccli_netlogon_dsr_gesitename returned %s\n",
+                      nt_errstr(werror_to_ntstatus(result)));
+               return result;
+       }
+
+       printf("Computer %s is on Site: %s\n", argv[1], sitename);
 
-       res = res ? trust_get_passwd(trust_passwd, usr_creds->domain, info->myhostname) : False;
+       return WERR_OK;
+}
 
+static NTSTATUS cmd_netlogon_logon_ctrl(struct rpc_pipe_client *cli, 
+                                        TALLOC_CTX *mem_ctx, int argc, 
+                                        const char **argv)
+{
 #if 0
-       /* check whether the user wants to change their machine password */
-       res = res ? trust_account_check(info->dest_ip, info->dest_host,
-                                       info->myhostname, usr_creds->domain,
-                                       info->mach_acct, new_mach_pwd) : False;
+       uint32 query_level = 1;
 #endif
+       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
 
-       res = res ? cli_nt_setup_creds(srv_name, info->myhostname,
-                                      trust_acct, 
-                                      trust_passwd, SEC_CHAN_WKSTA) == 0x0 : False;
+       if (argc > 1) {
+               fprintf(stderr, "Usage: %s\n", argv[0]);
+               return NT_STATUS_OK;
+       }
 
 #if 0
-       /* change the machine password? */
-       if (global_machine_password_needs_changing)
-       {
-               unsigned char new_trust_passwd[16];
-               generate_random_buffer(new_trust_passwd, 16, True);
-               res = res ? cli_nt_srv_pwset(srv_name, info->myhostname, new_trust_passwd, SEC_CHAN_WKSTA) : False;
-
-               if (res)
-               {
-                       global_machine_password_needs_changing = !set_trust_account_password(new_trust_passwd);
-               }
-
-               memset(new_trust_passwd, 0, 16);
+       result = cli_netlogon_logon_ctrl(cli, mem_ctx, query_level);
+       if (!NT_STATUS_IS_OK(result)) {
+               goto done;
        }
 #endif
 
-       memset(trust_passwd, 0, 16);
+       /* Display results */
 
-       /* do an NT login */
-       res = res ? cli_nt_login_interactive(srv_name, info->myhostname,
-                        usr_creds->domain, nt_user_name,
-                        getuid(), nt_password,
-                        &info->dom.ctr, &info->dom.user_info3) : False;
+       return result;
+}
+
+/* Display sam synchronisation information */
+
+static void display_sam_sync(uint32 num_deltas, SAM_DELTA_HDR *hdr_deltas,
+                             SAM_DELTA_CTR *deltas)
+{
+        fstring name;
+        uint32 i, j;
+
+        for (i = 0; i < num_deltas; i++) {
+                switch (hdr_deltas[i].type) {
+                case SAM_DELTA_DOMAIN_INFO:
+                        unistr2_to_ascii(name,
+                                         &deltas[i].domain_info.uni_dom_name,
+                                         sizeof(name));
+                        printf("Domain: %s\n", name);
+                        break;
+                case SAM_DELTA_GROUP_INFO:
+                        unistr2_to_ascii(name,
+                                         &deltas[i].group_info.uni_grp_name,
+                                         sizeof(name));
+                        printf("Group: %s\n", name);
+                        break;
+                case SAM_DELTA_ACCOUNT_INFO:
+                        unistr2_to_ascii(name, 
+                                         &deltas[i].account_info.uni_acct_name,
+                                         sizeof(name));
+                        printf("Account: %s\n", name);
+                        break;
+                case SAM_DELTA_ALIAS_INFO:
+                        unistr2_to_ascii(name, 
+                                         &deltas[i].alias_info.uni_als_name,
+                                         sizeof(name));
+                        printf("Alias: %s\n", name);
+                        break;
+                case SAM_DELTA_ALIAS_MEM: {
+                        SAM_ALIAS_MEM_INFO *alias = &deltas[i].als_mem_info;
+
+                        for (j = 0; j < alias->num_members; j++) {
+                                fstring sid_str;
+
+                                sid_to_fstring(sid_str, &alias->sids[j].sid);
+
+                                printf("%s\n", sid_str);
+                        }
+                        break;
+                }
+                case SAM_DELTA_GROUP_MEM: {
+                        SAM_GROUP_MEM_INFO *group = &deltas[i].grp_mem_info;
+
+                        for (j = 0; j < group->num_members; j++)
+                                printf("rid 0x%x, attrib 0x%08x\n", 
+                                          group->rids[j], group->attribs[j]);
+                        break;
+                }
+                case SAM_DELTA_MODIFIED_COUNT: {
+                        SAM_DELTA_MOD_COUNT *mc = &deltas[i].mod_count;
+
+                        printf("sam sequence update: 0x%04x\n", mc->seqnum);
+                        break;
+                }                                  
+                default:
+                        printf("unknown delta type 0x%02x\n", 
+                                  hdr_deltas[i].type);
+                        break;
+                }
+        }
+}
+
+/* Perform sam synchronisation */
+
+static NTSTATUS cmd_netlogon_sam_sync(struct rpc_pipe_client *cli, 
+                                      TALLOC_CTX *mem_ctx, int argc,
+                                      const char **argv)
+{
+       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+        uint32 database_id = 0, num_deltas;
+        SAM_DELTA_HDR *hdr_deltas;
+        SAM_DELTA_CTR *deltas;
 
-       /*** clear out the password ***/
-       memset(password, 0, sizeof(password));
+        if (argc > 2) {
+                fprintf(stderr, "Usage: %s [database_id]\n", argv[0]);
+                return NT_STATUS_OK;
+        }
 
-       /* ok!  you're logged in!  do anything you like, then... */
+        if (argc == 2)
+                database_id = atoi(argv[1]);
 
-       /* do an NT logout */
-       res = res ? cli_nt_logoff(srv_name, info->myhostname, &info->dom.ctr) : False;
+        /* Synchronise sam database */
 
-       report(out_hnd,"cmd_nt_login: login (%s) test succeeded: %s\n",
-               nt_user_name, BOOLSTR(res));
+       result = rpccli_netlogon_sam_sync(cli, mem_ctx, database_id,
+                                      0, &num_deltas, &hdr_deltas, &deltas);
+
+       if (!NT_STATUS_IS_OK(result))
+               goto done;
+
+        /* Display results */
+
+        display_sam_sync(num_deltas, hdr_deltas, deltas);
+
+ done:
+        return result;
 }
 
-/****************************************************************************
-experimental nt login.
-****************************************************************************/
-void cmd_netlogon_domain_test(struct client_info *info, int argc, char *argv[])
+/* Perform sam delta synchronisation */
+
+static NTSTATUS cmd_netlogon_sam_deltas(struct rpc_pipe_client *cli, 
+                                        TALLOC_CTX *mem_ctx, int argc,
+                                        const char **argv)
 {
-       char *nt_trust_dom;
-       BOOL res = True;
-       unsigned char trust_passwd[16];
-       fstring inter_dom_acct;
+       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+        uint32 database_id, num_deltas, tmp;
+        SAM_DELTA_HDR *hdr_deltas;
+        SAM_DELTA_CTR *deltas;
+        uint64 seqnum;
+
+        if (argc != 3) {
+                fprintf(stderr, "Usage: %s database_id seqnum\n", argv[0]);
+                return NT_STATUS_OK;
+        }
+
+        database_id = atoi(argv[1]);
+        tmp = atoi(argv[2]);
+
+        seqnum = tmp & 0xffff;
 
-       fstring srv_name;
-       fstrcpy(srv_name, "\\\\");
-       fstrcat(srv_name, info->dest_host);
-       strupper(srv_name);
+       result = rpccli_netlogon_sam_deltas(cli, mem_ctx, database_id,
+                                        seqnum, &num_deltas, 
+                                        &hdr_deltas, &deltas);
 
-       if (argc < 2)
-       {
-               report(out_hnd,"domtest: must specify domain name\n");
-               return;
+       if (!NT_STATUS_IS_OK(result))
+               goto done;
+
+        /* Display results */
+
+        display_sam_sync(num_deltas, hdr_deltas, deltas);
+        
+ done:
+        return result;
+}
+
+/* Log on a domain user */
+
+static NTSTATUS cmd_netlogon_sam_logon(struct rpc_pipe_client *cli, 
+                                      TALLOC_CTX *mem_ctx, int argc,
+                                      const char **argv)
+{
+       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+       int logon_type = NET_LOGON_TYPE;
+       const char *username, *password;
+       int auth_level = 2;
+       uint32 logon_param = 0;
+       const char *workstation = NULL;
+
+       /* Check arguments */
+
+       if (argc < 3 || argc > 7) {
+               fprintf(stderr, "Usage: samlogon <username> <password> [workstation]"
+                       "[logon_type (1 or 2)] [auth level (2 or 3)] [logon_parameter]\n");
+               return NT_STATUS_OK;
        }
 
-       nt_trust_dom = argv[1];
+       username = argv[1];
+       password = argv[2];
+
+       if (argc >= 4) 
+               workstation = argv[3];
 
-       DEBUG(5,("do_nt_login_test: domain %s\n", nt_trust_dom));
+       if (argc >= 5)
+               sscanf(argv[4], "%i", &logon_type);
 
-       fstrcpy(inter_dom_acct, nt_trust_dom);
-       fstrcat(inter_dom_acct, "$");
+       if (argc >= 6)
+               sscanf(argv[5], "%i", &auth_level);
 
-       res = res ? trust_get_passwd(trust_passwd, usr_creds->domain, nt_trust_dom) : False;
+       if (argc == 7)
+               sscanf(argv[6], "%x", &logon_param);
 
-       res = res ? cli_nt_setup_creds(srv_name, info->myhostname, inter_dom_acct,
-                                      trust_passwd, 
-                                      SEC_CHAN_DOMAIN) == 0x0 : False;
+       /* Perform the sam logon */
 
-       memset(trust_passwd, 0, 16);
+       result = rpccli_netlogon_sam_logon(cli, mem_ctx, logon_param, lp_workgroup(), username, password, workstation, logon_type);
 
-       report(out_hnd,"cmd_nt_login: credentials (%s) test succeeded: %s\n",
-               nt_trust_dom, BOOLSTR(res));
+       if (!NT_STATUS_IS_OK(result))
+               goto done;
+
+ done:
+       return result;
 }
 
-/****************************************************************************
-experimental SAM synchronisation.
-****************************************************************************/
-void cmd_sam_sync(struct client_info *info, int argc, char *argv[])
+/* Change the trust account password */
+
+static NTSTATUS cmd_netlogon_change_trust_pw(struct rpc_pipe_client *cli, 
+                                            TALLOC_CTX *mem_ctx, int argc,
+                                            const char **argv)
 {
-       SAM_DELTA_HDR hdr_deltas[MAX_SAM_DELTAS];
-       SAM_DELTA_CTR deltas[MAX_SAM_DELTAS];
-       uint32 num;
-       uchar trust_passwd[16];
-       fstring srv_name;
-       fstring trust_acct;
-
-       fstrcpy(srv_name, "\\\\");
-       fstrcat(srv_name, info->dest_host);
-       strupper(srv_name);
-
-       fstrcpy(trust_acct, info->myhostname);
-       fstrcat(trust_acct, "$");
-
-       if (!trust_get_passwd(trust_passwd, usr_creds->domain, info->myhostname))
-       {
-               report(out_hnd, "cmd_sam_sync: no trust account password\n");
-               return;
-       }
-
-       if (net_sam_sync(srv_name, info->myhostname,
-               trust_acct, trust_passwd,
-           hdr_deltas, deltas, &num))
-       {
-               display_sam_sync(out_hnd, ACTION_HEADER   , hdr_deltas, deltas, num);
-               display_sam_sync(out_hnd, ACTION_ENUMERATE, hdr_deltas, deltas, num);
-               display_sam_sync(out_hnd, ACTION_FOOTER   , hdr_deltas, deltas, num);
-       }
+        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+
+        /* Check arguments */
+
+        if (argc > 1) {
+                fprintf(stderr, "Usage: change_trust_pw");
+                return NT_STATUS_OK;
+        }
+
+        /* Perform the sam logon */
+
+       result = trust_pw_find_change_and_store_it(cli, mem_ctx,
+                                                  lp_workgroup());
+
+       if (!NT_STATUS_IS_OK(result))
+               goto done;
+
+ done:
+        return result;
 }
+
+
+/* List of commands exported by this module */
+
+struct cmd_set netlogon_commands[] = {
+
+       { "NETLOGON" },
+
+       { "logonctrl2", RPC_RTYPE_NTSTATUS, cmd_netlogon_logon_ctrl2, NULL, PI_NETLOGON, NULL, "Logon Control 2",     "" },
+       { "getanydcname", RPC_RTYPE_WERROR, NULL, cmd_netlogon_getanydcname, PI_NETLOGON, NULL, "Get trusted DC name",     "" },
+       { "getdcname", RPC_RTYPE_WERROR, NULL, cmd_netlogon_getdcname, PI_NETLOGON, NULL, "Get trusted PDC name",     "" },
+       { "dsr_getdcname", RPC_RTYPE_WERROR, NULL, cmd_netlogon_dsr_getdcname, PI_NETLOGON, NULL, "Get trusted DC name",     "" },
+       { "dsr_getdcnameex", RPC_RTYPE_WERROR, NULL, cmd_netlogon_dsr_getdcnameex, PI_NETLOGON, NULL, "Get trusted DC name",     "" },
+       { "dsr_getdcnameex2", RPC_RTYPE_WERROR, NULL, cmd_netlogon_dsr_getdcnameex2, PI_NETLOGON, NULL, "Get trusted DC name",     "" },
+       { "dsr_getsitename", RPC_RTYPE_WERROR, NULL, cmd_netlogon_dsr_getsitename, PI_NETLOGON, NULL, "Get sitename",     "" },
+       { "logonctrl",  RPC_RTYPE_NTSTATUS, cmd_netlogon_logon_ctrl,  NULL, PI_NETLOGON, NULL, "Logon Control",       "" },
+       { "samsync",    RPC_RTYPE_NTSTATUS, cmd_netlogon_sam_sync,    NULL, PI_NETLOGON, NULL, "Sam Synchronisation", "" },
+       { "samdeltas",  RPC_RTYPE_NTSTATUS, cmd_netlogon_sam_deltas,  NULL, PI_NETLOGON, NULL, "Query Sam Deltas",    "" },
+       { "samlogon",   RPC_RTYPE_NTSTATUS, cmd_netlogon_sam_logon,   NULL, PI_NETLOGON, NULL, "Sam Logon",           "" },
+       { "change_trust_pw",   RPC_RTYPE_NTSTATUS, cmd_netlogon_change_trust_pw,   NULL, PI_NETLOGON, NULL, "Change Trust Account Password",           "" },
+
+       { NULL }
+};