⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 samuser.c

📁 samba服务器!
💻 C
字号:
/*Some user management stuff*/#include "libmsrpc.h"#include "test_util.h"int main(int argc, char **argv) {   CacServerHandle *hnd = NULL;   TALLOC_CTX *mem_ctx = NULL;                  struct SamOpenUser    ou;   struct SamEnumUsers   eu;   struct SamCreateUser  cu;   struct SamGetUserInfo gi;   struct SamSetUserInfo si;   struct SamRenameUser  ru;   struct SamSetPassword sp;   POLICY_HND *user_hnd = NULL;   fstring tmp;   fstring input;   char *pass1 = NULL;   char *pass2 = NULL;      int i;   mem_ctx = talloc_init("cac_samgroup");   hnd = cac_NewServerHandle(True);   cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);   cac_parse_cmd_line(argc, argv, hnd);   if(!cac_Connect(hnd, NULL)) {      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));      exit(-1);   }   struct SamOpenDomain sod;   ZERO_STRUCT(sod);   sod.in.access = MAXIMUM_ALLOWED_ACCESS;    if(!cac_SamOpenDomain(hnd, mem_ctx, &sod)) {      fprintf(stderr, "Could not open domain. Error: %s\n", nt_errstr(hnd->status));      goto done;   }   tmp[0] = 0x00;   while(tmp[0] != 'q') {      printf("\n");      printf("[l]ist users\n");      printf("[c]reate user\n");      printf("[o]pen user\n");      printf("[d]elete user\n");      printf("[g]et user info\n");      printf("[e]dit user info\n");      printf("[r]ename user\n");      printf("reset [p]assword\n");      printf("[n] close user\n");      printf("[q]uit\n\n");      printf("Enter option: ");      cactest_readline(stdin, tmp);      printf("\n");      switch(tmp[0]) {         case 'c': /*create user*/            if(user_hnd != NULL) {               /*then we have an open handle.. close it*/               cac_SamClose(hnd, mem_ctx, user_hnd);               user_hnd = NULL;            }            printf("Enter user name: ");            cactest_readline(stdin, input);            ZERO_STRUCT(cu);            cu.in.name      = talloc_strdup(mem_ctx, input);            cu.in.dom_hnd   = sod.out.dom_hnd;            cu.in.acb_mask  = ACB_NORMAL;            if(!cac_SamCreateUser(hnd, mem_ctx, &cu)) {               printf("Could not create user. Error: %s\n", nt_errstr(hnd->status));            }            else {               printf("Created user %s with RID 0x%x\n", cu.in.name, cu.out.rid);               user_hnd = cu.out.user_hnd;            }            break;         case 'o': /*open group*/            if(user_hnd != NULL) {               /*then we have an open handle.. close it*/               cac_SamClose(hnd, mem_ctx, user_hnd);               user_hnd = NULL;            }            ZERO_STRUCT(ou);            ou.in.dom_hnd = sod.out.dom_hnd;            ou.in.access = MAXIMUM_ALLOWED_ACCESS;            printf("Enter RID: 0x");            scanf("%x", &ou.in.rid);            if(!cac_SamOpenUser(hnd, mem_ctx, &ou)) {               fprintf(stderr, "Could not open user. Error: %s\n", nt_errstr(hnd->status));            }            else {               printf("Opened user\n");               user_hnd = ou.out.user_hnd;            }            break;         case 'l': /*list users*/            ZERO_STRUCT(eu);            eu.in.dom_hnd = sod.out.dom_hnd;            while(cac_SamEnumUsers(hnd, mem_ctx, &eu)) {               for(i = 0; i < eu.out.num_users; i++) {                  printf("RID: 0x%x Name: %s\n", eu.out.rids[i], eu.out.names[i]);               }            }            if(CAC_OP_FAILED(hnd->status)) {               printf("Could not enumerate Users. Error: %s\n", nt_errstr(hnd->status));            }            break;                        break;         case 'd': /*delete group*/            if(!user_hnd) {               printf("Must open group first!\n");               break;            }            if(!cac_SamDeleteGroup(hnd, mem_ctx, user_hnd)) {               fprintf(stderr, "Could not delete group. Error: %s\n", nt_errstr(hnd->status));            }            else {               printf("Deleted group.\n");               user_hnd = NULL;            }            break;                  case 'n':            if(!user_hnd) {               printf("Must open user first!\n");               break;            }            if(!cac_SamClose(hnd, mem_ctx, user_hnd)) {               printf("Could not user group\n");               break;            }            user_hnd = NULL;            break;         case 'g': /*get user info*/            if(!user_hnd) {               printf("Must open user first!\n");               break;            }            ZERO_STRUCT(gi);            gi.in.user_hnd = ou.out.user_hnd;            if(!cac_SamGetUserInfo(hnd, mem_ctx, &gi)) {               printf("Could not get user info. Error: %s\n", nt_errstr(hnd->status));            }            else {               printf("Retrieved User information:\n");               print_cac_user_info(gi.out.info);            }             break;         case 'e': /*edit user info*/            if(!user_hnd) {               printf("Must Open user first!\n");               break;            }            ZERO_STRUCT(gi);            gi.in.user_hnd = ou.out.user_hnd;            if(!cac_SamGetUserInfo(hnd, mem_ctx, &gi)) {               printf("Could not get user info. Error: %s\n", nt_errstr(hnd->status));               break;            }                        edit_cac_user_info(mem_ctx, gi.out.info);            printf("setting following info:\n");            print_cac_user_info(gi.out.info);            ZERO_STRUCT(si);            si.in.user_hnd = user_hnd;            si.in.info     = gi.out.info;            if(!cac_SamSetUserInfo(hnd, mem_ctx, &si)) {               printf("Could not set user info. Error: %s\n", nt_errstr(hnd->status));            }            else {               printf("Done.\n");            }            break;         case 'r': /*rename user*/            if(!user_hnd) {               printf("Must open user first!\n");               break;            }            ZERO_STRUCT(ru);            printf("Enter new username: ");            cactest_readline(stdin, tmp);            ru.in.user_hnd = user_hnd;            ru.in.new_name = talloc_strdup(mem_ctx, tmp);            if(!cac_SamRenameUser(hnd, mem_ctx, &ru)) {               printf("Could not rename user. Error: %s\n", nt_errstr(hnd->status));            }            else {               printf("Renamed user\n");            }            break;         case 'p': /*reset password*/            if(!user_hnd) {               printf("Must open user first!\n");               break;            }            do {               if(pass1 && pass2) {                  printf("Passwords do not match. Please try again\n");               }               pass1 = getpass("Enter new password: ");               pass2 = getpass("Re-enter new password: ");            } while(strncmp(pass1, pass2, MAX_PASS_LEN));            ZERO_STRUCT(sp);            sp.in.user_hnd = user_hnd;            sp.in.password = talloc_strdup(mem_ctx, pass1);            if(!cac_SamSetPassword(hnd, mem_ctx, &sp)) {               printf("Could not set password. Error: %s\n", nt_errstr(hnd->status));            }            else {               printf("Done.\n");            }            break;         case 'q':            break;         default:            printf("Invalid command\n");      }   }   cac_SamClose(hnd, mem_ctx, sod.out.dom_hnd);   if(user_hnd)      cac_SamClose(hnd, mem_ctx, user_hnd);done:   cac_FreeHandle(hnd);   talloc_destroy(mem_ctx);   return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -