2007-12-03 14:42:17 +03:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
2007-12-03 14:42:17 +03:00
RPC pipe client
Copyright ( C ) Günther Deschner 2007
1998-09-26 01:01:52 +04: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 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
1998-09-26 01:01:52 +04:00
( at your option ) any later version .
2007-12-03 14:42:17 +03:00
1998-09-26 01:01:52 +04: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 14:42:17 +03:00
1998-09-26 01:01:52 +04:00
You should have received a copy of the GNU General Public License
2007-07-10 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
1998-09-26 01:01:52 +04:00
*/
# include "includes.h"
2007-12-03 14:42:17 +03:00
# include "rpcclient.h"
1998-09-26 01:01:52 +04:00
2007-12-03 14:42:17 +03:00
static WERROR cmd_wkssvc_wkstagetinfo ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
int argc ,
const char * * argv )
1998-09-26 01:01:52 +04:00
{
2007-12-03 14:42:17 +03:00
NTSTATUS status ;
2007-12-03 20:40:09 +03:00
WERROR werr ;
2007-12-03 14:42:17 +03:00
uint32_t level = 100 ;
union wkssvc_NetWkstaInfo info ;
const char * server_name ;
2007-12-06 21:05:54 +03:00
if ( argc > 2 ) {
printf ( " usage: %s <level> \n " , argv [ 0 ] ) ;
return WERR_OK ;
}
if ( argc > 1 ) {
level = atoi ( argv [ 1 ] ) ;
}
2008-04-19 23:56:43 +04:00
server_name = cli - > desthost ;
2007-12-03 14:42:17 +03:00
status = rpccli_wkssvc_NetWkstaGetInfo ( cli , mem_ctx ,
server_name ,
level ,
2007-12-03 20:40:09 +03:00
& info ,
& werr ) ;
2007-12-03 14:42:17 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
1998-09-26 01:01:52 +04:00
}
2007-12-03 20:40:09 +03:00
return werr ;
2007-12-03 14:42:17 +03:00
}
1998-09-26 01:01:52 +04:00
2007-12-03 15:12:26 +03: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-04 00:12:31 +03:00
WERROR werr ;
2007-12-03 15:12:26 +03:00
2008-04-19 23:56:43 +04:00
server_name = cli - > desthost ;
2007-12-03 15:12:26 +03:00
name_buffer = " " ;
status = rpccli_wkssvc_NetrGetJoinInformation ( cli , mem_ctx ,
2007-12-04 00:12:31 +03:00
server_name ,
& name_buffer ,
& name_type ,
& werr ) ;
2007-12-03 15:12:26 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2007-12-04 00:12:31 +03:00
if ( W_ERROR_IS_OK ( werr ) ) {
printf ( " %s (%d) \n " , name_buffer , name_type ) ;
}
2007-12-03 15:12:26 +03:00
2007-12-04 00:12:31 +03:00
return werr ;
2007-12-03 15:12:26 +03:00
}
2007-12-06 21:06:30 +03:00
static WERROR cmd_wkssvc_messagebuffersend ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
int argc ,
const char * * argv )
{
2008-04-19 23:56:43 +04:00
const char * server_name = cli - > desthost ;
const char * message_name = cli - > desthost ;
const char * message_sender_name = cli - > desthost ;
2007-12-06 21:06:30 +03:00
smb_ucs2_t * message_buffer = NULL ;
size_t message_size = 0 ;
2007-12-07 13:56:48 +03:00
const char * message = " my message " ;
2007-12-06 21:06:30 +03:00
NTSTATUS status ;
WERROR werr ;
2007-12-07 13:56:48 +03:00
if ( argc > 1 ) {
message = argv [ 1 ] ;
}
2008-04-30 01:36:24 +04:00
if ( ! push_ucs2_talloc ( mem_ctx , & message_buffer , message ,
& message_size ) )
{
2007-12-06 21:06:30 +03: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 13:08:27 +03: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 23:56:43 +04:00
server_name = cli - > desthost ;
2007-12-19 13:08:27 +03: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 ;
}
2007-12-03 14:42:17 +03:00
struct cmd_set wkssvc_commands [ ] = {
1998-09-26 01:01:52 +04:00
2007-12-03 14:42:17 +03:00
{ " WKSSVC " } ,
2008-07-20 20:17:52 +04: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 " , " " } ,
2007-12-03 14:42:17 +03:00
{ NULL }
} ;