📄 clirap2.c
字号:
* False - failure*************************************************************************/BOOL cli_get_pdc_name(struct cli_state *cli, char *workgroup, char *pdc_name){ char *rparam = NULL; char *rdata = NULL; unsigned int rdrcnt,rprcnt; char *p; char param[WORDSIZE /* api number */ +sizeof(RAP_NetServerEnum2_REQ) /* req string */ +sizeof(RAP_SERVER_INFO_L1) /* return string */ +WORDSIZE /* info level */ +WORDSIZE /* buffer size */ +DWORDSIZE /* server type */ +RAP_MACHNAME_LEN]; /* workgroup */ int count = -1; *pdc_name = '\0'; /* send a SMBtrans command with api NetServerEnum */ p = make_header(param, RAP_NetServerEnum2, RAP_NetServerEnum2_REQ, RAP_SERVER_INFO_L1); PUTWORD(p, 1); /* info level */ PUTWORD(p, CLI_BUFFER_SIZE); PUTDWORD(p, SV_TYPE_DOMAIN_CTRL); PUTSTRING(p, workgroup, RAP_MACHNAME_LEN); if (cli_api(cli, param, PTR_DIFF(p,param), 8, /* params, length, max */ NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ &rparam, &rprcnt, /* return params, return size */ &rdata, &rdrcnt /* return data, return size */ )) { cli->rap_error = GETRES(rparam); /* * We only really care to copy a name if the * API succeeded and we got back a name. */ if (cli->rap_error == 0) { p = rparam + WORDSIZE + WORDSIZE; /* skip result and converter */ GETWORD(p, count); p = rdata; if (count > 0) GETSTRING(p, pdc_name); } else { DEBUG(4,("cli_get_pdc_name: machine %s failed the NetServerEnum call. " "Error was : %s.\n", cli->desthost, cli_errstr(cli) )); } } SAFE_FREE(rparam); SAFE_FREE(rdata); return(count > 0);}/*************************************************************************** Function Name: cli_get_server_domain** PURPOSE: Remotes a NetWkstaGetInfo API call to the current server* requesting wksta_info_10 level information to determine* the domain the server belongs to. On success, this* routine sets the server_domain field in the cli_state structure* to the server's domain name.** Dependencies: none** Parameters: * cli - pointer to cli_state structure** Returns:* True - success* False - failure** Origins: samba 2.0.6 source/libsmb/clientgen.c cli_NetServerEnum()*************************************************************************/BOOL cli_get_server_domain(struct cli_state *cli){ char *rparam = NULL; char *rdata = NULL; unsigned int rdrcnt,rprcnt; char *p; char param[WORDSIZE /* api number */ +sizeof(RAP_WWkstaGetInfo_REQ) /* req string */ +sizeof(RAP_WKSTA_INFO_L10) /* return string */ +WORDSIZE /* info level */ +WORDSIZE]; /* buffer size */ int res = -1; /* send a SMBtrans command with api NetWkstaGetInfo */ p = make_header(param, RAP_WWkstaGetInfo, RAP_WWkstaGetInfo_REQ, RAP_WKSTA_INFO_L10); PUTWORD(p, 10); /* info level */ PUTWORD(p, CLI_BUFFER_SIZE); if (cli_api(cli, param, PTR_DIFF(p,param), 8, /* params, length, max */ NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ &rparam, &rprcnt, /* return params, return size */ &rdata, &rdrcnt)) { /* return data, return size */ res = GETRES(rparam); p = rdata; if (res == 0) { int converter; p = rparam + WORDSIZE; GETWORD(p, converter); p = rdata + DWORDSIZE + DWORDSIZE; /* skip computer & user names */ GETSTRINGP(p, cli->server_domain, rdata, converter); } } SAFE_FREE(rparam); SAFE_FREE(rdata); return(res == 0);}/*************************************************************************** Function Name: cli_get_server_type** PURPOSE: Remotes a NetServerGetInfo API call to the current server* requesting server_info_1 level information to retrieve* the server type.** Dependencies: none** Parameters: * cli - pointer to cli_state structure* pstype - pointer to uint32 to contain returned server type** Returns:* True - success* False - failure** Origins: samba 2.0.6 source/libsmb/clientgen.c cli_NetServerEnum()*************************************************************************/BOOL cli_get_server_type(struct cli_state *cli, uint32 *pstype){ char *rparam = NULL; char *rdata = NULL; unsigned int rdrcnt,rprcnt; char *p; char param[WORDSIZE /* api number */ +sizeof(RAP_WserverGetInfo_REQ) /* req string */ +sizeof(RAP_SERVER_INFO_L1) /* return string */ +WORDSIZE /* info level */ +WORDSIZE]; /* buffer size */ int res = -1; /* send a SMBtrans command with api NetServerGetInfo */ p = make_header(param, RAP_WserverGetInfo, RAP_WserverGetInfo_REQ, RAP_SERVER_INFO_L1); PUTWORD(p, 1); /* info level */ PUTWORD(p, CLI_BUFFER_SIZE); if (cli_api(cli, param, PTR_DIFF(p,param), 8, /* params, length, max */ NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ &rparam, &rprcnt, /* return params, return size */ &rdata, &rdrcnt /* return data, return size */ )) { res = GETRES(rparam); if (res == 0 || res == ERRmoredata) { p = rdata; *pstype = IVAL(p,18) & ~SV_TYPE_LOCAL_LIST_ONLY; } } SAFE_FREE(rparam); SAFE_FREE(rdata); return(res == 0 || res == ERRmoredata);}/*************************************************************************** Function Name: cli_ns_check_server_type** PURPOSE: Remotes a NetServerEnum2 API call to the current server* requesting server_info_0 level information of machines* matching the given server type. If the returned server* list contains the machine name contained in cli->desthost* then we conclude the server type checks out. This routine* is useful to retrieve list of server's of a certain* type when all you have is a null session connection and* can't remote API calls such as NetWkstaGetInfo or * NetServerGetInfo.** Dependencies: none** Parameters: * cli - pointer to cli_state structure* workgroup - pointer to string containing domain* stype - server type** Returns:* True - success* False - failure*************************************************************************/BOOL cli_ns_check_server_type(struct cli_state *cli, char *workgroup, uint32 stype){ char *rparam = NULL; char *rdata = NULL; unsigned int rdrcnt,rprcnt; char *p; char param[WORDSIZE /* api number */ +sizeof(RAP_NetServerEnum2_REQ) /* req string */ +sizeof(RAP_SERVER_INFO_L0) /* return string */ +WORDSIZE /* info level */ +WORDSIZE /* buffer size */ +DWORDSIZE /* server type */ +RAP_MACHNAME_LEN]; /* workgroup */ BOOL found_server = False; int res = -1; /* send a SMBtrans command with api NetServerEnum */ p = make_header(param, RAP_NetServerEnum2, RAP_NetServerEnum2_REQ, RAP_SERVER_INFO_L0); PUTWORD(p, 0); /* info level 0 */ PUTWORD(p, CLI_BUFFER_SIZE); PUTDWORD(p, stype); PUTSTRING(p, workgroup, RAP_MACHNAME_LEN); if (cli_api(cli, param, PTR_DIFF(p,param), 8, /* params, length, max */ NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ &rparam, &rprcnt, /* return params, return size */ &rdata, &rdrcnt /* return data, return size */ )) { res = GETRES(rparam); cli->rap_error = res; if (res == 0 || res == ERRmoredata) { int i, count; p = rparam + WORDSIZE + WORDSIZE; GETWORD(p, count); p = rdata; for (i = 0;i < count;i++, p += 16) { char ret_server[RAP_MACHNAME_LEN]; GETSTRINGF(p, ret_server, RAP_MACHNAME_LEN); if (strequal(ret_server, cli->desthost)) { found_server = True; break; } } } else { DEBUG(4,("cli_ns_check_server_type: machine %s failed the NetServerEnum call. " "Error was : %s.\n", cli->desthost, cli_errstr(cli) )); } } SAFE_FREE(rparam); SAFE_FREE(rdata); return found_server; }/**************************************************************************** perform a NetWkstaUserLogoff****************************************************************************/BOOL cli_NetWkstaUserLogoff(struct cli_state *cli,char *user, char *workstation){ char *rparam = NULL; char *rdata = NULL; char *p; unsigned int rdrcnt,rprcnt; char param[WORDSIZE /* api number */ +sizeof(RAP_NetWkstaUserLogoff_REQ) /* req string */ +sizeof(RAP_USER_LOGOFF_INFO_L1) /* return string */ +RAP_USERNAME_LEN+1 /* user name+pad */ +RAP_MACHNAME_LEN /* wksta name */ +WORDSIZE /* buffer size */ +WORDSIZE]; /* buffer size? */ fstring upperbuf; memset(param, 0, sizeof(param)); /* send a SMBtrans command with api NetWkstaUserLogoff */ p = make_header(param, RAP_WWkstaUserLogoff, RAP_NetWkstaUserLogoff_REQ, RAP_USER_LOGOFF_INFO_L1); PUTDWORD(p, 0); /* Null pointer */ PUTDWORD(p, 0); /* Null pointer */ fstrcpy(upperbuf, user); strupper_m(upperbuf); PUTSTRINGF(p, upperbuf, RAP_USERNAME_LEN); p++; /* strange format, but ok */ fstrcpy(upperbuf, workstation); strupper_m(upperbuf); PUTSTRINGF(p, upperbuf, RAP_MACHNAME_LEN); PUTWORD(p, CLI_BUFFER_SIZE); PUTWORD(p, CLI_BUFFER_SIZE); if (cli_api(cli, param, PTR_DIFF(p,param),1024, /* param, length, max */ NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ &rparam, &rprcnt, /* return params, return size */ &rdata, &rdrcnt /* return data, return size */ )) { cli->rap_error = GETRES(rparam); if (cli->rap_error != 0) { DEBUG(4,("NetwkstaUserLogoff gave error %d\n", cli->rap_error)); } } SAFE_FREE(rparam); SAFE_FREE(rdata); return (cli->rap_error == 0);} int cli_NetPrintQEnum(struct cli_state *cli, void (*qfn)(const char*,uint16,uint16,uint16,const char*,const char*,const char*,const char*,const char*,uint16,uint16), void (*jfn)(uint16,const char*,const char*,const char*,const char*,uint16,uint16,const char*,uint,uint,const char*)){ char param[WORDSIZE /* api number */ +sizeof(RAP_NetPrintQEnum_REQ) /* req string */ +sizeof(RAP_PRINTQ_INFO_L2) /* return string */ +WORDSIZE /* info level */ +WORDSIZE /* buffer size */ +sizeof(RAP_SMB_PRINT_JOB_L1)]; /* more ret data */ char *p; char *rparam = NULL; char *rdata = NULL; unsigned int rprcnt, rdrcnt; int res = -1; memset(param, '\0',sizeof(param)); p = make_header(param, RAP_WPrintQEnum, RAP_NetPrintQEnum_REQ, RAP_PRINTQ_INFO_L2); PUTWORD(p,2); /* Info level 2 */ PUTWORD(p,0xFFE0); /* Return buffer size */ PUTSTRING(p, RAP_SMB_PRINT_JOB_L1, 0); if (cli_api(cli, param, PTR_DIFF(p,param),1024, NULL, 0, CLI_BUFFER_SIZE, &rparam, &rprcnt, &rdata, &rdrcnt)) { res = GETRES(rparam); cli->rap_error = res; if (res != 0) { DEBUG(1,("NetPrintQEnum gave error %d\n", res)); } } if (rdata) { if (res == 0 || res == ERRmoredata) { int i, converter, count; p = rparam + WORDSIZE; GETWORD(p, converter); GETWORD(p, count); p = rdata; for (i=0;i<count;i++) { pstring qname, sep_file, print_proc, dest, parms, comment; uint16 jobcount, priority, start_time, until_time, status; GETSTRINGF(p, qname, RAP_SHARENAME_LEN); p++; /* pad */ GETWORD(p, priority); GETWORD(p, start_time); GETWORD(p, until_time); GETSTRINGP(p, sep_file, rdata, converter); GETSTRINGP(p, print_proc, rdata, converter); GETSTRINGP(p, dest, rdata, converter); GETSTRINGP(p, parms, rdata, converter); GETSTRINGP(p, parms, comment, converter); GETWORD(p, status); GETWORD(p, jobcount); qfn(qname, priority, start_time, until_time, sep_file, print_proc, dest, parms, comment, status, jobcount); if (jobcount) { int j; for (j=0;j<jobcount;j++) { uint16 jid, pos, fsstatus; pstring ownername, notifyname, datatype, jparms, jstatus, jcomment; unsigned int submitted, jsize; GETWORD(p, jid); GETSTRINGF(p, ownername, RAP_USERNAME_LEN);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -