-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcomp_inventory.wsf
323 lines (290 loc) · 14.6 KB
/
comp_inventory.wsf
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
<job id="Comp_inventory">
<script language="VBScript" src="../libs/lib_core.vbs" ></script>
<script language="VBScript" src="../libs/lib_http.vbs" ></script>
<script language="VBScript" src="../libs/lib_inventory.vbs" ></script>
<script language="VBScript" src="../libs/lib_displayinfo.vbs" ></script>
<script language="VBScript" src="../config.priv.vbs" ></script>
<script language="javascript" runat="server" src="../libs/lib_url.js" ></script>
<script language="VBScript">
option explicit
DEBUGMODE = 0
'Скрипт сбора данных о конфигурации компа
'v0.16 * работа с новым API с обязательной авторизайие, слепым PUSH данных, без чтения вообще с минимальным набором прав
'v0.15 * включен option explicit, все функции работы с инвентори вынесены в библиотеку (так также option explicit)
'v0.14 + Теперь собирается и MAC (Требуется поддержка со стороны БД)
'v0.13 + Теперь ИД компьютера сохраняется в реестре
' * Теперь скрипт требует права админа
'v0.12 * Имя компютера теперь берется полное (а не NETBIOS)
'v0.11 * функцонинал XML парсинга и HTTP REST вынесен в lib_http, URL.encdode/decode -> lib_url
'v0.10rc2 ! Все обращения к WMI теперь идут с отключением выброса ошибок и рассчитаны на возможность сбоя запроса
'v0.10rc + Сохранение IP адреса(ов)
'v0.9.1 ! ПО считалось системной компонентой только по наличию параметра SystemComponent, независимо от значения
'v0.9 * Домен теперь не обязательное поле, что позволит отработать скрипту на недоменных машинах
'v0.8 ! Исправлено кодирование в формат JSON
'v0.7 * Операционная система теперь входит в список ПО,
'v0.6 ! значение объема видеокарты теперь текстовое,
'v0.5 ! исправлена ошибка с преобразованием пустого значения объема видеокарты в 0 на Windows XP,
' которая приводила к вылетанию скрипта.
'v0.4 * софт ищется еще из ветки WOW6432node
' софт с пометкой "системная компонента" не выводится в отчет
' если у софта есть метка "родительский продукт" то он в отчет выводится
' как родительский продукт, чтобы нам в БД не заталкивать все субкомпоненты вручную
'v0.3 + отправка данных скорректирована для соответствия JSON формату
'v0.2 * отправка новых и обновление уже имеющихся данных через API POST/PUT
' в принципе уже рабочий скрипт и может наполнять БД
'v0.1 + добавлена отправка данных в БД!
'v0.02 + сбор данных о железе: мать, проц, планки оперативки, диски, видео
'v0.01 * initial: сбор данных о софте из wmi product get name и веток реестра Uninstall
' т.к. wmi отдает инфу только по продуктам установленным через MSI
' отправки данных пока нет. только сбор
forceCscript
const scrName="gp_compInventory" : const scrVer="0.16"
dim logFile : logFile = WorkDir & scrName & ".log"
Msg "-" : Msg "Script started: "&scrName&" "&scrVer&" (core "&coreLibVer&")"
dim objWMIService
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
dim colItems,objItem
'privelegeMe()
'checkFullAdminRights()
'поиск установленного софта в папке UNINSTALL в реестре - перебираем подпапки и ищем в них ProductName
function ListSoft(byVal HIVE, byVal path)
dim arrSubKeys, subkey, Publisher, ProductName, ParentProduct, SystemFlag
Msg "Searching soft in " & path & "..."
'сначала перебираем подпапки
objReg.EnumKey HIVE, path, arrSubKeys
If Not IsNull(arrSubKeys) Then
For Each subkey In arrSubKeys
Publisher=""
ProductName=""
ParentProduct=""
SystemFlag = ""
'on error resume next
objReg.GetStringValue HIVE, path & "\" & subkey, "Publisher", Publisher
objReg.GetStringValue HIVE, path & "\" & subkey, "DisplayName", ProductName
objReg.GetStringValue HIVE, path & "\" & subkey, "ParentDisplayName", ParentProduct
objReg.GetDWORDValue HIVE, path & "\" & subkey, "SystemComponent", SystemFlag
'on error goto 0
if (SystemFlag = "1") then 'пропускаем системные компоненты
Msg "System component found: "& subkey & " " & Publisher & " " & ProductName
else
'если у нас есть родительский продукт, то мы его и впишем, на не интересно мелочиться разглядывая компоненты
if (not ParentProduct = "") then ProductName = ParentProduct
if (not ProductName = "") then
Msg "Soft found: "& subkey & " " & Publisher & " " & ProductName
if (Len(productList)>0) then productList=productList & ","
productList=productList & "{""publisher"":""" & URL.addslashes(Publisher) &""", ""name"":""" & URL.addslashes(ProductName) & """}" '& vbCrLf
end if
end if
Next
End If
end function
'Ищем UNINSTALL софт в папках пользователей. Там могут быть всякие амиго и т.п.
function ListUsersSoft(byVal HIVE)
dim arrSubKeys,subkey
Msg "Searching USERS soft ..."
'сначала перебираем подпапки
objReg.EnumKey HIVE, "", arrSubKeys
If Not IsNull(arrSubKeys) Then
For Each subkey In arrSubKeys
'on error resume next
msg Subkey
ListSoft HIVE, subkey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
Next
End If
end function
' получить IP-адрес
function getIPv4addrs()
dim Text
Text = ""
on error resume next
dim IPConfigSet: Set IPConfigSet = objWMIService.ExecQuery("Select IPAddress from Win32_NetworkAdapterConfiguration where ipenabled = true")
dim IPConfig,i
for each IPConfig in IPConfigSet
if Not IsNull(IPConfig.IPAddress) then
for i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
If InStr(IPConfig.IPAddress(i),":") = 0 Then Text = Text & IPConfig.IPAddress(i)& VbCrLf
next
end if
next
on error goto 0
getIPv4addrs=Text
end function
' получить MAC-адрес
function getMACaddrs()
dim Text
Text = ""
on error resume next
dim IPConfigSet: Set IPConfigSet = objWMIService.ExecQuery("Select MACAddress from Win32_NetworkAdapterConfiguration where ipenabled = true")
dim IPConfig,i
for each IPConfig in IPConfigSet
if Not IsNull(IPConfig.MACAddress) then
Text = Text & IPConfig.MACAddress(i)& VbCrLf
end if
next
on error goto 0
getMACaddrs=Text
end function
'заполняем отпечаток софта
dim productList : productList=""
ListSoft HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
ListSoft HKEY_LOCAL_MACHINE, "SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
ListUsersSoft HKEY_USERS
msg "Searching hw..."
on error resume next
'заполняем отпечаток железа
dim hwList: hwList=""
msg "Searching MB..."
Set colItems = objWMIService.ExecQuery( "Select * from Win32_BaseBoard", , 48 )
For Each objItem in colItems
comma=""
if (Len(hwList)>0) then comma= ","
hwList = hwList & comma & "{""motherboard"":{"_
& """manufacturer"":""" & TrimWithTabs( URL.addslashes(objItem.Manufacturer )) & """, " _
& """product"":""" &TrimWithTabs( URL.addslashes(objItem.Product )) & """, " _
& """serial"":""" &TrimWithTabs( URL.addslashes(objItem.SerialNumber )) & """" _
& "}}"
'hard(UBound(hard))="{""publisher"":""" & Publisher &""", ""name"":""" & ProductName & """}"
Next
msg "Searching CPU..."
Set colItems = objWMIService.ExecQuery( "Select * from Win32_Processor", , 48 )
For Each objItem in colItems
dim comma : comma=""
if (Len(hwList)>0) then comma= ","
hwList = hwList & comma & "{""processor"":{" _
& """model"":""" & TrimWithTabs( URL.addslashes(objItem.Name)) & """, " _
& """cores"":"""&objItem.numberOfCores&"""" _
& "}}"
Next
msg "Searching MEM Banks..."
Set colItems = objWMIService.ExecQuery("Select * from Win32_PhysicalMemory")
For Each objItem in colItems
comma=""
if (Len(hwList)>0) then comma= ","
hwList = hwList & comma & "{""memorybank"":{"_
& """manufacturer"":""" & URL.addslashes(objItem.Manufacturer) & """, "_
& """capacity"":""" & round(objItem.Capacity / 1048576) & """" _
& "}}"
Next
msg "Searching Drives..."
Set colItems = objWMIService.ExecQuery( "Select * from Win32_DiskDrive", , 48 )
For Each objItem in colItems
dim driveSize : driveSize=objItem.Size
if (isnull(driveSize)) then driveSize=0
comma=""
if (Len(hwList)>0) then comma= ","
hwList = hwList & comma & "{""harddisk"":{" _
& """model"":""" & URL.addslashes(objItem.Model) & """," _
& """size"":""" & Int(round(CDbl(driveSize) /1000/1000/1000)) & """" _
& "}}"
Next
msg "Searching GPU..."
' Query video adapter properties
Set colItems = objWMIService.ExecQuery( "Select * from Win32_VideoController", , 48 )
For Each objItem in colItems
comma=""
if (Len(hwList)>0) then comma= ","
hwList = hwList & comma & "{""videocard"":{" _
& """name"":""" & URL.addslashes(objItem.Name) & """," _
& """ram"":""" & Int( ( abs(objItem.AdapterRAM )) / 1024 /1024 ) & """" _
& "}}"
Next
msg "Searching Display ..."
dim monList : monList=GetMonitorInfo
if (Len(monList)>0 ) then
if (Len(hwList)>0) then hwList=hwList & ","
hwList=hwList & monList
end if
on error goto 0
msg "Searching OS Version ..."
dim strOS
Set colItems = objWMIService.ExecQuery( "Select * from Win32_OperatingSystem", , 48 )
For Each objItem in colItems
strOS = objItem.Version&" "&objItem.Caption
if (Len(productList)>0) then productList=productList & ","
productList=productList & "{""publisher"":""Microsoft"", ""name"":""" & URL.addslashes(objItem.Caption) & """}" '& vbCrLf
Next
msg "Searching IPs ..."
dim IPv4addrs : IPv4addrs=getIPv4addrs()
dim MACaddrs : MACaddrs=getMACAddrs()
dim domainID, compID
msg "Searching Domain name..."
dim strComputerDomain
on error resume next
Set colItems = objWMIService.ExecQuery( "Select * from Win32_ComputerSystem" , , 48 )
For Each objItem in colItems
strComputerDomain = objItem.Domain
Next
on error goto 0
dim id : id = invPushComp(ComputerName & "." & strComputerDomain, strOS, hwList, productList, IPv4addrs, MACaddrs)
if (id > -1) then
regWrite inventoryCompIDRegStorage, "REG_SZ", id
end if
</script>
<signature>
** SIG ** MIIIXwYJKoZIhvcNAQcCoIIIUDCCCEwCAQExDzANBglg
** SIG ** hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor
** SIG ** BgEEAYI3AgEeMCQCAQEEEHAFYRrOONQRoqMAEEvTUJAC
** SIG ** AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg
** SIG ** z+Bl4RMeNC8scntK6bP1GH8Em8nEowtqTNOikjPxIvyg
** SIG ** ggWcMIIFmDCCA4CgAwIBAgIBAzANBgkqhkiG9w0BAQsF
** SIG ** ADBtMQswCQYDVQQGEwJSVTENMAsGA1UECAwEVXJhbDEU
** SIG ** MBIGA1UEBwwLQ2hlbHlhYmluc2sxETAPBgNVBAoMCFJl
** SIG ** dmlha2luMQswCQYDVQQLDAJJVDEZMBcGA1UEAwwQcmV2
** SIG ** aWFraW4tcm9vdC1DQTAeFw0yMzA1MjUxNTM3MDBaFw0y
** SIG ** NDA2MDMxNTM3MDBaMGMxCzAJBgNVBAYTAlJVMQ0wCwYD
** SIG ** VQQIDARVcmFsMQ0wCwYDVQQHDARDaGVsMREwDwYDVQQK
** SIG ** DAhSZXZpYWtpbjELMAkGA1UECwwCSVQxFjAUBgNVBAMM
** SIG ** DXJldmlha2luLWNvZGUwggEiMA0GCSqGSIb3DQEBAQUA
** SIG ** A4IBDwAwggEKAoIBAQCtsuYd7CVRsLwbN6ybLrnCr72O
** SIG ** nqGhfdASM37B9yC8+b5nnbw6EqDEN2IHpy32wOoThAlg
** SIG ** zPna/D5/VX/TYuLR/1vjW+vRQPKbJi8m97BMr8PemMWl
** SIG ** w6mjl9x4qW0x4irIwXra/Z4R34BgrY8ZACZRah0riiWY
** SIG ** GXPvCw3ZjNYMXRJF4rVKJ6c/PNg1bNlML1Q8oHcy3MPC
** SIG ** CVCHF/Qf3Bl/l76GKJhylViC5/ZiX34LfzCopdK1xnnY
** SIG ** 45cP1c83pQH2IE3ucjGMwzWDYCwTNAeYi69aaK40fGHC
** SIG ** Z9EJg6sS1RnEyCpp+Sj23T/GOJyTxM4kaiPmlMDZoCAq
** SIG ** UndLk6HVAgMBAAGjggFLMIIBRzAJBgNVHRMEAjAAMBEG
** SIG ** CWCGSAGG+EIBAQQEAwIFoDAzBglghkgBhvhCAQ0EJhYk
** SIG ** T3BlblNTTCBHZW5lcmF0ZWQgQ2xpZW50IENlcnRpZmlj
** SIG ** YXRlMB0GA1UdDgQWBBSXtltT7BkMs4W7USOsFdk+mc0S
** SIG ** HjAfBgNVHSMEGDAWgBSNQkTnQD4Z5d3UogsBh0kUyrwl
** SIG ** pzAOBgNVHQ8BAf8EBAMCBeAwJwYDVR0lBCAwHgYIKwYB
** SIG ** BQUHAwIGCCsGAQUFBwMEBggrBgEFBQcDAzA4BgNVHR8E
** SIG ** MTAvMC2gK6AphidodHRwOi8vcGtpLnJldmlha2luLm5l
** SIG ** dC9jcmwvcm9vdC1jYS5jcmwwPwYIKwYBBQUHAQEEMzAx
** SIG ** MC8GCCsGAQUFBzAChiNodHRwOi8vcGtpLnJldmlha2lu
** SIG ** L25ldC9yb290LWNhLmNydDANBgkqhkiG9w0BAQsFAAOC
** SIG ** AgEAix6Hc2aULCO6RiT4W5PIiB9zQgA4BGT3W5YdSttn
** SIG ** gGhnmWDEfT2bhB/ZnRLkrtZeL/sYDj94FIfKZMvFTsNN
** SIG ** CUeDNiV9hQyJrsrI9Gq3nkgcnCOGc/9mqqL7ItS33s1M
** SIG ** ltSXVA7sLhoQ65yPrP70kd3681COUsCYOq7hroIR3Th4
** SIG ** L8INGLvUR+Xll1sunIHrnuiTD/GZFNemDec0f3n8mNKp
** SIG ** 5KiWuYlNYv0Zg//rTvCZfk2Y74Mk/2lCeABVKcQoJai+
** SIG ** XiSN0mq1b6RlFmfbiuzU3iudZ3SKHKEd3reGBXZxD7b1
** SIG ** QubveA17QKbgzwjT6DX9ISFjbIOuB9HUo3Bl7VLZ4DyH
** SIG ** 2mt0z+UC1zpE9DLFzoawf4f5/KN6mixGX9Q7tSQQCOKo
** SIG ** Jiyk7Y+0aLXhK7RmJdDK3vIieJkXSx0ip1SXdRYgr0sQ
** SIG ** VsNq2D2SYJ0A1r2wWJ4sNuiHnDuxWuxLsAdC0rZTlKis
** SIG ** 21i4uOIr3BCj2MFdTTdkeX5xB979r/8MLBdrDlzoVxMz
** SIG ** tEWwXdNlqiCQosIMVq44bJF1zjFPD6pYk0JgEF9y8wTd
** SIG ** G2LyGFjTqJYyCrKrWFkQa8GX6pazj4EarEpNjdVC6IXJ
** SIG ** YRa4vRqUEWfS9WeTGlIR9hJyqtHKAc9N82lwrhTlPhh+
** SIG ** lkL15ZPRXnnd5aICNgQpndNfyBIxggIbMIICFwIBATBy
** SIG ** MG0xCzAJBgNVBAYTAlJVMQ0wCwYDVQQIDARVcmFsMRQw
** SIG ** EgYDVQQHDAtDaGVseWFiaW5zazERMA8GA1UECgwIUmV2
** SIG ** aWFraW4xCzAJBgNVBAsMAklUMRkwFwYDVQQDDBByZXZp
** SIG ** YWtpbi1yb290LUNBAgEDMA0GCWCGSAFlAwQCAQUAoHww
** SIG ** EAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwG
** SIG ** CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG
** SIG ** AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIAp5vdToBwFW
** SIG ** l4KroVT45tzcccJi0UeZ/Hpn0T6AwnCIMA0GCSqGSIb3
** SIG ** DQEBAQUABIIBAC5CyQnYAftV7dSx8fBRRqgev0j8oaGx
** SIG ** T+Eg/MCNOkDBmVYRmArfAy5jUwl/vsuk85m3eBZL6TKH
** SIG ** orWAL3miHHkFRpLR2Eb1EtDxdTjxvsbTihcyW5gp6d1P
** SIG ** M6JlNllxpvSyahgHdXPNUUBv0DK1/28VY6CmGR2TlLtB
** SIG ** 31L71H5B5DPjTkpPHXTaisrFRx9dsEFGbTaOLWVYEN3u
** SIG ** QZufMLYiG7mXLdH1wREs6jpVBQHRG+CMM2B0TpYyvKLS
** SIG ** o4Jjbksj1wpizXDo0ovBXuk+NNsm0afcgcqEWVbxO61X
** SIG ** dlLKRieuw5pSfiTu3nyCSxLeg9z1ULJfrDYkgR+bGBbi+R0=
</signature>
</job>