s3-rpcclient: support all known netr_LogonControl2 variants properly
authorAlexander Bokovoy <ab@samba.org>
Wed, 13 Jun 2012 14:02:18 +0000 (17:02 +0300)
committerAlexander Bokovoy <ab@samba.org>
Thu, 21 Jun 2012 10:11:19 +0000 (12:11 +0200)
logonctrl2 function in rpcclient did not allow to specify arguments
to most of netr_LogonControl2 function code points.

In addition, make descriptive help to show what is expected at each
function code point.

Autobuild-User(master): Alexander Bokovoy <ab@samba.org>
Autobuild-Date(master): Thu Jun 21 12:11:19 CEST 2012 on sn-devel-104

source3/rpcclient/cmd_netlogon.c

index baf2f4f694c5b5c50b0bbb3c4804f20c0a35cee1..01d6da45ddca5856649a8d573d12eba43d1b0f23 100644 (file)
@@ -40,10 +40,34 @@ static WERROR cmd_netlogon_logon_ctrl2(struct rpc_pipe_client *cli,
        union netr_CONTROL_QUERY_INFORMATION query;
        const char *domain = lp_workgroup();
        struct dcerpc_binding_handle *b = cli->binding_handle;
-
-       if (argc > 5) {
+       int i;
+#define fn_code_level(x, item) { x, #x, #item }
+       struct {
+               enum netr_LogonControlCode code;
+               const char *name;
+               const char *argument;
+       } supported_levels[] = {
+               fn_code_level(NETLOGON_CONTROL_REDISCOVER, domain),
+               fn_code_level(NETLOGON_CONTROL_TC_QUERY, domain),
+               fn_code_level(NETLOGON_CONTROL_TRANSPORT_NOTIFY, domain),
+               fn_code_level(NETLOGON_CONTROL_FIND_USER, user),
+               fn_code_level(NETLOGON_CONTROL_CHANGE_PASSWORD, domain),
+               fn_code_level(NETLOGON_CONTROL_TC_VERIFY, domain),
+               fn_code_level(NETLOGON_CONTROL_SET_DBFLAG, debug_level),
+               {0, 0, 0}
+       };
+#undef fn_code_level
+       if ((argc > 5) || (argc < 2)) {
                fprintf(stderr, "Usage: %s <logon_server> <function_code> "
-                       "<level> <domain>\n", argv[0]);
+                       "<level:1..4> <argument>\n", argv[0]);
+               fprintf(stderr, "Supported combinations:\n");
+               fprintf(stderr, "function_code\targument\n");
+               for(i=0; supported_levels[i].code; i++) {
+                       fprintf(stderr, "%7d\t\t%s\t(%s)\n",
+                               supported_levels[i].code,
+                               supported_levels[i].argument,
+                               supported_levels[i].name);
+               }
                return WERR_OK;
        }
 
@@ -66,8 +90,16 @@ static WERROR cmd_netlogon_logon_ctrl2(struct rpc_pipe_client *cli,
        switch (function_code) {
                case NETLOGON_CONTROL_REDISCOVER:
                case NETLOGON_CONTROL_TC_QUERY:
+               case NETLOGON_CONTROL_CHANGE_PASSWORD:
+               case NETLOGON_CONTROL_TRANSPORT_NOTIFY:
+               case NETLOGON_CONTROL_TC_VERIFY:
                        data.domain = domain;
                        break;
+               case NETLOGON_CONTROL_FIND_USER:
+                       data.user = domain;
+                       break;
+               case NETLOGON_CONTROL_SET_DBFLAG:
+                       data.debug_level = atoi(domain);
                default:
                        break;
        }