2007-12-03 12:42:17 +01:00
/*
2002-01-30 06:08:46 +00:00
Unix SMB / CIFS implementation .
2007-12-03 12:42:17 +01:00
RPC pipe client
Copyright ( C ) Günther Deschner 2007
1998-09-25 21:01:52 +00:00
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
2007-07-09 19:25:36 +00:00
the Free Software Foundation ; either version 3 of the License , or
1998-09-25 21:01:52 +00:00
( at your option ) any later version .
2007-12-03 12:42:17 +01:00
1998-09-25 21:01:52 +00:00
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 .
2007-12-03 12:42:17 +01:00
1998-09-25 21:01:52 +00:00
You should have received a copy of the GNU General Public License
2007-07-10 00:52:41 +00:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
1998-09-25 21:01:52 +00:00
*/
# include "includes.h"
2007-12-03 12:42:17 +01:00
# include "rpcclient.h"
2009-11-26 18:21:28 +01:00
# include "../librpc/gen_ndr/cli_wkssvc.h"
1998-09-25 21:01:52 +00:00
2007-12-03 12:42:17 +01:00
static WERROR cmd_wkssvc_wkstagetinfo ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
int argc ,
const char * * argv )
1998-09-25 21:01:52 +00:00
{
2007-12-03 12:42:17 +01:00
NTSTATUS status ;
2007-12-03 18:40:09 +01:00
WERROR werr ;
2007-12-03 12:42:17 +01:00
uint32_t level = 100 ;
union wkssvc_NetWkstaInfo info ;
const char * server_name ;
2007-12-06 19:05:54 +01:00
if ( argc > 2 ) {
printf ( " usage: %s <level> \n " , argv [ 0 ] ) ;
return WERR_OK ;
}
if ( argc > 1 ) {
level = atoi ( argv [ 1 ] ) ;
}
2008-04-19 21:56:43 +02:00
server_name = cli - > desthost ;
2007-12-03 12:42:17 +01:00
status = rpccli_wkssvc_NetWkstaGetInfo ( cli , mem_ctx ,
server_name ,
level ,
2007-12-03 18:40:09 +01:00
& info ,
& werr ) ;
2007-12-03 12:42:17 +01:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
1998-09-25 21:01:52 +00:00
}
2007-12-03 18:40:09 +01:00
return werr ;
2007-12-03 12:42:17 +01:00
}
1998-09-25 21:01:52 +00:00
2007-12-03 13:12:26 +01:00
static WERROR cmd_wkssvc_getjoininformation ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
int argc ,
const char * * argv )
{
const char * server_name ;
const char * name_buffer ;
enum wkssvc_NetJoinStatus name_type ;
NTSTATUS status ;
2007-12-03 22:12:31 +01:00
WERROR werr ;
2007-12-03 13:12:26 +01:00
2008-04-19 21:56:43 +02:00
server_name = cli - > desthost ;
2007-12-03 13:12:26 +01:00
name_buffer = " " ;
status = rpccli_wkssvc_NetrGetJoinInformation ( cli , mem_ctx ,
2007-12-03 22:12:31 +01:00
server_name ,
& name_buffer ,
& name_type ,
& werr ) ;
2007-12-03 13:12:26 +01:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2007-12-03 22:12:31 +01:00
if ( W_ERROR_IS_OK ( werr ) ) {
printf ( " %s (%d) \n " , name_buffer , name_type ) ;
}
2007-12-03 13:12:26 +01:00
2007-12-03 22:12:31 +01:00
return werr ;
2007-12-03 13:12:26 +01:00
}
2007-12-06 19:06:30 +01:00
static WERROR cmd_wkssvc_messagebuffersend ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
int argc ,
const char * * argv )
{
2008-04-19 21:56:43 +02:00
const char * server_name = cli - > desthost ;
const char * message_name = cli - > desthost ;
const char * message_sender_name = cli - > desthost ;
2007-12-06 19:06:30 +01:00
smb_ucs2_t * message_buffer = NULL ;
size_t message_size = 0 ;
2007-12-07 11:56:48 +01:00
const char * message = " my message " ;
2007-12-06 19:06:30 +01:00
NTSTATUS status ;
WERROR werr ;
2007-12-07 11:56:48 +01:00
if ( argc > 1 ) {
message = argv [ 1 ] ;
}
2008-04-29 14:36:24 -07:00
if ( ! push_ucs2_talloc ( mem_ctx , & message_buffer , message ,
& message_size ) )
{
2007-12-06 19:06:30 +01:00
return WERR_NOMEM ;
}
status = rpccli_wkssvc_NetrMessageBufferSend ( cli , mem_ctx ,
server_name ,
message_name ,
message_sender_name ,
( uint8_t * ) message_buffer ,
message_size ,
& werr ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
return werr ;
}
2007-12-19 11:08:27 +01:00
static WERROR cmd_wkssvc_enumeratecomputernames ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
int argc ,
const char * * argv )
{
const char * server_name ;
enum wkssvc_ComputerNameType name_type = NetAllComputerNames ;
NTSTATUS status ;
struct wkssvc_ComputerNamesCtr * ctr = NULL ;
WERROR werr ;
2008-04-19 21:56:43 +02:00
server_name = cli - > desthost ;
2007-12-19 11:08:27 +01:00
if ( argc > = 2 ) {
name_type = atoi ( argv [ 1 ] ) ;
}
status = rpccli_wkssvc_NetrEnumerateComputerNames ( cli , mem_ctx ,
server_name ,
name_type , 0 ,
& ctr ,
& werr ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
if ( W_ERROR_IS_OK ( werr ) ) {
int i = 0 ;
for ( i = 0 ; i < ctr - > count ; i + + ) {
printf ( " name: %d %s \n " , i , ctr - > computer_name - > string ) ;
}
}
return werr ;
}
2009-12-06 12:40:44 +01:00
static WERROR cmd_wkssvc_enumerateusers ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
int argc ,
const char * * argv )
{
const char * server_name ;
NTSTATUS status ;
struct wkssvc_NetWkstaEnumUsersInfo info ;
WERROR werr ;
uint32_t i , num_entries , resume_handle ;
server_name = cli - > desthost ;
ZERO_STRUCT ( info ) ;
if ( argc > = 2 ) {
info . level = atoi ( argv [ 1 ] ) ;
}
status = rpccli_wkssvc_NetWkstaEnumUsers ( cli , mem_ctx , server_name ,
& info , 1000 , & num_entries ,
& resume_handle , & werr ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
if ( ! W_ERROR_IS_OK ( werr ) ) {
return werr ;
}
for ( i = 0 ; i < num_entries ; i + + ) {
2010-02-17 15:15:47 +01:00
const char * user = NULL ;
2009-12-06 12:40:44 +01:00
switch ( info . level ) {
case 0 :
user = info . ctr . user0 - > user0 [ i ] . user_name ;
break ;
case 1 :
user = talloc_asprintf (
talloc_tos ( ) , " %s \\ %s " ,
info . ctr . user1 - > user1 [ i ] . logon_domain ,
info . ctr . user1 - > user1 [ i ] . user_name ) ;
break ;
}
2010-02-17 15:15:47 +01:00
printf ( " %s \n " , user ? user : " (null) " ) ;
2009-12-06 12:40:44 +01:00
}
return werr ;
}
2007-12-03 12:42:17 +01:00
struct cmd_set wkssvc_commands [ ] = {
1998-09-25 21:01:52 +00:00
2007-12-03 12:42:17 +01:00
{ " WKSSVC " } ,
2009-11-08 19:38:09 +01:00
{ " wkssvc_wkstagetinfo " , RPC_RTYPE_WERROR , NULL , cmd_wkssvc_wkstagetinfo , & ndr_table_wkssvc . syntax_id , NULL , " Query WKSSVC Workstation Information " , " " } ,
{ " wkssvc_getjoininformation " , RPC_RTYPE_WERROR , NULL , cmd_wkssvc_getjoininformation , & ndr_table_wkssvc . syntax_id , NULL , " Query WKSSVC Join Information " , " " } ,
{ " wkssvc_messagebuffersend " , RPC_RTYPE_WERROR , NULL , cmd_wkssvc_messagebuffersend , & ndr_table_wkssvc . syntax_id , NULL , " Send WKSSVC message " , " " } ,
{ " wkssvc_enumeratecomputernames " , RPC_RTYPE_WERROR , NULL , cmd_wkssvc_enumeratecomputernames , & ndr_table_wkssvc . syntax_id , NULL , " Enumerate WKSSVC computer names " , " " } ,
2009-12-06 12:40:44 +01:00
{ " wkssvc_enumerateusers " , RPC_RTYPE_WERROR , NULL ,
cmd_wkssvc_enumerateusers , & ndr_table_wkssvc . syntax_id , NULL ,
" Enumerate WKSSVC users " , " " } ,
2007-12-03 12:42:17 +01:00
{ NULL }
} ;