summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2002-10-28 12:55:22 +0000
committerVolker Lendecke <vlendec@samba.org>2002-10-28 12:55:22 +0000
commit68026338e904b76fe58e8ecf046df6b5730ddd1c (patch)
tree6d58f9ecd9fff202478bdd25aeaa563dc5c42565
parent106ec982d5447b5f23f0bb125a49cebc9915f3d9 (diff)
downloadsamba-68026338e904b76fe58e8ecf046df6b5730ddd1c.tar.gz
samba-68026338e904b76fe58e8ecf046df6b5730ddd1c.tar.bz2
samba-68026338e904b76fe58e8ecf046df6b5730ddd1c.zip
Implement 'net maxrid'. Needed to find the maximum current rid to
set 'algorithmic rid base' correctly after a 'net rpc vampire'. Volker (This used to be commit 5c0869be321852919dba1566c6bcab02e4657541)
-rw-r--r--source3/utils/net.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/source3/utils/net.c b/source3/utils/net.c
index d38ca58622..704b886d72 100644
--- a/source3/utils/net.c
+++ b/source3/utils/net.c
@@ -402,6 +402,84 @@ static int net_getdomainsid(int argc, const char **argv)
return 0;
}
+static uint32 get_maxrid(void)
+{
+ SAM_ACCOUNT *pwd = NULL;
+ uint32 max_rid = 0;
+ GROUP_MAP *map = NULL;
+ int num_entries = 0;
+ int i;
+
+ if (!pdb_setsampwent(False)) {
+ DEBUG(0, ("load_sampwd_entries: Unable to open passdb.\n"));
+ return 0;
+ }
+
+ for (; (NT_STATUS_IS_OK(pdb_init_sam(&pwd)))
+ && pdb_getsampwent(pwd) == True; pwd=NULL) {
+ uint32 rid;
+
+ if (!sid_peek_rid(pdb_get_user_sid(pwd), &rid)) {
+ DEBUG(0, ("can't get RID for user '%s'\n",
+ pdb_get_username(pwd)));
+ pdb_free_sam(&pwd);
+ continue;
+ }
+
+ if (rid > max_rid)
+ max_rid = rid;
+
+ DEBUG(1,("%d is user '%s'\n", rid, pdb_get_username(pwd)));
+ pdb_free_sam(&pwd);
+ }
+
+ pdb_endsampwent();
+ pdb_free_sam(&pwd);
+
+ if (!pdb_enum_group_mapping(SID_NAME_UNKNOWN, &map, &num_entries,
+ ENUM_ONLY_MAPPED, MAPPING_WITHOUT_PRIV))
+ return max_rid;
+
+ for (i = 0; i < num_entries; i++) {
+ uint32 rid;
+
+ if (!sid_peek_check_rid(get_global_sam_sid(), &map[i].sid,
+ &rid)) {
+ DEBUG(3, ("skipping map for group '%s', SID %s\n",
+ map[i].nt_name,
+ sid_string_static(&map[i].sid)));
+ continue;
+ }
+ DEBUG(1,("%d is group '%s'\n", rid, map[i].nt_name));
+
+ if (rid > max_rid)
+ max_rid = rid;
+ }
+
+ SAFE_FREE(map);
+
+ return max_rid;
+}
+
+static int net_maxrid(int argc, const char **argv)
+{
+ uint32 rid;
+
+ if (argc != 0) {
+ DEBUG(0, ("usage: net initrid\n"));
+ return 1;
+ }
+
+ if ((rid = get_maxrid()) == 0) {
+ DEBUG(0, ("can't get current maximum rid\n"));
+ return 1;
+ }
+
+ d_printf("Currently used maximum rid: %d\n", rid);
+
+ return 0;
+}
+
/* main function table */
static struct functable net_func[] = {
{"RPC", net_rpc},
@@ -429,6 +507,7 @@ static struct functable net_func[] = {
{"GETLOCALSID", net_getlocalsid},
{"SETLOCALSID", net_setlocalsid},
{"GETDOMAINSID", net_getdomainsid},
+ {"MAXRID", net_maxrid},
{"HELP", net_help},
{NULL, NULL}