00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "cacusermgr.h"
00022
00023 #define DEFAULT_MENU_LINES 15
00024
00025
00026 void create_menu(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd) {
00027 struct SamCreateUser cu;
00028 struct SamCreateGroup cg;
00029
00030 fstring in;
00031 fstring tmp;
00032
00033 if(!hnd || !mem_ctx || !dom_hnd) {
00034 printf("No Handle to SAM.\n");
00035 return;
00036 }
00037
00038
00039 in[0] = '\0';
00040 while(in[0] != 'c' && in[0] != 'C' && in[0] != 'q' && in[0] != 'Q') {
00041 printf("\n");
00042 printf("[u] Create User\n");
00043 printf("[g] Create Group\n");
00044 printf("[m] Create Machine Account\n");
00045 printf("[c] Cancel\n\n");
00046
00047 printf("Command: ");
00048 mgr_getline(in);
00049
00050 printf("\n");
00051
00052 switch(in[0]) {
00053 case 'u':
00054 case 'U':
00055 ZERO_STRUCT(cu);
00056 cu.in.dom_hnd = dom_hnd;
00057 cu.in.acb_mask = ACB_NORMAL;
00058
00059 printf("Enter name: ");
00060 mgr_getline(tmp);
00061 cu.in.name = talloc_strdup(mem_ctx, tmp);
00062
00063 if(!cac_SamCreateUser(hnd, mem_ctx, &cu)) {
00064 printerr("Could not create user.", hnd->status);
00065 }
00066 else {
00067 user_menu(hnd, mem_ctx, dom_hnd, cu.out.user_hnd);
00068 }
00069
00070
00071 in[0] = 'c';
00072 break;
00073
00074 case 'g':
00075 case 'G':
00076 ZERO_STRUCT(cg);
00077 cg.in.dom_hnd = dom_hnd;
00078 cg.in.access = MAXIMUM_ALLOWED_ACCESS;
00079
00080 printf("Enter name: ");
00081 mgr_getline(tmp);
00082 cg.in.name = talloc_strdup(mem_ctx, tmp);
00083
00084 if(!cac_SamCreateGroup(hnd, mem_ctx, &cg)) {
00085 printerr("Could not create group.", hnd->status);
00086 }
00087 else {
00088 group_menu(hnd, mem_ctx, dom_hnd, cg.out.group_hnd);
00089 }
00090
00091
00092 in[0] = 'c';
00093 break;
00094
00095 case 'm':
00096 case 'M':
00097 ZERO_STRUCT(cu);
00098 cu.in.dom_hnd = dom_hnd;
00099 cu.in.acb_mask = ACB_WSTRUST;
00100
00101 printf("Enter machine name: ");
00102 mgr_getline(tmp);
00103
00104
00105 if(tmp[strlen(tmp) - 1] != '$')
00106 cu.in.name = talloc_asprintf(mem_ctx, "%s$", tmp);
00107 else
00108 cu.in.name = talloc_strdup(mem_ctx, tmp);
00109
00110 strlower_m(cu.in.name);
00111
00112 printf("Creating account: %s\n", cu.in.name);
00113
00114 if(!cac_SamCreateUser(hnd, mem_ctx, &cu)) {
00115 printerr("Could not create account.", hnd->status);
00116 }
00117 else {
00118 user_menu(hnd, mem_ctx, dom_hnd, cu.out.user_hnd);
00119 }
00120
00121
00122 in[0] = 'c';
00123 break;
00124
00125 case 'c':
00126 case 'C':
00127 case 'q':
00128 case 'Q':
00129
00130 break;
00131
00132 default:
00133 printf("Invalid option\n");
00134 }
00135 }
00136
00137 return;
00138 }
00139
00140 void main_menu(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd) {
00141 fstring in;
00142
00143 uint32 rid_type = 0;
00144
00145 struct SamOpenUser openu;
00146 struct SamOpenGroup openg;
00147 struct SamEnumUsers enumu;
00148 struct SamEnumGroups enumg;
00149 struct SamFlush flush;
00150
00151 char *name = NULL;
00152 uint32 rid = 0;
00153
00154 if(!hnd || !mem_ctx || !dom_hnd) {
00155 printf("No handle to SAM.\n");
00156 return;
00157 }
00158
00159
00160 ZERO_STRUCT(flush);
00161 flush.in.dom_hnd = dom_hnd;
00162
00163 in[0] = '\0';
00164
00165
00166 while(in[0] != 'q' && in[0] != 'Q') {
00167 printf("\n");
00168
00169 printf("[o] Open User or Group\n");
00170 printf("[c] Create Account or Group\n");
00171 printf("[u] List Users\n");
00172 printf("[g] List Groups\n");
00173 printf("[m] List Machine Accounts\n");
00174 printf("[q] Quit\n\n");
00175
00176 printf("Command: ");
00177
00178 mgr_getline(in);
00179
00180 printf("\n");
00181
00182 switch(in[0]) {
00183 case 'o':
00184 case 'O':
00185 printf("Enter RID or Name: ");
00186 rid_type = rid_or_name(hnd, mem_ctx, dom_hnd, &rid, &name);
00187
00188 if(rid_type == CAC_USER_RID) {
00189 ZERO_STRUCT(openu);
00190 openu.in.dom_hnd = dom_hnd;
00191 openu.in.rid = rid;
00192 openu.in.access = MAXIMUM_ALLOWED_ACCESS;
00193
00194 if(!cac_SamOpenUser(hnd, mem_ctx, &openu))
00195 printerr("Could not open user.", hnd->status);
00196 else {
00197 user_menu(hnd, mem_ctx, dom_hnd, openu.out.user_hnd);
00198
00199 if(!cac_SamFlush(hnd, mem_ctx, &flush)) {
00200 printerr("Lost handle while flushing SAM.", hnd->status);
00201
00202 in[0] = 'q';
00203 }
00204 }
00205 }
00206 else if(rid_type == CAC_GROUP_RID) {
00207 ZERO_STRUCT(openg);
00208 openg.in.dom_hnd = dom_hnd;
00209 openg.in.rid = rid;
00210 openg.in.access = MAXIMUM_ALLOWED_ACCESS;
00211
00212 if(!cac_SamOpenGroup(hnd, mem_ctx, &openg))
00213 printerr("Could not open group.", hnd->status);
00214 else {
00215 group_menu(hnd, mem_ctx, dom_hnd, openg.out.group_hnd);
00216
00217 if(!cac_SamFlush(hnd, mem_ctx, &flush)) {
00218 printerr("Lost handle while flushing SAM.", hnd->status);
00219
00220 in[0] = 'q';
00221 }
00222 }
00223 }
00224 else {
00225 printf("Unknown RID/Name.\n");
00226 }
00227
00228 break;
00229
00230 case 'c':
00231 case 'C':
00232 create_menu(hnd, mem_ctx, dom_hnd);
00233 if(!cac_SamFlush(hnd, mem_ctx, &flush)) {
00234 printerr("Lost handle while flushing SAM.", hnd->status);
00235
00236 in[0] = 'q';
00237 }
00238 break;
00239
00240 case 'u':
00241 case 'U':
00242 ZERO_STRUCT(enumu);
00243 enumu.in.dom_hnd = dom_hnd;
00244 enumu.in.acb_mask = ACB_NORMAL;
00245
00246 printf("Users:\n");
00247 while(cac_SamEnumUsers(hnd, mem_ctx, &enumu)) {
00248 print_rid_list(enumu.out.rids, enumu.out.names, enumu.out.num_users);
00249 }
00250 if(CAC_OP_FAILED(hnd->status))
00251 printerr("Error occured while enumerating users.", hnd->status);
00252 break;
00253
00254 case 'g':
00255 case 'G':
00256 ZERO_STRUCT(enumg);
00257 enumg.in.dom_hnd = dom_hnd;
00258
00259 while(cac_SamEnumGroups(hnd, mem_ctx, &enumg)) {
00260 print_rid_list( enumg.out.rids, enumg.out.names, enumg.out.num_groups);
00261 }
00262
00263 if(CAC_OP_FAILED(hnd->status))
00264 printerr("Error occured while enumerating groups.", hnd->status);
00265 break;
00266
00267 case 'm':
00268 case 'M':
00269 ZERO_STRUCT(enumu);
00270 enumu.in.dom_hnd = dom_hnd;
00271 enumu.in.acb_mask = ACB_WSTRUST;
00272
00273 printf("Users:\n");
00274 while(cac_SamEnumUsers(hnd, mem_ctx, &enumu)) {
00275 print_rid_list( enumu.out.rids, enumu.out.names, enumu.out.num_users);
00276 }
00277 if(CAC_OP_FAILED(hnd->status))
00278 printerr("Error occured while enumerating accounts.", hnd->status);
00279 break;
00280
00281 case 'q':
00282 case 'Q':
00283
00284 break;
00285
00286 default:
00287 printf("Invalid Command.\n");
00288 }
00289 }
00290 }
00291
00292 int main(int argc, char **argv) {
00293 CacServerHandle *hnd = NULL;
00294 TALLOC_CTX *mem_ctx = NULL;
00295
00296 struct SamOpenDomain sod;
00297
00298 mem_ctx = talloc_init("cacusermgr");
00299 if(!mem_ctx) {
00300 printf("Could not initialize Talloc Context\n");
00301 exit(-1);
00302 }
00303
00305 hnd = cac_NewServerHandle(True);
00306 if(!hnd) {
00307 printf("Could not create server handle\n");
00308 exit(-1);
00309 }
00310
00311
00312 if(!process_cmd_line(hnd, mem_ctx, argc, argv))
00313 usage();
00314
00315 if(!cac_Connect(hnd, NULL)) {
00316 printf("Could not connect to server %s. %s\n", hnd->server, nt_errstr(hnd->status));
00317 exit(-1);
00318 }
00319
00320
00321 ZERO_STRUCT(sod);
00322 sod.in.access = MAXIMUM_ALLOWED_ACCESS;
00323
00324 if(!cac_SamOpenDomain(hnd, mem_ctx, &sod)) {
00325 printf("Could not open handle to domain SAM. %s\n", nt_errstr(hnd->status));
00326 goto cleanup;
00327 }
00328
00329 main_menu(hnd, mem_ctx, sod.out.dom_hnd);
00330
00331 cleanup:
00332
00333 if(sod.out.dom_hnd)
00334 cac_SamClose(hnd, mem_ctx, sod.out.dom_hnd);
00335
00336 if(sod.out.sam)
00337 cac_SamClose(hnd, mem_ctx, sod.out.sam);
00338
00339 cac_FreeHandle(hnd);
00340
00341 talloc_destroy(mem_ctx);
00342
00343 return 0;
00344 }