1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
use std::string::String;
use winreg::RegKey;
use winreg::types::FromRegValue;
use winreg::enums::KEY_READ;
use winapi::shared::minwindef::HKEY;
use winreg::enums::HKEY_LOCAL_MACHINE;
use crate::error::*;
fn get_value<T: FromRegValue>(predef: HKEY,
subkey: &str,
value_name: &str,
default: T)
-> ::std::io::Result<T> {
let key = RegKey::predef(predef);
let value: T = match key.open_subkey_with_flags(subkey, KEY_READ) {
Ok(key) => {
match key.get_value(value_name) {
Ok(value) => value,
Err(err) => {
match err.kind() {
::std::io::ErrorKind::NotFound => default,
_ => return Err(err),
}
}
}
}
Err(err) => {
match err.kind() {
::std::io::ErrorKind::NotFound => default,
_ => return Err(err),
}
}
};
Ok(value)
}
const TCPIP_PARAMETERS_KEY_PATH: &str = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters";
pub fn get_search_list() -> Result<Vec<String>> {
let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
let params_key = hklm.open_subkey_with_flags(TCPIP_PARAMETERS_KEY_PATH,
KEY_READ)?;
let search_list: ::std::io::Result<String> = params_key.get_value("SearchList");
if let Ok(search_list) = search_list {
let search_list: Vec<String> = search_list.split(',').map(std::string::ToString::to_string).collect();
Ok(search_list)
} else {
Ok(vec![])
}
}
pub fn get_domain() -> Result<Option<String>> {
let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
let params_key = hklm.open_subkey_with_flags(TCPIP_PARAMETERS_KEY_PATH,
KEY_READ)?;
let domain: String = params_key.get_value("Domain")?;
let domain = if domain.is_empty() {
None
} else {
Some(domain)
};
Ok(domain)
}
pub fn is_round_robin_enabled() -> Result<bool> {
let rotate: u32 = get_value(HKEY_LOCAL_MACHINE,
"SYSTEM\\CurrentControlSet\\Services\\DNS\\Parameters",
"RoundRobin",
1)?;
Ok(rotate != 0)
}