| 1 | #!/usr/bin/python | 
|---|
| 2 | # | 
|---|
| 3 | # Utilities for determining the Windows operating system version remotely. | 
|---|
| 4 | # | 
|---|
| 5 |  | 
|---|
| 6 | from samba import srvsvc | 
|---|
| 7 |  | 
|---|
| 8 | # Constants | 
|---|
| 9 |  | 
|---|
| 10 | PLATFORM_UNKNOWN = 0 | 
|---|
| 11 | PLATFORM_WIN9X = 1 | 
|---|
| 12 | PLATFORM_NT4 = 2 | 
|---|
| 13 | PLATFORM_NT5 = 3                        # Windows 2000 | 
|---|
| 14 |  | 
|---|
| 15 | def platform_name(platform_type): | 
|---|
| 16 |  | 
|---|
| 17 | platform_names = { PLATFORM_UNKNOWN: "Unknown", | 
|---|
| 18 | PLATFORM_WIN9X: "Windows 9x", | 
|---|
| 19 | PLATFORM_NT4: "Windows NT", | 
|---|
| 20 | PLATFORM_NT5: "Windows 2000" } | 
|---|
| 21 |  | 
|---|
| 22 | if platform_names.has_key(platform_type): | 
|---|
| 23 | return platform_names[platform_type] | 
|---|
| 24 |  | 
|---|
| 25 | return "Unknown" | 
|---|
| 26 |  | 
|---|
| 27 | def platform_type(info101): | 
|---|
| 28 | """Determine the operating system type from a SRV_INFO_101.""" | 
|---|
| 29 |  | 
|---|
| 30 | if info101['major_version'] == 4 and info101['minor_version'] == 0: | 
|---|
| 31 | return PLATFORM_NT4 | 
|---|
| 32 |  | 
|---|
| 33 | if info101['major_version'] == 5 and info101['minor_version'] == 0: | 
|---|
| 34 | return PLATFORM_NT5 | 
|---|
| 35 |  | 
|---|
| 36 | return PLATFORM_UNKNOWN | 
|---|
| 37 |  | 
|---|
| 38 | def is_domain_controller(info101): | 
|---|
| 39 | """Return true if the server_type field from a  SRV_INFO_101 | 
|---|
| 40 | indicates a domain controller.""" | 
|---|
| 41 | return info101['server_type'] & srvsvc.SV_TYPE_DOMAIN_CTRL | 
|---|
| 42 |  | 
|---|
| 43 | def os_version(name): | 
|---|
| 44 | info = srvsvc.netservergetinfo("\\\\%s" % name, 101) | 
|---|
| 45 | return platform_type(info) | 
|---|
| 46 |  | 
|---|
| 47 | if __name__ == "__main__": | 
|---|
| 48 | import sys | 
|---|
| 49 | if len(sys.argv) != 2: | 
|---|
| 50 | print "Usage: osver.py server" | 
|---|
| 51 | sys.exit(0) | 
|---|
| 52 | info = srvsvc.netservergetinfo("\\\\%s" % sys.argv[1], 101) | 
|---|
| 53 | print "platform type = %d" % platform_type(info) | 
|---|
| 54 | if is_domain_controller(info): | 
|---|
| 55 | print "%s is a domain controller" % sys.argv[1] | 
|---|