00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "includes.h"
00025 #include "rpcclient.h"
00026
00027
00028
00029 static char *get_server_type_str(uint32 type)
00030 {
00031 static fstring typestr;
00032 int i;
00033
00034 if (type == SV_TYPE_ALL) {
00035 fstrcpy(typestr, "All");
00036 return typestr;
00037 }
00038
00039 typestr[0] = 0;
00040
00041 for (i = 0; i < 32; i++) {
00042 if (type & (1 << i)) {
00043 switch (1 << i) {
00044 case SV_TYPE_WORKSTATION:
00045 fstrcat(typestr, "Wk ");
00046 break;
00047 case SV_TYPE_SERVER:
00048 fstrcat(typestr, "Sv ");
00049 break;
00050 case SV_TYPE_SQLSERVER:
00051 fstrcat(typestr, "Sql ");
00052 break;
00053 case SV_TYPE_DOMAIN_CTRL:
00054 fstrcat(typestr, "PDC ");
00055 break;
00056 case SV_TYPE_DOMAIN_BAKCTRL:
00057 fstrcat(typestr, "BDC ");
00058 break;
00059 case SV_TYPE_TIME_SOURCE:
00060 fstrcat(typestr, "Tim ");
00061 break;
00062 case SV_TYPE_AFP:
00063 fstrcat(typestr, "AFP ");
00064 break;
00065 case SV_TYPE_NOVELL:
00066 fstrcat(typestr, "Nov ");
00067 break;
00068 case SV_TYPE_DOMAIN_MEMBER:
00069 fstrcat(typestr, "Dom ");
00070 break;
00071 case SV_TYPE_PRINTQ_SERVER:
00072 fstrcat(typestr, "PrQ ");
00073 break;
00074 case SV_TYPE_DIALIN_SERVER:
00075 fstrcat(typestr, "Din ");
00076 break;
00077 case SV_TYPE_SERVER_UNIX:
00078 fstrcat(typestr, "Unx ");
00079 break;
00080 case SV_TYPE_NT:
00081 fstrcat(typestr, "NT ");
00082 break;
00083 case SV_TYPE_WFW:
00084 fstrcat(typestr, "Wfw ");
00085 break;
00086 case SV_TYPE_SERVER_MFPN:
00087 fstrcat(typestr, "Mfp ");
00088 break;
00089 case SV_TYPE_SERVER_NT:
00090 fstrcat(typestr, "SNT ");
00091 break;
00092 case SV_TYPE_POTENTIAL_BROWSER:
00093 fstrcat(typestr, "PtB ");
00094 break;
00095 case SV_TYPE_BACKUP_BROWSER:
00096 fstrcat(typestr, "BMB ");
00097 break;
00098 case SV_TYPE_MASTER_BROWSER:
00099 fstrcat(typestr, "LMB ");
00100 break;
00101 case SV_TYPE_DOMAIN_MASTER:
00102 fstrcat(typestr, "DMB ");
00103 break;
00104 case SV_TYPE_SERVER_OSF:
00105 fstrcat(typestr, "OSF ");
00106 break;
00107 case SV_TYPE_SERVER_VMS:
00108 fstrcat(typestr, "VMS ");
00109 break;
00110 case SV_TYPE_WIN95_PLUS:
00111 fstrcat(typestr, "W95 ");
00112 break;
00113 case SV_TYPE_ALTERNATE_XPORT:
00114 fstrcat(typestr, "Xpt ");
00115 break;
00116 case SV_TYPE_LOCAL_LIST_ONLY:
00117 fstrcat(typestr, "Dom ");
00118 break;
00119 case SV_TYPE_DOMAIN_ENUM:
00120 fstrcat(typestr, "Loc ");
00121 break;
00122 }
00123 }
00124 }
00125
00126 i = strlen(typestr) - 1;
00127
00128 if (typestr[i] == ' ')
00129 typestr[i] = 0;
00130
00131 return typestr;
00132 }
00133
00134 static void display_server(char *sname, uint32 type, const char *comment)
00135 {
00136 printf("\t%-15.15s%-20s %s\n", sname, get_server_type_str(type),
00137 comment);
00138 }
00139
00140 static void display_srv_info_101(SRV_INFO_101 *sv101)
00141 {
00142 fstring name;
00143 fstring comment;
00144
00145 unistr2_to_ascii(name, &sv101->uni_name, sizeof(name) - 1);
00146 unistr2_to_ascii(comment, &sv101->uni_comment, sizeof(comment) - 1);
00147
00148 display_server(name, sv101->srv_type, comment);
00149
00150 printf("\tplatform_id :\t%d\n", sv101->platform_id);
00151 printf("\tos version :\t%d.%d\n", sv101->ver_major,
00152 sv101->ver_minor);
00153
00154 printf("\tserver type :\t0x%x\n", sv101->srv_type);
00155 }
00156
00157 static void display_srv_info_102(SRV_INFO_102 *sv102)
00158 {
00159 fstring name;
00160 fstring comment;
00161 fstring usr_path;
00162
00163 unistr2_to_ascii(name, &sv102->uni_name, sizeof(name) - 1);
00164 unistr2_to_ascii(comment, &sv102->uni_comment, sizeof(comment) - 1);
00165 unistr2_to_ascii(usr_path, &sv102->uni_usr_path, sizeof(usr_path) - 1);
00166
00167 display_server(name, sv102->srv_type, comment);
00168
00169 printf("\tplatform_id :\t%d\n", sv102->platform_id);
00170 printf("\tos version :\t%d.%d\n", sv102->ver_major,
00171 sv102->ver_minor);
00172
00173 printf("\tusers :\t%x\n", sv102->users);
00174 printf("\tdisc, hidden :\t%x, %x\n", sv102->disc, sv102->hidden);
00175 printf("\tannounce, delta :\t%d, %d\n", sv102->announce,
00176 sv102->ann_delta);
00177 printf("\tlicenses :\t%d\n", sv102->licenses);
00178 printf("\tuser path :\t%s\n", usr_path);
00179 }
00180
00181
00182 static WERROR cmd_srvsvc_srv_query_info(struct rpc_pipe_client *cli,
00183 TALLOC_CTX *mem_ctx,
00184 int argc, const char **argv)
00185 {
00186 uint32 info_level = 101;
00187 SRV_INFO_CTR ctr;
00188 WERROR result;
00189
00190 if (argc > 2) {
00191 printf("Usage: %s [infolevel]\n", argv[0]);
00192 return WERR_OK;
00193 }
00194
00195 if (argc == 2)
00196 info_level = atoi(argv[1]);
00197
00198 result = rpccli_srvsvc_net_srv_get_info(cli, mem_ctx, info_level,
00199 &ctr);
00200
00201 if (!W_ERROR_IS_OK(result)) {
00202 goto done;
00203 }
00204
00205
00206
00207 switch (info_level) {
00208 case 101:
00209 display_srv_info_101(&ctr.srv.sv101);
00210 break;
00211 case 102:
00212 display_srv_info_102(&ctr.srv.sv102);
00213 break;
00214 default:
00215 printf("unsupported info level %d\n", info_level);
00216 break;
00217 }
00218
00219 done:
00220 return result;
00221 }
00222
00223 static void display_share_info_1(SRV_SHARE_INFO_1 *info1)
00224 {
00225 fstring netname = "", remark = "";
00226
00227 rpcstr_pull_unistr2_fstring(netname, &info1->info_1_str.uni_netname);
00228 rpcstr_pull_unistr2_fstring(remark, &info1->info_1_str.uni_remark);
00229
00230 printf("netname: %s\n", netname);
00231 printf("\tremark:\t%s\n", remark);
00232 }
00233
00234 static void display_share_info_2(SRV_SHARE_INFO_2 *info2)
00235 {
00236 fstring netname = "", remark = "", path = "", passwd = "";
00237
00238 rpcstr_pull_unistr2_fstring(netname, &info2->info_2_str.uni_netname);
00239 rpcstr_pull_unistr2_fstring(remark, &info2->info_2_str.uni_remark);
00240 rpcstr_pull_unistr2_fstring(path, &info2->info_2_str.uni_path);
00241 rpcstr_pull_unistr2_fstring(passwd, &info2->info_2_str.uni_passwd);
00242
00243 printf("netname: %s\n", netname);
00244 printf("\tremark:\t%s\n", remark);
00245 printf("\tpath:\t%s\n", path);
00246 printf("\tpassword:\t%s\n", passwd);
00247 }
00248
00249 static void display_share_info_502(SRV_SHARE_INFO_502 *info502)
00250 {
00251 fstring netname = "", remark = "", path = "", passwd = "";
00252
00253 rpcstr_pull_unistr2_fstring(netname, &info502->info_502_str.uni_netname);
00254 rpcstr_pull_unistr2_fstring(remark, &info502->info_502_str.uni_remark);
00255 rpcstr_pull_unistr2_fstring(path, &info502->info_502_str.uni_path);
00256 rpcstr_pull_unistr2_fstring(passwd, &info502->info_502_str.uni_passwd);
00257
00258 printf("netname: %s\n", netname);
00259 printf("\tremark:\t%s\n", remark);
00260 printf("\tpath:\t%s\n", path);
00261 printf("\tpassword:\t%s\n", passwd);
00262
00263 printf("\ttype:\t0x%x\n", info502->info_502.type);
00264 printf("\tperms:\t%d\n", info502->info_502.perms);
00265 printf("\tmax_uses:\t%d\n", info502->info_502.max_uses);
00266 printf("\tnum_uses:\t%d\n", info502->info_502.num_uses);
00267
00268 if (info502->info_502_str.sd)
00269 display_sec_desc(info502->info_502_str.sd);
00270
00271 }
00272
00273 static WERROR cmd_srvsvc_net_share_enum(struct rpc_pipe_client *cli,
00274 TALLOC_CTX *mem_ctx,
00275 int argc, const char **argv)
00276 {
00277 uint32 info_level = 2;
00278 SRV_SHARE_INFO_CTR ctr;
00279 WERROR result;
00280 ENUM_HND hnd;
00281 uint32 preferred_len = 0xffffffff, i;
00282
00283 if (argc > 2) {
00284 printf("Usage: %s [infolevel]\n", argv[0]);
00285 return WERR_OK;
00286 }
00287
00288 if (argc == 2)
00289 info_level = atoi(argv[1]);
00290
00291 init_enum_hnd(&hnd, 0);
00292
00293 result = rpccli_srvsvc_net_share_enum(
00294 cli, mem_ctx, info_level, &ctr, preferred_len, &hnd);
00295
00296 if (!W_ERROR_IS_OK(result) || !ctr.num_entries)
00297 goto done;
00298
00299
00300
00301 switch (info_level) {
00302 case 1:
00303 for (i = 0; i < ctr.num_entries; i++)
00304 display_share_info_1(&ctr.share.info1[i]);
00305 break;
00306 case 2:
00307 for (i = 0; i < ctr.num_entries; i++)
00308 display_share_info_2(&ctr.share.info2[i]);
00309 break;
00310 case 502:
00311 for (i = 0; i < ctr.num_entries; i++)
00312 display_share_info_502(&ctr.share.info502[i]);
00313 break;
00314 default:
00315 printf("unsupported info level %d\n", info_level);
00316 break;
00317 }
00318
00319 done:
00320 return result;
00321 }
00322
00323 static WERROR cmd_srvsvc_net_share_get_info(struct rpc_pipe_client *cli,
00324 TALLOC_CTX *mem_ctx,
00325 int argc, const char **argv)
00326 {
00327 uint32 info_level = 502;
00328 SRV_SHARE_INFO info;
00329 WERROR result;
00330
00331 if (argc > 3) {
00332 printf("Usage: %s [sharename] [infolevel]\n", argv[0]);
00333 return WERR_OK;
00334 }
00335
00336 if (argc == 3)
00337 info_level = atoi(argv[2]);
00338
00339 result = rpccli_srvsvc_net_share_get_info(cli, mem_ctx, argv[1], info_level, &info);
00340
00341 if (!W_ERROR_IS_OK(result))
00342 goto done;
00343
00344
00345
00346 switch (info_level) {
00347 case 1:
00348 display_share_info_1(&info.share.info1);
00349 break;
00350 case 2:
00351 display_share_info_2(&info.share.info2);
00352 break;
00353 case 502:
00354 display_share_info_502(&info.share.info502);
00355 break;
00356 default:
00357 printf("unsupported info level %d\n", info_level);
00358 break;
00359 }
00360
00361 done:
00362 return result;
00363 }
00364
00365 static WERROR cmd_srvsvc_net_share_set_info(struct rpc_pipe_client *cli,
00366 TALLOC_CTX *mem_ctx,
00367 int argc, const char **argv)
00368 {
00369 uint32 info_level = 502;
00370 SRV_SHARE_INFO info_get;
00371 WERROR result;
00372
00373 if (argc > 3) {
00374 printf("Usage: %s [sharename] [comment]\n", argv[0]);
00375 return WERR_OK;
00376 }
00377
00378
00379 result = rpccli_srvsvc_net_share_get_info(cli, mem_ctx, argv[1], info_level, &info_get);
00380 if (!W_ERROR_IS_OK(result))
00381 goto done;
00382
00383 info_get.switch_value = info_level;
00384 info_get.ptr_share_ctr = 1;
00385 init_unistr2(&(info_get.share.info502.info_502_str.uni_remark), argv[2], UNI_STR_TERMINATE);
00386
00387
00388 result = rpccli_srvsvc_net_share_set_info(cli, mem_ctx, argv[1], info_level, &info_get);
00389
00390 if (!W_ERROR_IS_OK(result))
00391 goto done;
00392
00393
00394 result = rpccli_srvsvc_net_share_get_info(cli, mem_ctx, argv[1], info_level, &info_get);
00395 if (!W_ERROR_IS_OK(result))
00396 goto done;
00397
00398 display_share_info_502(&info_get.share.info502);
00399
00400 done:
00401 return result;
00402 }
00403
00404 static WERROR cmd_srvsvc_net_remote_tod(struct rpc_pipe_client *cli,
00405 TALLOC_CTX *mem_ctx,
00406 int argc, const char **argv)
00407 {
00408 TIME_OF_DAY_INFO tod;
00409 fstring srv_name_slash;
00410 WERROR result;
00411
00412 if (argc > 1) {
00413 printf("Usage: %s\n", argv[0]);
00414 return WERR_OK;
00415 }
00416
00417 fstr_sprintf(srv_name_slash, "\\\\%s", cli->cli->desthost);
00418 result = rpccli_srvsvc_net_remote_tod(
00419 cli, mem_ctx, srv_name_slash, &tod);
00420
00421 if (!W_ERROR_IS_OK(result))
00422 goto done;
00423
00424 done:
00425 return result;
00426 }
00427
00428 static WERROR cmd_srvsvc_net_file_enum(struct rpc_pipe_client *cli,
00429 TALLOC_CTX *mem_ctx,
00430 int argc, const char **argv)
00431 {
00432 uint32 info_level = 3;
00433 SRV_FILE_INFO_CTR ctr;
00434 WERROR result;
00435 ENUM_HND hnd;
00436 uint32 preferred_len = 0xffff;
00437
00438 if (argc > 2) {
00439 printf("Usage: %s [infolevel]\n", argv[0]);
00440 return WERR_OK;
00441 }
00442
00443 if (argc == 2)
00444 info_level = atoi(argv[1]);
00445
00446 init_enum_hnd(&hnd, 0);
00447
00448 ZERO_STRUCT(ctr);
00449
00450 result = rpccli_srvsvc_net_file_enum(
00451 cli, mem_ctx, info_level, NULL, &ctr, preferred_len, &hnd);
00452
00453 if (!W_ERROR_IS_OK(result))
00454 goto done;
00455
00456 done:
00457 return result;
00458 }
00459
00460
00461
00462 struct cmd_set srvsvc_commands[] = {
00463
00464 { "SRVSVC" },
00465
00466 { "srvinfo", RPC_RTYPE_WERROR, NULL, cmd_srvsvc_srv_query_info, PI_SRVSVC, NULL, "Server query info", "" },
00467 { "netshareenum",RPC_RTYPE_WERROR, NULL, cmd_srvsvc_net_share_enum, PI_SRVSVC, NULL, "Enumerate shares", "" },
00468 { "netsharegetinfo",RPC_RTYPE_WERROR, NULL, cmd_srvsvc_net_share_get_info, PI_SRVSVC, NULL, "Get Share Info", "" },
00469 { "netsharesetinfo",RPC_RTYPE_WERROR, NULL, cmd_srvsvc_net_share_set_info, PI_SRVSVC, NULL, "Set Share Info", "" },
00470 { "netfileenum", RPC_RTYPE_WERROR, NULL, cmd_srvsvc_net_file_enum, PI_SRVSVC, NULL, "Enumerate open files", "" },
00471 { "netremotetod",RPC_RTYPE_WERROR, NULL, cmd_srvsvc_net_remote_tod, PI_SRVSVC, NULL, "Fetch remote time of day", "" },
00472
00473 { NULL }
00474 };