summaryrefslogtreecommitdiff
path: root/examples/libmsrpc/cacusermgr/cacusermgr.c
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2005-09-03 16:55:45 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 11:03:30 -0500
commit3c6b0f965588aab0edbc4d115fb9e72c884ded3b (patch)
treece3740784555e729297955c924e4701feaf69d38 /examples/libmsrpc/cacusermgr/cacusermgr.c
parenta44e97c99f61916db3f7cc02cd2581c8d64be73a (diff)
downloadsamba-3c6b0f965588aab0edbc4d115fb9e72c884ded3b.tar.gz
samba-3c6b0f965588aab0edbc4d115fb9e72c884ded3b.tar.bz2
samba-3c6b0f965588aab0edbc4d115fb9e72c884ded3b.zip
r10003: in the rush for 10k, I forgot to run add the rest of Chris' libmsrpc files
(This used to be commit 32bebc452dffa8348b94c5b866350b1fe761986f)
Diffstat (limited to 'examples/libmsrpc/cacusermgr/cacusermgr.c')
-rw-r--r--examples/libmsrpc/cacusermgr/cacusermgr.c344
1 files changed, 344 insertions, 0 deletions
diff --git a/examples/libmsrpc/cacusermgr/cacusermgr.c b/examples/libmsrpc/cacusermgr/cacusermgr.c
new file mode 100644
index 0000000000..77dd2505f6
--- /dev/null
+++ b/examples/libmsrpc/cacusermgr/cacusermgr.c
@@ -0,0 +1,344 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * cacusermgr main implementation.
+ *
+ * Copyright (C) Chris Nicholls 2005
+ *
+ * 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 (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the 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. */
+
+#include "cacusermgr.h"
+
+#define DEFAULT_MENU_LINES 15
+
+
+void create_menu(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd) {
+ struct SamCreateUser cu;
+ struct SamCreateGroup cg;
+
+ fstring in;
+ fstring tmp;
+
+ if(!hnd || !mem_ctx || !dom_hnd) {
+ printf("No Handle to SAM.\n");
+ return;
+ }
+
+ /*the menu*/
+ in[0] = '\0';
+ while(in[0] != 'c' && in[0] != 'C' && in[0] != 'q' && in[0] != 'Q') {
+ printf("\n");
+ printf("[u] Create User\n");
+ printf("[g] Create Group\n");
+ printf("[m] Create Machine Account\n");
+ printf("[c] Cancel\n\n");
+
+ printf("Command: ");
+ mgr_getline(in);
+
+ printf("\n");
+
+ switch(in[0]) {
+ case 'u': /*create user*/
+ case 'U':
+ ZERO_STRUCT(cu);
+ cu.in.dom_hnd = dom_hnd;
+ cu.in.acb_mask = ACB_NORMAL;
+
+ printf("Enter name: ");
+ mgr_getline(tmp);
+ cu.in.name = talloc_strdup(mem_ctx, tmp);
+
+ if(!cac_SamCreateUser(hnd, mem_ctx, &cu)) {
+ printerr("Could not create user.", hnd->status);
+ }
+ else {
+ user_menu(hnd, mem_ctx, dom_hnd, cu.out.user_hnd);
+ }
+
+ /*this will break the loop and send us back to the main menu*/
+ in[0] = 'c';
+ break;
+
+ case 'g': /*create group*/
+ case 'G':
+ ZERO_STRUCT(cg);
+ cg.in.dom_hnd = dom_hnd;
+ cg.in.access = MAXIMUM_ALLOWED_ACCESS;
+
+ printf("Enter name: ");
+ mgr_getline(tmp);
+ cg.in.name = talloc_strdup(mem_ctx, tmp);
+
+ if(!cac_SamCreateGroup(hnd, mem_ctx, &cg)) {
+ printerr("Could not create group.", hnd->status);
+ }
+ else {
+ group_menu(hnd, mem_ctx, dom_hnd, cg.out.group_hnd);
+ }
+
+ /*this will break the loop and send us back to the main menu*/
+ in[0] = 'c';
+ break;
+
+ case 'm': /*create machine account*/
+ case 'M':
+ ZERO_STRUCT(cu);
+ cu.in.dom_hnd = dom_hnd;
+ cu.in.acb_mask = ACB_WSTRUST;
+
+ printf("Enter machine name: ");
+ mgr_getline(tmp);
+
+ /*make sure we have a $ on the end*/
+ if(tmp[strlen(tmp) - 1] != '$')
+ cu.in.name = talloc_asprintf(mem_ctx, "%s$", tmp);
+ else
+ cu.in.name = talloc_strdup(mem_ctx, tmp);
+
+ strlower_m(cu.in.name);
+
+ printf("Creating account: %s\n", cu.in.name);
+
+ if(!cac_SamCreateUser(hnd, mem_ctx, &cu)) {
+ printerr("Could not create account.", hnd->status);
+ }
+ else {
+ user_menu(hnd, mem_ctx, dom_hnd, cu.out.user_hnd);
+ }
+
+ /*this will break the loop and send us back to the main menu*/
+ in[0] = 'c';
+ break;
+
+ case 'c': /*cancel*/
+ case 'C':
+ case 'q':
+ case 'Q':
+ /*do nothing*/
+ break;
+
+ default:
+ printf("Invalid option\n");
+ }
+ }
+
+ return;
+}
+
+void main_menu(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd) {
+ fstring in;
+
+ uint32 rid_type = 0;
+
+ struct SamOpenUser openu;
+ struct SamOpenGroup openg;
+ struct SamEnumUsers enumu;
+ struct SamEnumGroups enumg;
+ struct SamFlush flush;
+
+ char *name = NULL;
+ uint32 rid = 0;
+
+ if(!hnd || !mem_ctx || !dom_hnd) {
+ printf("No handle to SAM.\n");
+ return;
+ }
+
+ /*initialize this here and don't worry about it later*/
+ ZERO_STRUCT(flush);
+ flush.in.dom_hnd = dom_hnd;
+
+ in[0] = '\0';
+
+ /*handle the menu and commands*/
+ while(in[0] != 'q' && in[0] != 'Q') {
+ printf("\n");
+
+ printf("[o] Open User or Group\n");
+ printf("[c] Create Account or Group\n");
+ printf("[u] List Users\n");
+ printf("[g] List Groups\n");
+ printf("[m] List Machine Accounts\n");
+ printf("[q] Quit\n\n");
+
+ printf("Command: ");
+
+ mgr_getline(in);
+
+ printf("\n");
+
+ switch(in[0]) {
+ case 'o': /*open user or group*/
+ case 'O':
+ printf("Enter RID or Name: ");
+ rid_type = rid_or_name(hnd, mem_ctx, dom_hnd, &rid, &name);
+
+ if(rid_type == CAC_USER_RID) {
+ ZERO_STRUCT(openu);
+ openu.in.dom_hnd = dom_hnd;
+ openu.in.rid = rid;
+ openu.in.access = MAXIMUM_ALLOWED_ACCESS;
+
+ if(!cac_SamOpenUser(hnd, mem_ctx, &openu))
+ printerr("Could not open user.", hnd->status);
+ else {
+ user_menu(hnd, mem_ctx, dom_hnd, openu.out.user_hnd);
+
+ if(!cac_SamFlush(hnd, mem_ctx, &flush)) {
+ printerr("Lost handle while flushing SAM.", hnd->status);
+ /*we want to quit*/
+ in[0] = 'q';
+ }
+ }
+ }
+ else if(rid_type == CAC_GROUP_RID) {
+ ZERO_STRUCT(openg);
+ openg.in.dom_hnd = dom_hnd;
+ openg.in.rid = rid;
+ openg.in.access = MAXIMUM_ALLOWED_ACCESS;
+
+ if(!cac_SamOpenGroup(hnd, mem_ctx, &openg))
+ printerr("Could not open group.", hnd->status);
+ else {
+ group_menu(hnd, mem_ctx, dom_hnd, openg.out.group_hnd);
+
+ if(!cac_SamFlush(hnd, mem_ctx, &flush)) {
+ printerr("Lost handle while flushing SAM.", hnd->status);
+ /*we want to quit*/
+ in[0] = 'q';
+ }
+ }
+ }
+ else {
+ printf("Unknown RID/Name.\n");
+ }
+
+ break;
+
+ case 'c': /*create account/group*/
+ case 'C':
+ create_menu(hnd, mem_ctx, dom_hnd);
+ if(!cac_SamFlush(hnd, mem_ctx, &flush)) {
+ printerr("Lost handle while flushing SAM.", hnd->status);
+ /*we want to quit*/
+ in[0] = 'q';
+ }
+ break;
+
+ case 'u': /*list users*/
+ case 'U':
+ ZERO_STRUCT(enumu);
+ enumu.in.dom_hnd = dom_hnd;
+ enumu.in.acb_mask = ACB_NORMAL;
+
+ printf("Users:\n");
+ while(cac_SamEnumUsers(hnd, mem_ctx, &enumu)) {
+ print_rid_list(enumu.out.rids, enumu.out.names, enumu.out.num_users);
+ }
+ if(CAC_OP_FAILED(hnd->status))
+ printerr("Error occured while enumerating users.", hnd->status);
+ break;
+
+ case 'g': /*list groups*/
+ case 'G':
+ ZERO_STRUCT(enumg);
+ enumg.in.dom_hnd = dom_hnd;
+
+ while(cac_SamEnumGroups(hnd, mem_ctx, &enumg)) {
+ print_rid_list( enumg.out.rids, enumg.out.names, enumg.out.num_groups);
+ }
+
+ if(CAC_OP_FAILED(hnd->status))
+ printerr("Error occured while enumerating groups.", hnd->status);
+ break;
+
+ case 'm': /*list machine accounts*/
+ case 'M':
+ ZERO_STRUCT(enumu);
+ enumu.in.dom_hnd = dom_hnd;
+ enumu.in.acb_mask = ACB_WSTRUST;
+
+ printf("Users:\n");
+ while(cac_SamEnumUsers(hnd, mem_ctx, &enumu)) {
+ print_rid_list( enumu.out.rids, enumu.out.names, enumu.out.num_users);
+ }
+ if(CAC_OP_FAILED(hnd->status))
+ printerr("Error occured while enumerating accounts.", hnd->status);
+ break;
+
+ case 'q': /*quit*/
+ case 'Q':
+ /*just do nothing*/
+ break;
+
+ default:
+ printf("Invalid Command.\n");
+ }
+ }
+}
+
+int main(int argc, char **argv) {
+ CacServerHandle *hnd = NULL;
+ TALLOC_CTX *mem_ctx = NULL;
+
+ struct SamOpenDomain sod;
+
+ mem_ctx = talloc_init("cacusermgr");
+ if(!mem_ctx) {
+ printf("Could not initialize Talloc Context\n");
+ exit(-1);
+ }
+
+ /**first initialize the server handle with what we have*/
+ hnd = cac_NewServerHandle(True);
+ if(!hnd) {
+ printf("Could not create server handle\n");
+ exit(-1);
+ }
+
+ /*fill in the blanks*/
+ if(!process_cmd_line(hnd, mem_ctx, argc, argv))
+ usage();
+
+ if(!cac_Connect(hnd, NULL)) {
+ printf("Could not connect to server %s. %s\n", hnd->server, nt_errstr(hnd->status));
+ exit(-1);
+ }
+
+ /*open the domain sam*/
+ ZERO_STRUCT(sod);
+ sod.in.access = MAXIMUM_ALLOWED_ACCESS;
+
+ if(!cac_SamOpenDomain(hnd, mem_ctx, &sod)) {
+ printf("Could not open handle to domain SAM. %s\n", nt_errstr(hnd->status));
+ goto cleanup;
+ }
+
+ main_menu(hnd, mem_ctx, sod.out.dom_hnd);
+
+cleanup:
+
+ if(sod.out.dom_hnd)
+ cac_SamClose(hnd, mem_ctx, sod.out.dom_hnd);
+
+ if(sod.out.sam)
+ cac_SamClose(hnd, mem_ctx, sod.out.sam);
+
+ cac_FreeHandle(hnd);
+
+ talloc_destroy(mem_ctx);
+
+ return 0;
+}