Print this page
NEX-15391 smbadm man page needs updating
Reviewed by: Dan Fields <dan.fields@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
NEX-15391 smbadm man page needs updating
Reviewed by: Dan Fields <dan.fields@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
NEX-15041 method to delete local SMB users
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-15041 method to delete local SMB users
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
SUP-549 Can't remove the Domain Admin from the local administrators group. (fix copyrights)
SUP-549 Can't remove the Domain Admin from the local administrators group.
Reviewed by: Dan Fields <dan.fields@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-2667 Wrong error when join domain with wrong password
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
Reviewed by: Bayard Bell <bayard.bell@nexenta.com>
NEX-2286 smbadm join error messages are uninformative
NEX-1852 re-enable Kerberos-style AD join (try 2)
SMB-106 Add '-y' flag to 'smbadm join' command
NEX-816 smbadm dumps core during first join attempt
SMB-65 SMB server in non-global zones (data structure changes)
Many things move to the smb_server_t object, and
many functions gain an sv arg (which server).
re #12435 rb3958 r10 is added 2 times to panic info
re #12393 rb3935 Kerberos and smbd disagree about who is our AD server

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/smbsrv/smbadm/smbadm.c
          +++ new/usr/src/cmd/smbsrv/smbadm/smbadm.c
↓ open down ↓ 12 lines elided ↑ open up ↑
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  23      - * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
       23 + * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  24   24   */
  25   25  
  26   26  /*
  27   27   * This module contains smbadm CLI which offers smb configuration
  28   28   * functionalities.
  29   29   */
  30   30  #include <errno.h>
  31   31  #include <err.h>
  32   32  #include <ctype.h>
  33   33  #include <stdlib.h>
↓ open down ↓ 24 lines elided ↑ open up ↑
  58   58          HELP_DELETE,
  59   59          HELP_DEL_MEMBER,
  60   60          HELP_GET,
  61   61          HELP_JOIN,
  62   62          HELP_LIST,
  63   63          HELP_LOOKUP,
  64   64          HELP_RENAME,
  65   65          HELP_SET,
  66   66          HELP_SHOW,
  67   67          HELP_USER_DISABLE,
  68      -        HELP_USER_ENABLE
       68 +        HELP_USER_ENABLE,
       69 +        HELP_USER_DELETE
  69   70  } smbadm_help_t;
  70   71  
  71   72  #define SMBADM_CMDF_NONE        0x00
  72   73  #define SMBADM_CMDF_USER        0x01
  73   74  #define SMBADM_CMDF_GROUP       0x02
  74   75  #define SMBADM_CMDF_TYPEMASK    0x0F
  75   76  
  76   77  typedef enum {
  77   78          SMBADM_GRP_ADDMEMBER = 0,
  78   79          SMBADM_GRP_DELMEMBER,
↓ open down ↓ 32 lines elided ↑ open up ↑
 111  112  static int smbadm_group_delete(int, char **);
 112  113  static int smbadm_group_rename(int, char **);
 113  114  static int smbadm_group_show(int, char **);
 114  115  static void smbadm_group_show_name(const char *, const char *);
 115  116  static int smbadm_group_getprop(int, char **);
 116  117  static int smbadm_group_setprop(int, char **);
 117  118  static int smbadm_group_addmember(int, char **);
 118  119  static int smbadm_group_delmember(int, char **);
 119  120  static int smbadm_group_add_del_member(char *, char *, smbadm_grp_action_t);
 120  121  
      122 +static int smbadm_user_delete(int, char **);
 121  123  static int smbadm_user_disable(int, char **);
 122  124  static int smbadm_user_enable(int, char **);
 123  125  
      126 +/* Please keep the order consistent with smbadm(1M) man page */
 124  127  static smbadm_cmdinfo_t smbadm_cmdtable[] =
 125  128  {
 126      -        { "add-member",         smbadm_group_addmember, HELP_ADD_MEMBER,
 127      -                SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
 128  129          { "create",             smbadm_group_create,    HELP_CREATE,
 129  130                  SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
 130  131          { "delete",             smbadm_group_delete,    HELP_DELETE,
 131  132                  SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
      133 +        { "rename",             smbadm_group_rename,    HELP_RENAME,
      134 +                SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
      135 +        { "show",               smbadm_group_show,      HELP_SHOW,
      136 +                SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
      137 +        { "get",                smbadm_group_getprop,   HELP_GET,
      138 +                SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
      139 +        { "set",                smbadm_group_setprop,   HELP_SET,
      140 +                SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
      141 +        { "add-member",         smbadm_group_addmember, HELP_ADD_MEMBER,
      142 +                SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
      143 +        { "remove-member",      smbadm_group_delmember, HELP_DEL_MEMBER,
      144 +                SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
      145 +        { "delete-user",        smbadm_user_delete,     HELP_USER_DELETE,
      146 +                SMBADM_CMDF_USER,       SMBADM_ACTION_AUTH },
 132  147          { "disable-user",       smbadm_user_disable,    HELP_USER_DISABLE,
 133  148                  SMBADM_CMDF_USER,       SMBADM_ACTION_AUTH },
 134  149          { "enable-user",        smbadm_user_enable,     HELP_USER_ENABLE,
 135  150                  SMBADM_CMDF_USER,       SMBADM_ACTION_AUTH },
 136      -        { "get",                smbadm_group_getprop,   HELP_GET,
 137      -                SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
 138  151          { "join",               smbadm_join,            HELP_JOIN,
 139  152                  SMBADM_CMDF_NONE,       SMBADM_VALUE_AUTH },
 140  153          { "list",               smbadm_list,            HELP_LIST,
 141  154                  SMBADM_CMDF_NONE,       SMBADM_BASIC_AUTH },
 142  155          { "lookup",             smbadm_lookup,          HELP_LOOKUP,
 143  156                  SMBADM_CMDF_NONE,       SMBADM_BASIC_AUTH },
 144      -        { "remove-member",      smbadm_group_delmember, HELP_DEL_MEMBER,
 145      -                SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
 146      -        { "rename",             smbadm_group_rename,    HELP_RENAME,
 147      -                SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
 148      -        { "set",                smbadm_group_setprop,   HELP_SET,
 149      -                SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
 150      -        { "show",               smbadm_group_show,      HELP_SHOW,
 151      -                SMBADM_CMDF_GROUP,      SMBADM_ACTION_AUTH },
 152  157  };
 153  158  
 154  159  #define SMBADM_NCMD     (sizeof (smbadm_cmdtable) / sizeof (smbadm_cmdtable[0]))
 155  160  
 156  161  typedef struct smbadm_prop {
 157  162          char *p_name;
 158  163          char *p_value;
 159  164  } smbadm_prop_t;
 160  165  
 161  166  typedef struct smbadm_prop_handle {
↓ open down ↓ 12 lines elided ↑ open up ↑
 174  179  static int smbadm_setprop_tkowner(char *gname, smbadm_prop_t *prop);
 175  180  static int smbadm_getprop_tkowner(char *gname, smbadm_prop_t *prop);
 176  181  static int smbadm_setprop_backup(char *gname, smbadm_prop_t *prop);
 177  182  static int smbadm_getprop_backup(char *gname, smbadm_prop_t *prop);
 178  183  static int smbadm_setprop_restore(char *gname, smbadm_prop_t *prop);
 179  184  static int smbadm_getprop_restore(char *gname, smbadm_prop_t *prop);
 180  185  static int smbadm_setprop_desc(char *gname, smbadm_prop_t *prop);
 181  186  static int smbadm_getprop_desc(char *gname, smbadm_prop_t *prop);
 182  187  
 183  188  static smbadm_prop_handle_t smbadm_ptable[] = {
 184      -        {"backup",      "on | off",     smbadm_setprop_backup,
      189 +        {"backup",      "on|off",       smbadm_setprop_backup,
 185  190          smbadm_getprop_backup,  smbadm_chkprop_priv     },
 186      -        {"restore",     "on | off",     smbadm_setprop_restore,
      191 +        {"restore",     "on|off",       smbadm_setprop_restore,
 187  192          smbadm_getprop_restore, smbadm_chkprop_priv     },
 188      -        {"take-ownership", "on | off",  smbadm_setprop_tkowner,
      193 +        {"take-ownership", "on|off",    smbadm_setprop_tkowner,
 189  194          smbadm_getprop_tkowner, smbadm_chkprop_priv     },
 190  195          {"description", "<string>",     smbadm_setprop_desc,
 191  196          smbadm_getprop_desc,    NULL                    },
 192  197  };
 193  198  
 194  199  static int smbadm_init(void);
 195  200  static void smbadm_fini(void);
 196  201  static const char *smbadm_pwd_strerror(int error);
 197  202  
 198  203  /*
 199  204   * Number of supported properties
 200  205   */
 201  206  #define SMBADM_NPROP    (sizeof (smbadm_ptable) / sizeof (smbadm_ptable[0]))
 202  207  
 203  208  static void
 204  209  smbadm_cmdusage(FILE *fp, smbadm_cmdinfo_t *cmd)
 205  210  {
 206  211          switch (cmd->usage) {
 207  212          case HELP_ADD_MEMBER:
 208  213                  (void) fprintf(fp,
 209      -                    gettext("\t%s -m member [[-m member] ...] group\n"),
      214 +                    gettext("\t%s -m <member> [-m <member>]... <group>\n"),
 210  215                      cmd->name);
 211  216                  return;
 212  217  
 213  218          case HELP_CREATE:
 214      -                (void) fprintf(fp, gettext("\t%s [-d description] group\n"),
      219 +                (void) fprintf(fp, gettext("\t%s [-d <description>] <group>\n"),
 215  220                      cmd->name);
 216  221                  return;
 217  222  
 218  223          case HELP_DELETE:
 219      -                (void) fprintf(fp, gettext("\t%s group\n"), cmd->name);
      224 +                (void) fprintf(fp, gettext("\t%s <group>\n"), cmd->name);
 220  225                  return;
 221  226  
      227 +        case HELP_USER_DELETE:
 222  228          case HELP_USER_DISABLE:
 223  229          case HELP_USER_ENABLE:
 224      -                (void) fprintf(fp, gettext("\t%s user\n"), cmd->name);
      230 +                (void) fprintf(fp, gettext("\t%s <username>\n"), cmd->name);
 225  231                  return;
 226  232  
 227  233          case HELP_GET:
 228      -                (void) fprintf(fp, gettext("\t%s [[-p property] ...] group\n"),
      234 +                (void) fprintf(fp, gettext("\t%s [-p <property>]... <group>\n"),
 229  235                      cmd->name);
 230  236                  return;
 231  237  
 232  238          case HELP_JOIN:
 233      -#if 0   /* Don't document "-p" yet, still needs work (NX 11960) */
 234      -                (void) fprintf(fp, gettext("\t%s [-y] -p domain\n"
 235      -                    "\t%s [-y] -u username domain\n\t%s [-y] -w workgroup\n"),
      239 +#if 0   /* Don't document "-p" yet, still needs work (NEX-11960) */
      240 +                (void) fprintf(fp, gettext("\t%s [-y] -p <domain>\n"
      241 +                    "\t%s [-y] -u <username domain>\n"
      242 +                    "\t%s [-y] -w <workgroup>\n"),
 236  243                      cmd->name, cmd->name, cmd->name);
 237  244  #else
 238      -                (void) fprintf(fp, gettext("\t%s [-y] -u username domain\n"
 239      -                    "\t%s [-y] -w workgroup\n"), cmd->name, cmd->name);
      245 +                (void) fprintf(fp, gettext("\t%s [-y] -u <username> <domain>\n"
      246 +                    "\t%s [-y] -w <workgroup>\n"), cmd->name, cmd->name);
 240  247  #endif
 241  248                  return;
 242  249  
 243  250          case HELP_LIST:
 244  251                  (void) fprintf(fp, gettext("\t%s\n"), cmd->name);
 245      -                (void) fprintf(fp,
 246      -                    gettext("\t\t[*] primary domain\n"));
 247      -                (void) fprintf(fp, gettext("\t\t[.] local domain\n"));
 248      -                (void) fprintf(fp, gettext("\t\t[-] other domains\n"));
 249      -                (void) fprintf(fp,
 250      -                    gettext("\t\t[+] selected domain controller\n"));
 251  252                  return;
 252  253  
 253  254          case HELP_LOOKUP:
 254  255                  (void) fprintf(fp,
 255      -                    gettext("\t%s user-or-group-name\n"),
      256 +                    gettext("\t%s <account-name>\n"),
 256  257                      cmd->name);
 257  258                  return;
 258  259  
 259  260          case HELP_DEL_MEMBER:
 260  261                  (void) fprintf(fp,
 261      -                    gettext("\t%s -m member [[-m member] ...] group\n"),
      262 +                    gettext("\t%s -m <member> [-m <member>]... <group>\n"),
 262  263                      cmd->name);
 263  264                  return;
 264  265  
 265  266          case HELP_RENAME:
 266      -                (void) fprintf(fp, gettext("\t%s group new-group\n"),
      267 +                (void) fprintf(fp, gettext("\t%s <group> <new-group>\n"),
 267  268                      cmd->name);
 268  269                  return;
 269  270  
 270  271          case HELP_SET:
 271      -                (void) fprintf(fp, gettext("\t%s -p property=value "
 272      -                    "[[-p property=value] ...] group\n"), cmd->name);
      272 +                (void) fprintf(fp, gettext("\t%s -p <property>=<value> "
      273 +                    "[-p <property>=<value>]... <group>\n"), cmd->name);
 273  274                  return;
 274  275  
 275  276          case HELP_SHOW:
 276      -                (void) fprintf(fp, gettext("\t%s [-m] [-p] [group]\n"),
      277 +                (void) fprintf(fp, gettext("\t%s [-mp] [<group>]\n"),
 277  278                      cmd->name);
 278  279                  return;
 279  280  
 280  281          default:
 281  282                  break;
 282  283          }
 283  284  
 284  285          abort();
 285  286          /* NOTREACHED */
 286  287  }
 287  288  
 288  289  static void
 289  290  smbadm_usage(boolean_t requested)
 290  291  {
 291  292          FILE *fp = requested ? stdout : stderr;
 292  293          boolean_t show_props = B_FALSE;
 293  294          int i;
 294  295  
 295  296          if (curcmd == NULL) {
 296  297                  (void) fprintf(fp,
 297      -                    gettext("usage: %s [-h | <command> [options]]\n"),
      298 +                    gettext("usage: %s <subcommand> <args> ...\n"),
 298  299                      progname);
 299      -                (void) fprintf(fp,
 300      -                    gettext("where 'command' is one of the following:\n\n"));
 301  300  
 302  301                  for (i = 0; i < SMBADM_NCMD; i++)
 303  302                          smbadm_cmdusage(fp, &smbadm_cmdtable[i]);
 304  303  
 305  304                  (void) fprintf(fp,
 306  305                      gettext("\nFor property list, run %s %s|%s\n"),
 307  306                      progname, "get", "set");
 308  307  
 309  308                  exit(requested ? 0 : 2);
 310  309          }
↓ open down ↓ 1076 lines elided ↑ open up ↑
1387 1386                  ret |= smbadm_group_add_del_member(
1388 1387                      gname, mname[i], SMBADM_GRP_DELMEMBER);
1389 1388          }
1390 1389  
1391 1390          free(mname);
1392 1391          return (ret);
1393 1392  }
1394 1393  
1395 1394  static int
1396 1395  smbadm_group_add_del_member(char *gname, char *mname,
1397      -        smbadm_grp_action_t act)
     1396 +    smbadm_grp_action_t act)
1398 1397  {
1399 1398          lsa_account_t   acct;
1400 1399          smb_gsid_t msid;
1401 1400          char *sidstr;
1402 1401          char *act_str;
1403 1402          int rc;
1404 1403  
1405 1404          if (strncmp(mname, "S-1-", 4) == 0) {
1406 1405                  /*
1407 1406                   * We are given a SID.  Just use it.
1408 1407                   *
1409 1408                   * We'e like the real account type if we can get it,
1410 1409                   * but don't want to error out if we can't get it.
     1410 +                 * Lacking other info, assume it's a group.
1411 1411                   */
1412 1412                  sidstr = mname;
1413 1413                  rc = smb_lookup_sid(sidstr, &acct);
1414 1414                  if ((rc != 0) || (acct.a_status != NT_STATUS_SUCCESS))
1415      -                        acct.a_sidtype = SidTypeUnknown;
     1415 +                        acct.a_sidtype = SidTypeGroup;
1416 1416          } else {
1417 1417                  rc = smb_lookup_name(mname, SidTypeUnknown, &acct);
1418 1418                  if ((rc != 0) || (acct.a_status != NT_STATUS_SUCCESS)) {
1419 1419                          (void) fprintf(stderr,
1420 1420                              gettext("%s: name lookup failed\n"), mname);
1421 1421                          return (1);
1422 1422                  }
1423 1423                  sidstr = acct.a_sid;
1424 1424          }
1425 1425  
↓ open down ↓ 24 lines elided ↑ open up ↑
1450 1450  
1451 1451          if (rc != SMB_LGRP_SUCCESS) {
1452 1452                  (void) fprintf(stderr,
1453 1453                      gettext("failed to %s %s (%s)\n"),
1454 1454                      act_str, mname, smb_lgrp_strerror(rc));
1455 1455                  return (1);
1456 1456          }
1457 1457          return (0);
1458 1458  }
1459 1459  
     1460 +static int
     1461 +smbadm_user_delete(int argc, char **argv)
     1462 +{
     1463 +        int error;
     1464 +        char *user = NULL;
     1465 +
     1466 +        user = argv[optind];
     1467 +        if (optind >= argc || user == NULL || *user == '\0') {
     1468 +                (void) fprintf(stderr, gettext("missing user name\n"));
     1469 +                smbadm_usage(B_FALSE);
     1470 +        }
     1471 +
     1472 +        error = smb_pwd_setcntl(user, SMB_PWC_DELETE);
     1473 +        if (error == SMB_PWE_SUCCESS)
     1474 +                (void) printf(gettext("%s has been deleted.\n"), user);
     1475 +        else
     1476 +                (void) fprintf(stderr, "%s\n", smbadm_pwd_strerror(error));
     1477 +
     1478 +        return (error);
     1479 +}
     1480 +
1460 1481  static int
1461 1482  smbadm_user_disable(int argc, char **argv)
1462 1483  {
1463 1484          int error;
1464 1485          char *user = NULL;
1465 1486  
1466 1487          user = argv[optind];
1467 1488          if (optind >= argc || user == NULL || *user == '\0') {
1468 1489                  (void) fprintf(stderr, gettext("missing user name\n"));
1469 1490                  smbadm_usage(B_FALSE);
↓ open down ↓ 420 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX