1 package org.sentrysoftware.winrm;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import java.util.Arrays;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.regex.Pattern;
27 import java.util.stream.Collectors;
28
29
30 import org.sentrysoftware.winrm.exceptions.WqlQuerySyntaxException;
31
32 public abstract class WmiHelper {
33
34
35
36
37
38 private WmiHelper() {}
39
40 public static final String DEFAULT_NAMESPACE = "ROOT\\CIMV2";
41
42
43
44
45 private static final Pattern WQL_SIMPLE_SELECT_PATTERN = Pattern.compile(
46 "^\\s*SELECT\\s+(\\*|(?!SELECT|FROM|WHERE)[a-z0-9._]+|((?!SELECT|FROM|WHERE)[a-z0-9._]+\\s*,\\s*)+((?!SELECT|FROM|WHERE)[a-z0-9._]+))\\s+FROM\\s+((?!WHERE|FROM)\\w+)\\s*(WHERE\\s+.*)?$",
47 Pattern.CASE_INSENSITIVE
48 );
49
50
51
52
53
54
55
56
57
58 public static boolean isValidWql(final String wqlQuery) {
59 return WQL_SIMPLE_SELECT_PATTERN.matcher(wqlQuery).find();
60 }
61
62
63
64
65
66
67
68
69 public static String createNetworkResource(
70 final String hostname,
71 final String namespace) {
72 Utils.checkNonNull(namespace, "namespace");
73 return hostname == null || hostname.isEmpty() ?
74 namespace :
75 String.format("\\\\%s\\%s", hostname, namespace);
76 }
77
78
79
80
81
82 public static boolean isLocalNetworkResource(final String networkResource) {
83 Utils.checkNonNull(networkResource, "networkResource");
84 return !networkResource.startsWith("\\\\") ||
85 networkResource.startsWith("\\\\localhost\\") ||
86 networkResource.startsWith("\\\\127.0.0.1\\") ||
87 networkResource.startsWith("\\\\0:0:0:0:0:0:0:1\\") ||
88 networkResource.startsWith("\\\\::1\\") ||
89 networkResource.startsWith("\\\\0000:0000:0000:0000:0000:0000:0000:0001\\") ||
90 networkResource.toLowerCase().startsWith("\\\\" + Utils.getComputerName().toLowerCase() + "\\");
91 }
92
93
94
95
96
97
98
99
100
101
102
103
104 public static List<String> extractPropertiesFromResult(final List<Map<String, Object>> resultRows, final String wql) {
105
106 try {
107 return extractPropertiesFromResult(resultRows, WqlQuery.newInstance(wql));
108 } catch (WqlQuerySyntaxException e) {
109 throw new IllegalStateException(e);
110 }
111
112 }
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127 public static List<String> extractPropertiesFromResult(final List<Map<String, Object>> resultRows, final WqlQuery wqlQuery) {
128
129
130
131
132 if (resultRows.isEmpty()) {
133 return wqlQuery.getSelectedProperties();
134 }
135
136
137 final String[] resultPropertyArray = resultRows.get(0).keySet().toArray(new String[0]);
138
139
140
141 if (wqlQuery.getSelectedProperties().isEmpty()) {
142 Arrays.sort(resultPropertyArray, String.CASE_INSENSITIVE_ORDER);
143 return Arrays.asList(resultPropertyArray);
144 }
145
146
147
148 final List<String> queryProperties = wqlQuery.getSelectedProperties();
149 final Map<String, String> resultProperties = Arrays.asList(resultPropertyArray).stream()
150 .collect(Collectors.toMap(String::toLowerCase, property -> property));
151 return queryProperties.stream()
152 .map(property -> resultProperties.getOrDefault(property.toLowerCase(), property))
153 .collect(Collectors.toList());
154
155 }
156
157 }