From 169627d7f55f9f58a6564a9efe659a529bbf348a Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Thu, 23 Sep 2004 02:21:11 +0000 Subject: r2555: Start of a rpcclient type program. (This used to be commit c9d682731226b7ef222f588c43df5a1f62c21555) --- source4/scripting/swig/rpcclient | 154 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100755 source4/scripting/swig/rpcclient (limited to 'source4/scripting/swig/rpcclient') diff --git a/source4/scripting/swig/rpcclient b/source4/scripting/swig/rpcclient new file mode 100755 index 0000000000..2a3d12cc8e --- /dev/null +++ b/source4/scripting/swig/rpcclient @@ -0,0 +1,154 @@ +#!/usr/bin/python + +import sys, os, string +from cmd import Cmd +from optparse import OptionParser + + +import dcerpc, samr + +class rpcclient(Cmd): + + prompt = 'rpcclient$ ' + + def __init__(self, binding, domain, username, password): + Cmd.__init__(self) + self.binding = binding + self.domain = domain + self.username = username + self.password = password + + def emptyline(self): + + # Default for empty line is to repeat last command - yuck + + pass + + def onecmd(self, line): + + # Override the onecmd() method so we can trap error returns + + try: + Cmd.onecmd(self, line) + except dcerpc.NTSTATUS, arg: + print 'The command returned an error: %s' % arg[1] + + # Command handlers + + def do_help(self, line): + """Displays on-line help for rpcclient commands.""" + Cmd.do_help(self, line) + + def do_shell(self, line): + + status = os.system(line) + + if os.WIFEXITED(status): + if os.WEXITSTATUS(status) != 0: + print 'Command exited with code %d' % os.WEXITSTATUS(status) + else: + print 'Command exited with signal %d' % os.WTERMSIG(status) + + def do_EOF(self, line): + """Exits rpcclient.""" + print + sys.exit(0) + + # SAMR pipe commands + + def do_SamrEnumDomains(self, line): + """Enumerate domain names.""" + + usage = 'usage: SamrEnumDomains' + + if line != '': + print usage + return + + pipe = dcerpc.pipe_connect( + self.binding, + dcerpc.DCERPC_SAMR_UUID, dcerpc.DCERPC_SAMR_VERSION, + self.domain, self.username, self.password) + + connect_handle = samr.Connect(pipe) + + for i in connect_handle.EnumDomains(): + print i + + def do_SamrLookupDomain(self, line): + """Return the SID for a domain.""" + + usage = 'SamrLookupDomain DOMAIN' + + parser = OptionParser(usage) + options, args = parser.parse_args(string.split(line)) + + if len(args) != 1: + print 'usage:', usage + return + + pipe = dcerpc.pipe_connect( + self.binding, + dcerpc.DCERPC_SAMR_UUID, dcerpc.DCERPC_SAMR_VERSION, + self.domain, self.username, self.password) + + connect_handle = samr.Connect(pipe) + + print connect_handle.LookupDomain(args[0]) + +if __name__ == '__main__': + + # Parse command line + + usage = 'rpcclient BINDING [options]' + + if len(sys.argv) == 1: + print usage + sys.exit(1) + + binding = sys.argv[1] + del(sys.argv[1]) + + if string.find(binding, ':') == -1: + binding = 'ncacn_np:' + binding + + parser = OptionParser(usage) + + parser.add_option('-U', '--username', action='store', type='string', + help='Use given credentials when connecting', + metavar='DOMAIN\\username%password', + dest='username') + + parser.add_option('-c', '--command', action='store', type='string', + help='Execute COMMAND', dest='command') + + options, args = parser.parse_args() + + # Break --username up into domain, usernamd and password + + if not options.username: + options.username = '%' + + domain = '' + if string.find(options.username, '\\') != -1: + domain, options.username = string.split(options.username, '\\') + + password = '' + if string.find(options.username, '%') != -1: + options.username, password = string.split(options.username, '%') + + username = options.username + + # Run command loop + + c = rpcclient(binding, domain, username, password) + + if options.command: + c.onecmd(options.command) + sys.exit(0) + + while 1: + try: + c.cmdloop() + except KeyboardInterrupt: + print 'KeyboardInterrupt' -- cgit