3 # tool to manipulate a remote registry
4 # Copyright Andrew Tridgell 2005
5 # Copyright Jelmer Vernooij 2007
6 # Released under the GNU GPL v3 or later
11 # Find right directory when running from source tree
12 sys
.path
.insert(0, "bin/python")
14 from samba
.dcerpc
import winreg
16 import samba
.getopt
as options
18 parser
= optparse
.OptionParser("%s <BINDING> [path]" % sys
.argv
[0])
19 sambaopts
= options
.SambaOptions(parser
)
20 parser
.add_option_group(sambaopts
)
21 parser
.add_option("--createkey", type="string", metavar
="KEYNAME",
24 opts
, args
= parser
.parse_args()
32 print "Connecting to " + binding
33 conn
= winreg
.winreg(binding
, sambaopts
.get_loadparm())
36 (num_values
, max_valnamelen
, max_valbufsize
) = conn
.QueryInfoKey(key
, winreg
.String())[4:8]
37 for i
in range(num_values
):
38 name
= winreg
.StringBuf()
39 name
.size
= max_valnamelen
40 (name
, type, data
, _
, data_len
) = conn
.EnumValue(key
, i
, name
, 0, "", max_valbufsize
, 0)
41 print "\ttype=%-30s size=%4d '%s'" % type, len, name
42 if type in (winreg
.REG_SZ
, winreg
.REG_EXPAND_SZ
):
43 print "\t\t'%s'" % data
44 # if (v.type == reg.REG_MULTI_SZ) {
45 # for (j in v.value) {
46 # printf("\t\t'%s'\n", v.value[j])
49 # if (v.type == reg.REG_DWORD || v.type == reg.REG_DWORD_BIG_ENDIAN) {
50 # printf("\t\t0x%08x (%d)\n", v.value, v.value)
52 # if (v.type == reg.REG_QWORD) {
53 # printf("\t\t0x%llx (%lld)\n", v.value, v.value)
56 def list_path(key
, path
):
58 (num_subkeys
, max_subkeylen
, max_subkeysize
) = conn
.QueryInfoKey(key
, winreg
.String())[1:4]
59 for i
in range(num_subkeys
):
60 name
= winreg
.StringBuf()
61 name
.size
= max_subkeysize
62 keyclass
= winreg
.StringBuf()
63 keyclass
.size
= max_subkeysize
64 (name
, _
, _
) = conn
.EnumKey(key
, i
, name
, keyclass
=keyclass
, last_changed_time
=None)[0]
65 subkey
= conn
.OpenKey(key
, name
, 0, winreg
.KEY_QUERY_VALUE | winreg
.KEY_ENUMERATE_SUB_KEYS
)
66 count
+= list_path(subkey
, "%s\\%s" % (path
, name
))
76 reg
.create_key("HKLM\\SOFTWARE", opt
.createkey
)
78 print "Listing registry tree '%s'" % root
80 root_key
= getattr(conn
, "Open%s" % root
)(None, winreg
.KEY_QUERY_VALUE | winreg
.KEY_ENUMERATE_SUB_KEYS
)
81 except AttributeError:
82 print "Unknown root key name %s" % root
84 count
= list_path(root_key
, root
)
86 print "No entries found"