From 8daa83a594a2e98f39d764422bfbdbc62c9efd44 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 19:20:00 +0200 Subject: Adding upstream version 2:4.20.0+dfsg. Signed-off-by: Daniel Baumann --- python/examples/dnsserver.py | 87 +++++++++++++++++++++++++++++ python/examples/netbios.py | 28 ++++++++++ python/examples/samr.py | 127 +++++++++++++++++++++++++++++++++++++++++++ python/examples/winreg.py | 94 ++++++++++++++++++++++++++++++++ 4 files changed, 336 insertions(+) create mode 100755 python/examples/dnsserver.py create mode 100644 python/examples/netbios.py create mode 100755 python/examples/samr.py create mode 100755 python/examples/winreg.py (limited to 'python/examples') diff --git a/python/examples/dnsserver.py b/python/examples/dnsserver.py new file mode 100755 index 0000000..caca998 --- /dev/null +++ b/python/examples/dnsserver.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 + +# script to test the dnsserver RPC protocol + +import sys +from optparse import OptionParser + +sys.path.insert(0, "bin/python") + +import samba.getopt as options +from samba.dcerpc import dnsserver, dnsp + + +########### main code ########### +if __name__ == "__main__": + parser = OptionParser("dnsserver [options] server") + sambaopts = options.SambaOptions(parser) + credopts = options.CredentialsOptionsDouble(parser) + parser.add_option_group(credopts) + + (opts, args) = parser.parse_args() + + if len(args) < 3: + print("Usage: dnsserver.py [options] DNSSERVER DNSZONE NEWNAME") + sys.exit(1) + + server = args[0] + dnszone = args[1] + newname = args[2] + + lp = sambaopts.get_loadparm() + creds = credopts.get_credentials(lp) + + if not creds.authentication_requested(): + parser.error("You must supply credentials") + + binding_str = "ncacn_ip_tcp:%s[print,sign]" % server + + dns_conn = dnsserver.dnsserver(binding_str, lp, creds) + + print("querying a NS record") + dns_conn.DnssrvEnumRecords2(0x00070000, + 0, + server, + dnszone, + newname, + None, + dnsp.DNS_TYPE_NS, + 0x0f, + None, + None) + + print("adding a NS glue record") + name = dnsserver.DNS_RPC_NAME() + name.str = newname + + addrec = dnsserver.DNS_RPC_RECORD() + addrec.wType = dnsp.DNS_TYPE_NS + addrec.dwFlags = 0 + addrec.dwSerial = 0 + addrec.dwTtlSeconds = 3600 + addrec.dwTimeStamp = 0 + addrec.dwReserved = 0 + addrec.data = name + + addrecbuf = dnsserver.DNS_RPC_RECORD_BUF() + addrecbuf.rec = addrec + + dns_conn.DnssrvUpdateRecord2(0x00070000, + 0, + server, + dnszone, + newname, + addrecbuf, + None) + + print("querying the NS record") + dns_conn.DnssrvEnumRecords2(0x00070000, + 0, + server, + dnszone, + newname, + None, + dnsp.DNS_TYPE_NS, + 0x0f, + None, + None) diff --git a/python/examples/netbios.py b/python/examples/netbios.py new file mode 100644 index 0000000..740d8e3 --- /dev/null +++ b/python/examples/netbios.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +# Unix SMB/CIFS implementation. +# Copyright (C) Jelmer Vernooij 2008 +# +# 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 +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# 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. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +from samba.netbios import Node + +n = Node() +(reply_from, names, addresses) = n.query_name("GANIEDA", "192.168.4.0", + timeout=4) + +print("Received reply from %s:" % (reply_from, )) +print("Names: %r" % (names, )) +print("Addresses: %r" % (addresses, )) diff --git a/python/examples/samr.py b/python/examples/samr.py new file mode 100755 index 0000000..cbfbb1a --- /dev/null +++ b/python/examples/samr.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Unix SMB/CIFS implementation. +# Copyright © Jelmer Vernooij 2008 +# +# Based on samr.js © Andrew Tridgell +# +# 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 +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# 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. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import sys + +sys.path.insert(0, "bin/python") + +from samba.dcerpc import samr, security + + +def display_lsa_string(str): + return str.string + + +def FillUserInfo(samr, dom_handle, users, level): + """fill a user array with user information from samrQueryUserInfo""" + for i in range(len(users)): + user_handle = samr.OpenUser(handle, security.SEC_FLAG_MAXIMUM_ALLOWED, users[i].idx) + info = samr.QueryUserInfo(user_handle, level) + info.name = users[i].name + info.idx = users[i].idx + users[i] = info + samr.Close(user_handle) + + +def toArray(handle, array, num_entries): + ret = [] + for x in range(num_entries): + ret.append((array.entries[x].idx, array.entries[x].name)) + return ret + + +def test_Connect(samr): + """test the samr_Connect interface""" + print("Testing samr_Connect") + return samr.Connect2(None, security.SEC_FLAG_MAXIMUM_ALLOWED) + + +def test_LookupDomain(samr, handle, domain): + """test the samr_LookupDomain interface""" + print("Testing samr_LookupDomain") + return samr.LookupDomain(handle, domain) + + +def test_OpenDomain(samr, handle, sid): + """test the samr_OpenDomain interface""" + print("Testing samr_OpenDomain") + return samr.OpenDomain(handle, security.SEC_FLAG_MAXIMUM_ALLOWED, sid) + + +def test_EnumDomainUsers(samr, dom_handle): + """test the samr_EnumDomainUsers interface""" + print("Testing samr_EnumDomainUsers") + users = toArray(*samr.EnumDomainUsers(dom_handle, 0, 0, 0xffffffff)) + print("Found %d users" % len(users)) + for idx, user in users: + print("\t%s\t(%d)" % (user.string, idx)) + + +def test_EnumDomainGroups(samr, dom_handle): + """test the samr_EnumDomainGroups interface""" + print("Testing samr_EnumDomainGroups") + groups = toArray(*samr.EnumDomainGroups(dom_handle, 0, 0)) + print("Found %d groups" % len(groups)) + for idx, group in groups: + print("\t%s\t(%d)" % (group.string, idx)) + + +def test_domain_ops(samr, dom_handle): + """test domain specific ops""" + test_EnumDomainUsers(samr, dom_handle) + test_EnumDomainGroups(samr, dom_handle) + + +def test_EnumDomains(samr, handle): + """test the samr_EnumDomains interface""" + print("Testing samr_EnumDomains") + + domains = toArray(*samr.EnumDomains(handle, 0, 0xffffffff)) + print("Found %d domains" % len(domains)) + for idx, domain in domains: + print("\t%s (%d)" % (display_lsa_string(domain), idx)) + for idx, domain in domains: + print("Testing domain %s" % display_lsa_string(domain)) + sid = samr.LookupDomain(handle, domain) + dom_handle = test_OpenDomain(samr, handle, sid) + test_domain_ops(samr, dom_handle) + samr.Close(dom_handle) + + +if len(sys.argv) != 2: + print("Usage: samr.js ") + sys.exit(1) + +binding = sys.argv[1] + +print("Connecting to %s" % binding) +try: + samr = samr.samr(binding) +except Exception as e: + print("Failed to connect to %s: %s" % (binding, e.message)) + sys.exit(1) + +handle = test_Connect(samr) +test_EnumDomains(samr, handle) +samr.Close(handle) + +print("All OK") diff --git a/python/examples/winreg.py b/python/examples/winreg.py new file mode 100755 index 0000000..46c1e02 --- /dev/null +++ b/python/examples/winreg.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 +# +# tool to manipulate a remote registry +# Copyright Andrew Tridgell 2005 +# Copyright Jelmer Vernooij 2007 +# Released under the GNU GPL v3 or later +# + +import sys + +# Find right directory when running from source tree +sys.path.insert(0, "bin/python") + +from samba.dcerpc import winreg,misc +import optparse +import samba.getopt as options + +parser = optparse.OptionParser("%s [path]" % sys.argv[0]) +sambaopts = options.SambaOptions(parser) +parser.add_option_group(sambaopts) +parser.add_option("--createkey", type="string", metavar="KEYNAME", + help="create a key") + +opts, args = parser.parse_args() + +if len(args) < 1: + parser.print_usage() + sys.exit(-1) + +binding = args[0] + +print("Connecting to " + binding) +conn = winreg.winreg(binding, sambaopts.get_loadparm()) + +def list_values(key): + (num_values, max_valnamelen, max_valbufsize) = conn.QueryInfoKey(key, winreg.String())[4:7] + for i in range(num_values): + name = winreg.ValNameBuf() + name.size = max_valnamelen + (name, type, data, _, data_len) = conn.EnumValue(key, i, name, 0, [], max_valbufsize, 0) + print("\ttype=%-30s size=%4d '%s'" % (type, name.size, name)) + if type in (misc.REG_SZ, misc.REG_EXPAND_SZ): + print("\t\t'%s'" % data) + + +def list_path(key, path): + count = 0 + (num_subkeys, max_subkeylen, max_classlen) = conn.QueryInfoKey(key, winreg.String())[1:4] + for i in range(num_subkeys): + name = winreg.StringBuf() + name.size = max_subkeylen+2 # utf16 0-terminator + keyclass = winreg.StringBuf() + keyclass.size = max_classlen+2 # utf16 0-terminator + (name, _, _) = conn.EnumKey(key, i, name, keyclass=keyclass, last_changed_time=None) + name2 = winreg.String() + name2.name = name.name + subkey = conn.OpenKey(key, name2, 0, winreg.KEY_QUERY_VALUE | winreg.KEY_ENUMERATE_SUB_KEYS) + count += list_path(subkey, "%s\\%s" % (path, name)) + list_values(subkey) + return count + + +if len(args) > 1: + root = args[1] +else: + root = "HKLM" + +if opts.createkey: + name = winreg.String() + name.name = "SOFTWARE" + + # Just sample code, "HKLM\SOFTWARE" should already exist + + root = conn.OpenHKLM( + None, winreg.KEY_QUERY_VALUE | winreg.KEY_ENUMERATE_SUB_KEYS) + conn.CreateKey( + root, + name, + keyclass=winreg.String(), + options=0, + access_mask=0, + secdesc=None, + action_taken=0) +else: + print("Listing registry tree '%s'" % root) + try: + root_key = getattr(conn, "Open%s" % root)(None, winreg.KEY_QUERY_VALUE | winreg.KEY_ENUMERATE_SUB_KEYS) + except AttributeError: + print("Unknown root key name %s" % root) + sys.exit(1) + count = list_path(root_key, root) + if count == 0: + print("No entries found") + sys.exit(1) -- cgit v1.2.3