-
Notifications
You must be signed in to change notification settings - Fork 1
/
env.js
1494 lines (1464 loc) · 103 KB
/
env.js
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
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/* 1.4.1 определяет дополнительные переменные среды
cscript env.min.js [\\<context>] [<input>@<charset>] [<output>] [<option>...] ...
<context> - В контексте какого компьютера получить переменные.
<input> - Формат текстовых данных стандартного потока ввода.
ini - Ввести дополнительные переменные в ini формате.
csv - Ввести в csv формате (заглавное написание ожидает ещё и заголовок).
tsv - Ввести в tsv формате (заглавное написание ожидает ещё и заголовок).
<output> - Формат текстовых данных стандартного потока вывода.
ini - Вывести дополнительные переменные в ini формате.
csv - Вывести в csv формате (заглавное написание добавляет заголовок).
tsv - Вывести в tsv формате (заглавное написание добавляет заголовок).
<charset> - Кодировка текста стандартного потока ввода.
<option> - Дополнительные опции (может быть несколько, порядок не важен).
silent - Последующие команды выполнить без отображения.
nowait - Последующие команды выполнить без ожидания.
debug - Ввести в стандартный поток ошибок отладочную информацию.
*/
var env = new App({
driveMinSize: 26 * 1024 * 1024 * 1024, // минимальный общий объём диска для резервных копий в байтах
runStyle: 1, // стиль отображения запущенных программ по умолчанию
defReturn: 0, // значение возвращаемое по умолчанию
argWrap: '"', // обрамление аргументов
argDelim: " ", // разделитель значений агрументов
linDelim: "\r\n", // разделитель строк значений
keyDelim: "\\", // разделитель ключевых значений
chrDelim: "@", // разделитель кодировки от значений
getDelim: "+", // разделитель который нужно заменить
setDelim: "#", // разделитель на который нужно заменить
iniDelim: "=", // разделитель значений для файла выгрузки ini
csvDelim: ";", // разделитель значений для файла выгрузки csv
tsvDelim: "\t", // разделитель значений для файла выгрузки tsv
envType: "Process" // тип изменяемого переменного окружения
});
// подключаем зависимые свойства приложения
(function (wsh, app, undefined) {
app.lib.extend(app, {
fun: {// зависимые функции частного назначения
/**
* Преобразовывает строку с датой из WQL ответа в объект даты.
* @param {string} wql - Строка с датой из WQL ответа.
* @param {number} [offset] - Смещение по времени в минутах.
* @returns {date} Преобразованная дата.
*/
wql2date: function (wql, offset) {
return new Date(wql ? Date.UTC(
1 * wql.substring(0, 4),
1 * wql.substring(4, 6) - 1,
1 * wql.substring(6, 8),
1 * wql.substring(8, 10),
1 * wql.substring(10, 12) - 1 * wql.substring(21, 25) + (offset || 0),
1 * wql.substring(12, 14),
1 * wql.substring(14, 17)
) : 0);
},
/**
* Преобразовывает номер недели в году в объект даты по стандарту ISO-8601.
* @param {number} week - Номер недели в году.
* @param {number} [year] - Расчётный год.
* @returns {date} Дата четверга заданной недели.
*/
getDateOfWeek: function getDateOfWeek(week, year) {
var day, now, date;
now = new Date();// текущее время
week = 1 * week || 1;// по умолчанию первая неделя
year = 1 * year || now.getFullYear();// текущий год
day = new Date(year, 0, 4).getDay();// день для 4 января
day = (6 + day) % 7;// начало недели с понедельника
date = new Date(year, 0, 0 - day + 7 * week);
// возвращаем результат
return date;
},
/**
* Преобразовывает бинарные данные в ключ продукта.
* @param {binary} bin - Бинарные данные ключа продукта.
* @returns {string} Строковое значение ключа продукта.
*/
bin2key: function (bin) {
var isWin8, list, cur, last, part, pref = "N",
chars = "BCDFGHJKMPQRTVWXY2346789",
key = "", offset = 52;
try {// пробуем преобразовать в массив
list = bin.toArray();
} catch (e) { list = []; };
if (list.length) {// если есть данные
isWin8 = Math.floor(list[66] / 6) & 1;
list[66] = list[66] & 247 | (isWin8 & 2) * 4;
for (var i = 24; i > -1; i--) {// пробигаемся по индексу
cur = 0;// сбрасываем значение курсора
for (var j = 14; j > -1; j--) {// пробигаемся по индексу
cur = cur * 256;
cur = list[j + offset] + cur;
list[j + offset] = Math.floor(cur / 24);
cur = cur % 24;
};
key = chars.substring(cur, cur + 1) + key;
last = cur;
};
if (1 == isWin8) {// если это Windows 8
part = key.substring(1, last + 1);
key = key.substring(1).replace(part, part + pref);
};
key = [// форматируем ключ
key.substring(0, 5),
key.substring(5, 10),
key.substring(10, 15),
key.substring(15, 20),
key.substring(20, 25)
].join("-");
};
// возвращаем результат
return key;
},
/**
* Преобразовывает бинарные данные в идентификатор безопасности.
* @param {binary} bin - Бинарные данные идентификатора безопасности.
* @returns {string} Строковое значение идентификатора безопасности.
*/
bin2sid: function (bin) {
var list, revision, authority, subAuthority, count,
offset, size, id = "S", delim = "-", sid = "";
try {// пробуем преобразовать в массив
list = bin.toArray();
} catch (e) { list = []; };
if (list.length) {// если есть данные
// 0 байт - номер редакции
revision = list[0] & 255;
sid += id + delim + revision;
// 1 байт - колличество дополнительных блоков
count = list[1] & 255;
// 2 - 7 байты - 48 битный основной блок [Big-Endian]
authority = 0;// сбрасываем значение
for (var i = 2; i <= 7; i++) {// пробигаемся по байтам
authority += (list[i] & 255) * (1 << 8 * (5 - (i - 2)));
};
sid += delim + authority;
// 32 битные дополнительные блоки [Little-Endian]
size = 4; // 4 байта для каждого дополнительного блока
offset = 8;// задаём начальное смещение
for (var i = 0; i < count; i++) {// пробигаемся по блокам
subAuthority = 0;// сбрасываем значение
for (var j = 0; j < size; j++) {// пробигаемся по байтам
subAuthority += (list[offset + j] & 255) * (1 << 8 * j);
};
sid += delim + subAuthority;
offset += size;
};
};
// возвращаем результат
return sid;
},
/**
* Преобразовывает бинарные данные в строку текста.
* @param {binary} bin - Бинарные данные для преобразования.
* @returns {string} Строковое значение после преобразования.
*/
bin2str: function (bin) {
var list, index, value = "";
try {// пробуем преобразовать в массив
list = bin.toArray();
} catch (e) { list = []; };
// обрабатываем список значений
for (var i = 0, iLen = list.length; i < iLen; i++) {
index = list[i];// получаем очередное значение
if (index) value += String.fromCharCode(index);
};
// возвращаем результат
return value;
},
/**
* Преобразовывает число, количество бит или байт, в строку с размерностью.
* @param {number} info - Колличество информации в битах или байтах.
* @param {number} [decim] - Количество знаков после запятой.
* @param {number} [base=1024] - База для преобразования.
* @returns {string} Строковое значение с первой буквой степени.
*/
info2str: function (info, decim, base) {
var factor, value, prefix = "KMGTPEZYRQ";
if (!base || base < 2) base = 1024;
if (!decim || decim < 0) decim = 0;
factor = Math.pow(10, decim);
for (var i = -1; info >= base; i++) info = info / base;
value = Math.ceil(info * factor) / factor;
value = app.lib.num2str(value, i > -1 ? decim : 0, ".", "");
value += " " + prefix.charAt(i);
return value;
},
/**
* Очищает текст от лишних данных.
* @param {string} value - Текс для очистки от лишних данных.
* @returns {string} Очищенный текст.
*/
clear: function (value) {
value = value ? "" + value : "";
// очищаем по полному содержимому
if ("INVALID" == value) value = "";
if ("To be filled by O.E.M." == value) value = "";
if ("System Product Name" == value) value = "";
if ("System Serial Number" == value) value = "";
if ("System manufacturer" == value) value = "";
if ("Default string" == value) value = "";
if ("empty" == value) value = "";
if ("None" == value) value = "";
// очищаем по переданному содержимому
for (var i = 1, iLen = arguments.length; i < iLen; i++) {
value = value.replace(arguments[i], "");
};
// очищаем по регулярным выражениям
return value
.replace(/\(R\)/gi, "") // символ патента
.replace(/\(Registered Trademark\)/gi, "") // тарговая марка
.replace(/\(Microsoft Corporation\)/gi, "") // тарговая марка
.replace(/\(Корпорация Майкрософт\)/gi, "") // тарговая марка
.replace(/\(Майкрософт\)/gi, "") // тарговая марка
.replace(/\(TM\)/gi, "") // символ тарговой марки
.replace(/^[/'"]|[/"']$/g, "") // лишние символы по бокам
.replace(/\r\n|\n|\t/g, " ") // переводы строк и табуляции
.replace(/^\s+|\s+$/g, "") // пробельные символы в начале и в конце
.replace(/\.+$/, "") // точки в конце строки
.replace(/\s(?=\s)/gi, "") // лишнии пробельные символы
;
},
/**
* Исправляет текст для WQL запроса.
* @param {string} value - Текст для исправления.
* @returns {string} Исправленный текст.
*/
repair: function (value) {
value = "'" + (value ? value : "") + "'";
return value.replace(/\\/g, "\\\\");
},
/**
* Выводит отладочную информацию на экран.
* @param {string} value - Служебная информация.
* @returns {string} Служебная информация.
*/
debug: (function () {
var list, before, time = {}, count = -1;
return function (value) {
// выводим отладочную информацию
if (time.first) {// если включена отладка
// формируем первую часть
list = [app.lib.strPad(count, 3, "0", "left")];
list.push("|");// разделитель блоков
list.push(app.lib.strPad(app.lib.num2str((time.now.valueOf() - time.first.valueOf()) / 1000, 3, ".", ""), 7, "0", "left"));
// смешвем время в текущую итерацию
time.last = time.now;// сохраняем время вызова
time.now = new Date();// сохраняем текущее время
// формируем вторую часть
list.push("+" + app.lib.strPad(app.lib.num2str((time.now.valueOf() - time.last.valueOf()) / 1000, 3, ".", ""), 7, "0", "left"));
list.push("|");// разделитель блоков
list.push(before);// отладочное сообщение
// выводим информацию на экран
try {// пробуем отправить данные
wsh.stdErr.writeLine(list.join(" "));
} catch (e) { };// игнорируем исключения
} else time.now = new Date();
// сохраняем текущее состояние
if (!count && before) time.first = time.now;
before = value;// сохраняем сообщение
count++;// увеличиваем счётчик
// возвращаем переданное значение
return value;
};
})()
},
init: function () {// функция инициализации приложения
var shell, time, key, value, list, locator, cim, wmi, ldap, storage, registry,
length, mode, method, param, unit, item, items, command, parent, score,
total, offset, index, columns, delim, isEmpty, isAddType, isLocalContext,
host = "", domain = "", user = {}, data = {}, config = {},
benchmark = 0;
time = new Date();
shell = new ActiveXObject("WScript.Shell");
locator = new ActiveXObject("wbemScripting.Swbemlocator");
locator.security_.impersonationLevel = 3;// Impersonate
// получаем параметры конфигурации
length = wsh.arguments.length;// получаем длину
for (index = 0; index < length; index++) {
value = wsh.arguments.item(index);// получаем очередное значение
// контекст выполнения
key = "context";// ключ проверяемого параметра
if (!(key in config)) {// если нет в конфигурации
list = value.split(app.val.keyDelim);// вспомогательный список
if (3 == list.length) {// если пройдена основная проверка
if (// множественное условие
!list[0] && !list[1]
) {// если пройдена дополнительная проверка
config[key] = list[2];// задаём значение
continue;// переходим к следующему параметру
};
};
};
// импорт данных и кодировка
key = "input";// ключ проверяемого параметра
if (!(key in config)) {// если нет в конфигурации
list = value.split(app.val.chrDelim);// вспомогательный список
if (2 == list.length) {// если пройдена основная проверка
if (// множественное условие
app.lib.hasValue(["ini", "csv", "tsv", "CSV", "TSV"], list[0], true) && list[1]
) {// если пройдена дополнительная проверка
config[key] = list[0];// задаём значение
config.charset = list[1];// задаём значение
continue;// переходим к следующему параметру
};
};
};
// экспорт данных
key = "output";// ключ проверяемого параметра
if (!(key in config)) {// если нет в конфигурации
list = value.split(app.val.chrDelim);// вспомогательный список
if (1 == list.length) {// если пройдена основная проверка
if (// множественное условие
app.lib.hasValue(["ini", "csv", "tsv", "CSV", "TSV"], list[0], true)
) {// если пройдена дополнительная проверка
config[key] = list[0];// задаём значение
continue;// переходим к следующему параметру
};
};
};
// тихий режим
key = "silent";// ключ проверяемого параметра
if (!(key in config)) {// если нет в конфигурации
if (!app.lib.compare(key, value, true)) {// если пройдена основная проверка
config[key] = true;// задаём значение
continue;// переходим к следующему параметру
};
};
// без ожидания
key = "nowait";// ключ проверяемого параметра
if (!(key in config)) {// если нет в конфигурации
if (!app.lib.compare(key, value, true)) {// если пройдена основная проверка
config[key] = true;// задаём значение
continue;// переходим к следующему параметру
};
};
// режим отладки
key = "debug";// ключ проверяемого параметра
if (!(key in config)) {// если нет в конфигурации
if (!app.lib.compare(key, value, true)) {// если пройдена основная проверка
config[key] = true;// задаём значение
continue;// переходим к следующему параметру
};
};
// если закончились параметры конфигурации
break;// остававливаем получние параметров
};
// вносим поправки для конфигурации
offset = index;// запоминаем смещение по параметрам
isLocalContext = !("context" in config);
if (isLocalContext) config.context = ".";
if ("auto" == config.charset) config.charset = "windows-1251";
// создаём служебные объекты
app.fun.debug(config.debug);// если это необходимо включаем отладочный режим
if (config.context) {// если есть контекст выполнения
app.fun.debug("Connect and create objects");
for (index = 1; index; index++) {
try {// пробуем подключиться к компьютеру используя флаг wbemConnectFlagUseMaxWait
switch (index) {// последовательно создаём объекты
case 1: cim = locator.connectServer(config.context, "root\\CIMV2", null, null, null, null, 0x80); break;
case 2: wmi = locator.connectServer(config.context, "root\\WMI", null, null, null, null, 0x80); break;
case 3: ldap = locator.connectServer(".", "root\\directory\\LDAP", null, null, null, null, 0x80); break;
case 4: storage = locator.connectServer(config.context, "root\\Microsoft\\Windows\\Storage", null, null, null, null, 0x80); break;
case 5: registry = locator.connectServer(config.context, "root\\default", null, null, null, null, 0x80).get("stdRegProv"); break;
default: index = -1;// завершаем создание
};
} catch (e) {// при возникновении ошибки
switch (index) {// последовательно сбрасываем объекты
case 1: cim = null; index = -1; break;// завершаем создание
case 2: wmi = null; break;
case 3: ldap = null; break;
case 4: storage = null; break;
case 5: registry = null; break;
};
};
};
};
// получаем необходимые данные
if (cim) {// если удалось получить доступ к объекту
// вычисляем ключ операционной системы
if (registry) {// если удалось получить доступ к объекту
method = registry.methods_.item("getBinaryValue");
param = method.inParameters.spawnInstance_();
param.hDefKey = 0x80000002;// HKEY_LOCAL_MACHINE
param.sSubKeyName = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
param.sValueName = app.fun.debug("DigitalProductId");
item = registry.execMethod_(method.name, param);
if (!item.returnValue) {// если удалось прочитать значение
value = app.fun.bin2key(item.uValue);// преобразовываем значение ключа
if (value = app.fun.clear(value, "BBBBB-BBBBB-BBBBB-BBBBB-BBBBB")) data["SYS-KEY"] = value;
};
};
// вычисляем характеристики операционной системы
parent = null;// сбрасываем значение
response = cim.execQuery(app.fun.debug(
"SELECT *" +
" FROM Win32_OperatingSystem" +
" WHERE primary = TRUE"
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
if (item.systemDrive) parent = item;
if (value = item.localDateTime) time = app.fun.wql2date(value);
// характеристики
if (value = app.fun.clear(item.caption, "Майкрософт", "Microsoft", "Edition", "x64", ",")) data["SYS-NAME"] = value;
if (value = app.fun.clear(item.version)) data["SYS-VERSION"] = value;
if (value = item.localDateTime) data["SYS-TIME"] = app.lib.date2str(app.fun.wql2date(value), "d.m.Y H:i:s");
if (value = item.localDateTime) data["SYS-TIME-DATE"] = app.lib.date2str(app.fun.wql2date(value), "d.m.Y");
if (value = app.fun.clear(item.systemDrive)) data["SYS-DRIVE"] = value;
if (value = item.installDate) data["SYS-INSTALL"] = app.lib.date2str(app.fun.wql2date(value), "d.m.Y H:i:s");
if (value = item.installDate) data["SYS-INSTALL-DATE"] = app.lib.date2str(app.fun.wql2date(value), "d.m.Y");
if (value = item.lastBootUpTime) data["SYS-RESET"] = app.lib.date2str(app.fun.wql2date(value), "d.m.Y H:i:s");
if (value = item.lastBootUpTime) data["SYS-RESET-DATE"] = app.lib.date2str(app.fun.wql2date(value), "d.m.Y");
if (value = app.fun.clear(item.serialNumber)) data["SYS-SERIAL"] = value;
if (value = app.fun.clear(item.description)) data["SYS-DESCRIPTION"] = value;
data["SYS-ARCHITECTURE"] = item.osArchitecture && !item.osArchitecture.indexOf("64") ? "x64" : "x86";
// останавливаемся на первом элименте
break;
};
// вычисляем дополнительные характеристики
response = cim.execQuery(app.fun.debug(
"SELECT *" +
" FROM Win32_ComputerSystem"
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
if (value = item.dnsHostName) host = value;
if (value = item.name) if (!host) host = value.toLowerCase();
if (item.domain != item.workgroup) domain = item.domain;
// формируем идентификатор пользователя
if (value = item.userName) user.domain = value.split(app.val.keyDelim)[0];
if (value = item.userName) user.login = value.split(app.val.keyDelim)[1];
if (value = item.userName) user.account = value;
// характеристики
if (value = app.fun.clear(host)) data["NET-HOST"] = value;
if (value = app.fun.clear(item.domain)) data["NET-DOMAIN"] = value;
if (value = app.fun.clear(item.model)) data["DEV-NAME"] = value;
if (value) if (value = app.fun.clear(item.manufacturer, "Inc.", "Hewlett-Packard")) data["DEV-NAME"] = value.split(" ")[0] + " " + app.fun.clear(item.model);
// тип устройства
switch (true) {// поддерживаемые типы
case 2 == parent.productType: value = "Controller"; break;
case 3 == parent.productType: value = "Server"; break;
case 2 == item.pcSystemTypeEx: value = "Notebook"; break;
case 8 == item.pcSystemTypeEx: value = "Tablet"; break;
default: value = "Desktop";
};
if (value) data["DEV-TYPE"] = value;
// останавливаемся на первом элименте
break;
};
// вычисляем букву диска для резервных копий
response = cim.execQuery(app.fun.debug(
"SELECT caption, size" +
" FROM Win32_LogicalDisk" +
" WHERE driveType = 2 OR driveType = 3 OR driveType = 4"
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
if (item.caption && parent && parent.systemDrive && -1 != item.caption.indexOf(parent.systemDrive) || data["BAK-DRIVE"]) continue;
// характеристики
if (value = app.fun.clear(item.caption)) if (item.size >= app.val.driveMinSize) data["BAK-DRIVE"] = value;
};
// вычисляем характеристики материнской платы
response = cim.execQuery(app.fun.debug(
"SELECT manufacturer, product, serialNumber" +
" FROM Win32_BaseBoard" +
" WHERE hostingBoard = TRUE"
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
// характеристики
if (value = app.fun.clear(item.product)) data["PCB-NAME"] = value;
if (value) if (value = app.fun.clear(item.manufacturer, "Inc.").replace("Hewlett-Packard", "HP")) data["PCB-NAME"] = value.split(" ")[0] + " " + app.fun.clear(item.product);
if (value = app.fun.clear(item.serialNumber)) data["PCB-SERIAL"] = value;
// останавливаемся на первом элименте
break;
};
// вычисляем характеристики basic input/output system
response = cim.execQuery(app.fun.debug(
"SELECT releaseDate, manufacturer, smBIOSBIOSVersion, serialNumber" +
" FROM Win32_BIOS" +
" WHERE primaryBIOS = TRUE"
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
// характеристики
if (value = app.fun.clear(item.releaseDate)) data["PCB-BIOS-RELEASE"] = app.lib.date2str(app.fun.wql2date(value, time.getTimezoneOffset()), "d.m.Y H:i:s");
if (value = app.fun.clear(item.releaseDate)) data["PCB-BIOS-RELEASE-DATE"] = app.lib.date2str(app.fun.wql2date(value, time.getTimezoneOffset()), "d.m.Y");
if (value = app.fun.clear(item.manufacturer, "Inc.")) data["PCB-BIOS-MANUFACTURE"] = value;
if (value = app.fun.clear(item.smBIOSBIOSVersion)) data["PCB-BIOS-VERSION"] = value;
if (value = app.fun.clear(item.serialNumber)) data["PCB-BIOS-SERIAL"] = value;
// останавливаемся на первом элименте
break;
};
// вычисляем характеристики сетевого соединения
parent = null;// сбрасываем значение
response = cim.execQuery(app.fun.debug(
"SELECT *" +
" FROM Win32_NetworkAdapterConfiguration" +
" WHERE ipEnabled = TRUE" +
" AND fullDNSRegistrationEnabled = TRUE"
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
if (item.serviceName && -1 != item.serviceName.indexOf("vpn")) continue;
if (item.serviceName && -1 != item.serviceName.indexOf("loop")) continue;
if (item.serviceName && -1 != item.serviceName.indexOf("VBox")) continue;
if (item.interfaceIndex) parent = item;
// основной адрес
if (null != item.ipAddress) {// если есть список ip адресов
list = item.ipAddress.toArray();// получаем очередной список
for (var i = 0, iLen = list.length; i < iLen; i++) {
value = app.fun.clear(list[i]);// получаем очередное значение
if (value && -1 != value.indexOf(".") && !data["NET-IP-V4"]) data["NET-IP-V4"] = value;
if (value && -1 == value.indexOf(".") && !data["NET-IP-V6"]) data["NET-IP-V6"] = value;
};
};
// основной шлюз
if (null != item.defaultIPGateway) {// если есть список ip адресов
list = item.defaultIPGateway.toArray();// получаем очередной список
for (var i = 0, iLen = list.length; i < iLen; i++) {
value = app.fun.clear(list[i]);// получаем очередное значение
if (value && -1 != value.indexOf(".") && !data["NET-GATEWAY-V4"]) data["NET-GATEWAY-V4"] = value;
if (value && -1 == value.indexOf(".") && !data["NET-GATEWAY-V6"]) data["NET-GATEWAY-V6"] = value;
};
};
// основной dns
if (null != item.dnsServerSearchOrder) {// если есть список ip адресов
list = item.dnsServerSearchOrder.toArray();// получаем очередной список
for (var i = 0, iLen = list.length; i < iLen; i++) {
value = app.fun.clear(list[i]);// получаем очередное значение
if (value && -1 != value.indexOf(".") && !data["NET-DNS-V4"]) data["NET-DNS-V4"] = value;
if (value && -1 == value.indexOf(".") && !data["NET-DNS-V6"]) data["NET-DNS-V6"] = value;
};
};
// основная маска
if (null != item.ipSubnet) {// если есть список ip адресов
list = item.ipSubnet.toArray();// получаем очередной список
for (var i = 0, iLen = list.length; i < iLen; i++) {
value = app.fun.clear(list[i]);// получаем очередное значение
if (value && -1 != value.indexOf(".") && !data["NET-SUBNET-V4"]) data["NET-SUBNET-V4"] = value;
if (value && -1 == value.indexOf(".") && !data["NET-SUBNET-V6"]) data["NET-SUBNET-V6"] = value;
};
};
// характеристики
if (value = app.fun.clear(item.dhcpServer)) data["NET-DHCP-V4"] = value;
if (value = app.fun.clear(item.description, "Сетевой адаптер", "Адаптер", "для виртуальной сети", "Сетевая карта", "Контроллер", "NIC (NDIS 6.20)", "- Минипорт планировщика пакетов", "Family Controller", "Adapter", "Virtual Miniport", "for Windows", "x64").replace(/#\d+$/g, "")) data["NET-NAME"] = value;
if (value = app.fun.clear(item.macAddress)) data["NET-MAC"] = value;
// останавливаемся на первом элименте
break;
};
// вычисляем характеристики сетевого адаптера
if (parent && parent.interfaceIndex) {// если есть идентификатор для запроса
response = cim.execQuery(app.fun.debug(
"SELECT speed, timeOfLastReset" +
" FROM Win32_NetworkAdapter" +
" WHERE netEnabled = TRUE" +
" AND interfaceIndex = " + app.fun.repair(parent.interfaceIndex)
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
// характеристики
if (value = item.speed) data["NET-SPEED"] = app.fun.info2str(value, 0, 1000) + "bps";
if (value = item.speed) data["NET-SPEED-VAL"] = value;
if (value = item.timeOfLastReset) data["NET-RESET"] = app.lib.date2str(app.fun.wql2date(value), "d.m.Y H:i:s");
if (value = item.timeOfLastReset) data["NET-RESET-DATE"] = app.lib.date2str(app.fun.wql2date(value), "d.m.Y");
// останавливаемся на первом элименте
break;
};
};
// для поддержки старых операционных систем
if (!user.account && registry) {// если нужно выполнить
list = [];// сбрасываем список значений
// вычисляем имя пользователя поумолчанию
method = registry.methods_.item("getStringValue");
param = method.inParameters.spawnInstance_();
param.hDefKey = 0x80000002;// HKEY_LOCAL_MACHINE
param.sSubKeyName = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon";
param.sValueName = app.fun.debug("DefaultDomainName");
item = registry.execMethod_(method.name, param);
if (!item.returnValue && item.sValue) list.push(item.sValue);
// вычисляем домен пользователя поумолчанию
method = registry.methods_.item("getStringValue");
param = method.inParameters.spawnInstance_();
param.hDefKey = 0x80000002;// HKEY_LOCAL_MACHINE
param.sSubKeyName = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon";
param.sValueName = app.fun.debug("DefaultUserName");
item = registry.execMethod_(method.name, param);
if (!item.returnValue && item.sValue) list.push(item.sValue);
// формируем идентификатор пользователя
if (2 == list.length) user.domain = list[0];
if (2 == list.length) user.login = list[1];
if (2 == list.length) user.account = list.join(app.val.keyDelim);
};
// вычисляем характеристики из локального профиля
if (!user.account) {// если идентификатор пользователя неопределён
unit = null;// сбрасываем значение
response = cim.execQuery(app.fun.debug(
"SELECT lastUseTime, localPath, loaded, sid" +
" FROM Win32_UserProfile" +
" WHERE special = FALSE"
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
// производим сравнение элиментов
value = unit ? 0 : 1;// сбрасваем значение для сравнения
if (!value) value = item.loaded && !unit.loaded ? 1 : value;
if (!value) value = app.lib.compare(app.fun.wql2date(item.lastUseTime), app.fun.wql2date(unit.lastUseTime));
// запоминаем более подходящий элимент
if (value > 0) unit = item;
};
if (item = unit) {// если есть подходящий элимент
// формируем идентификатор пользователя
user.profile = item.localPath;
if (value = item.sid) user.sid = value;
};
};
// вычисляем характеристики из sid
if (!user.account && user.sid) {// если нужно выполнить
list = [];// сбрасываем список значений
// получаем вспомогательный объект
try {// пробуем получить данные
item = cim.get('Win32_SID.SID="' + user.sid + '"');
} catch (e) {// при возникновении ошибки
item = null;
};
// вычисляем имя и домен пользователя
if (value = item.referencedDomainName) list.push(value);
if (value = item.accountName) list.push(value);
// формируем идентификатор пользователя
if (2 == list.length) user.domain = list[0];
if (2 == list.length) user.login = list[1];
if (2 == list.length) user.account = list.join(app.val.keyDelim);
};
// вычисляем характеристики локального пользователя
if (user.account && app.lib.hasValue([".", host], user.domain, false)) {// если нужно выполнить
response = cim.execQuery(app.fun.debug(
"SELECT domain, name, fullName, sid" +
" FROM Win32_UserAccount" +
" WHERE name = " + app.fun.repair(user.login) +
" AND domain = " + app.fun.repair(user.domain)
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
list = [];// сбрасываем список значений
// характеристики
user.name = item.fullName;
if (value = item.sid) user.sid = value;
// вычисляем имя и домен пользователя
if (value = item.domain) list.push(value);
if (value = item.name) list.push(value);
// формируем идентификатор пользователя
if (2 == list.length) user.domain = list[0];
if (2 == list.length) user.login = list[1];
if (2 == list.length) user.account = list.join(app.val.keyDelim);
// останавливаемся на первом элименте
break;
};
};
// вычисляем характеристики доменного пользователя
if (user.account && ldap && !app.lib.hasValue([".", host], user.domain, false)) {// если нужно выполнить
list = [// список запрашиваемых аттрибутов
"DS_co", "DS_c", "DS_company", "DS_displayName", "DS_department", "DS_info",
"DS_homeDirectory", "DS_l", "DS_mail", "DS_mobile", "DS_objectSid",
"DS_telephoneNumber", "DS_title", "DS_distinguishedName"
];
response = ldap.execQuery(app.fun.debug(
"SELECT " + list.join(", ") +
" FROM DS_user" +
" WHERE DS_sAMAccountName = " + app.fun.repair(user.login)
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
// характеристики
user.name = item.DS_displayName;
user.home = item.DS_homeDirectory;
if (unit = item.DS_objectSid) if (value = app.fun.bin2sid(unit.value)) user.sid = value;
if (value = app.fun.clear(item.DS_co)) data["USR-COUNTRY"] = value;
if (value = app.fun.clear(item.DS_c)) data["USR-COUNTRY-ID"] = value;
if (value = app.fun.clear(item.DS_company, '"')) data["USR-COMPANY"] = value;
if (value = app.fun.clear(item.DS_department, '"')) data["USR-DEPARTMENT"] = value;
if (value = app.fun.clear(item.DS_distinguishedName)) data["USR-ACCOUNT-DN"] = value;
if (value = app.fun.clear(item.DS_l)) data["USR-CITY"] = value;
if (value = app.fun.clear(item.DS_mail)) data["USR-EMAIL"] = value;
if (value = app.fun.clear(item.DS_mobile)) data["USR-MOBILE"] = value;
if (value = app.fun.clear(item.DS_telephoneNumber)) data["USR-PHONE"] = value;
if (value = app.fun.clear(item.DS_title, '"')) data["USR-POSITION"] = value;
if (value = app.fun.clear(item.DS_info, '"')) data["USR-INFO"] = value;
// останавливаемся на первом элименте
break;
};
};
// вычисляем характеристики из сетевого профиля
if (user.account && !("home" in user)) {// если нужно выполнить
response = cim.execQuery(app.fun.debug(
"SELECT homeDirectory" +
" FROM Win32_NetworkLoginProfile" +
" WHERE name = " + app.fun.repair(user.account)
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
// формируем идентификатор пользователя
user.home = item.homeDirectory;
// останавливаемся на первом элименте
break;
};
};
// вычисляем характеристики из локального профиля
if (user.sid && !("profile" in user)) {// если нужно выполнить
response = cim.execQuery(app.fun.debug(
"SELECT localPath" +
" FROM Win32_UserProfile" +
" WHERE sid = " + app.fun.repair(user.sid)
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
// формируем идентификатор пользователя
user.profile = item.localPath;
// останавливаемся на первом элименте
break;
};
};
// заполняем сводную информацию по пользователю
if (value = app.fun.clear(user.sid)) data["USR-SID"] = value;
if (value = app.fun.clear(user.account)) data["USR-ACCOUNT"] = value;
if (value = app.fun.clear(user.login)) data["USR-LOGIN"] = value;
if (value = app.fun.clear(user.domain)) data["USR-DOMAIN"] = value;
if (value = app.fun.clear(user.profile)) data["USR-PROFILE"] = value;
if (value = app.fun.clear(user.home)) data["USR-HOME"] = value;
if (value = app.fun.clear(user.name)) data["USR-NAME"] = value;
if (value = app.fun.clear(user.name)) {// если получено значение
list = value.split(app.val.argDelim);// рабзиваем на фрагменты
for (var i = list.length - 1; i > -1; i--) {// пробигаемся по списку
value = app.fun.clear(list[i], /[\[\(,\.\)\]]/g);
isEmpty = value.length < 3;// считать ли это значение пустым
isEmpty = isEmpty || app.lib.hasValue(["von"], value, true);
if (isEmpty) list.splice(i, 1);
else list[i] = value;
};
if (value = list[0]) data["USR-NAME-FIRST"] = value;
if (value = list[1]) data["USR-NAME-SECOND"] = value;
if (value = list[2]) data["USR-NAME-THIRD"] = value;
if (value = list[3]) data["USR-NAME-FOURTH"] = value;
};
// вычисляем distinguished name компьютера в active directory
if (host && ldap && domain) {// если нужно выполнить
response = ldap.execQuery(app.fun.debug(
"SELECT DS_distinguishedName" +
" FROM DS_computer" +
" WHERE DS_cn = " + app.fun.repair(host)
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
// характеристики
if (value = app.fun.clear(item.DS_distinguishedName)) data["NET-HOST-DN"] = value;
// останавливаемся на первом элименте
break;
};
};
// вычисляем характеристики центрального процессора
score = 0;// обнуляем текущую оценку
response = cim.execQuery(app.fun.debug(
"SELECT architecture, maxClockSpeed, name, revision, numberOfCores, socketDesignation" +
" FROM Win32_Processor" +
" WHERE role = 'CPU'"
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
// характеристики
if (0 == item.architecture) data["CPU-ARCHITECTURE"] = "x86";
else if (9 == item.architecture) data["CPU-ARCHITECTURE"] = "x64";
if (value = item.maxClockSpeed) data["CPU-SPEED"] = app.fun.info2str(value * 1000 * 1000, 2, 1000) + "Hz";
if (value = item.maxClockSpeed) data["CPU-SPEED-VAL"] = value * 1000 * 1000;
if (value = app.fun.clear(item.name, "CPU", "APU", "Процессор", "Processor", "with", "Radeon HD Graphics", "11th Gen")) data["CPU-NAME"] = value;
if (value = app.fun.clear(item.revision)) data["CPU-VERSION"] = value;
if (value = app.fun.clear(item.numberOfCores)) data["CPU-CORE"] = value;
if (value = app.fun.clear(item.socketDesignation, "SOCKET 0")) data["CPU-SOCKET"] = value;
// косвенно считаем производительность
if (value = item.maxClockSpeed) score += 2.26143 * Math.sqrt(value / 1000);
if (value = item.numberOfCores) score *= 1.02033 * Math.sqrt(value);
// останавливаемся на первом элименте
break;
};
if (score) benchmark = benchmark ? Math.min(benchmark, score) : score;
// вычисляем характеристики кеша процессора
response = cim.execQuery(app.fun.debug(
"SELECT level, maxCacheSize" +
" FROM Win32_CacheMemory"
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
// характеристики
if (value = item.maxCacheSize) data["CPU-CACHE-L" + (item.level - 2)] = app.fun.info2str(value * 1024, 0) + "B";
};
// вычисляем характеристики оперативной памяти
score = 0;// обнуляем текущую оценку
total = 0;// обнуляем значение для суммирования
response = cim.execQuery(app.fun.debug(
"SELECT capacity, speed" +
" FROM Win32_PhysicalMemory"
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
// характеристики
if (value = item.capacity) data["RAM-SIZE-VAL"] = total += 1 * value;
if (value = item.capacity) data["RAM-SIZE"] = app.fun.info2str(total, 0) + "B";
if (value = item.speed) data["RAM-SPEED"] = value + " MHz";
if (value = item.speed) data["RAM-SPEED-VAL"] = value * 1000 * 1000;
// косвенно считаем производительность
if (value = total) score = 2.51143 * Math.sqrt(value / 1024 / 1024 / 1024);
if (value = item.speed) score *= 0.92245 * Math.sqrt(value / 1000);
};
if (score) benchmark = benchmark ? Math.min(benchmark, score) : score;
// вычисляем характеристики графического процессора
unit = null;// сбрасываем значение
parent = null;// сбрасываем значение
response = cim.execQuery(app.fun.debug(
"SELECT adapterRam, name, driverVersion, currentHorizontalResolution, currentRefreshRate, currentBitsPerPixel, currentVerticalResolution" +
" FROM Win32_VideoController"
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
if (item.currentHorizontalResolution && item.currentVerticalResolution) {
key = "Microsoft Remote Display";
// производим сравнение элиментов
value = parent ? 0 : 1;// сбрасваем значение для сравнения
if (!value) value = item.name && -1 != item.name.indexOf(key) ? 1 : value;
if (!value) value = parent.name && -1 != parent.name.indexOf(key) ? -1 : value;
if (!value) value = app.lib.compare(item.currentHorizontalResolution, parent.currentHorizontalResolution);
if (!value) value = app.lib.compare(item.currentVerticalResolution, parent.currentVerticalResolution);
// запоминаем более подходящий элимент
if (value > 0) parent = item;
};
// производим сравнение элиментов
value = unit ? 0 : 1;// сбрасваем значение для сравнения
if (!value) value = app.lib.compare(Math.abs(item.adapterRam), Math.abs(unit.adapterRam));
if (!value) value = app.lib.compare(item.currentHorizontalResolution, unit.currentHorizontalResolution);
if (!value) value = app.lib.compare(item.currentVerticalResolution, unit.currentVerticalResolution);
// запоминаем более подходящий элимент
if (value > 0) unit = item;
};
if (item = unit) {// если есть подходящий элимент
// характеристики
if (value = item.adapterRam) data["GPU-SIZE"] = app.fun.info2str(Math.abs(value), 0) + "B";
if (value = item.adapterRam) data["GPU-SIZE-VAL"] = Math.abs(value);
if (value = app.fun.clear(item.name, "GPU", "Видеоустройство", "Family", "Chipset", "Series", "Graphics", "Adapter")) data["GPU-NAME"] = value;
if (value = app.fun.clear(item.driverVersion)) data["GPU-VERSION"] = value;
if (value = parent && parent.currentHorizontalResolution) data["GPU-RESOLUTION-X"] = value;
if (value = parent && parent.currentVerticalResolution) data["GPU-RESOLUTION-Y"] = value;
if (value = parent && parent.currentRefreshRate) data["GPU-FREQUENCY"] = app.fun.info2str(value, 0, 1000) + "Hz";
if (value = parent && parent.currentRefreshRate) data["GPU-FREQUENCY-VAL"] = value;
if (value = parent && parent.currentBitsPerPixel) data["GPU-COLOR"] = app.fun.info2str(value, 0) + "bit";
if (value = parent && parent.currentBitsPerPixel) data["GPU-COLOR-VAL"] = value;
if (parent && parent.currentHorizontalResolution && parent.currentVerticalResolution) {
data["GPU-RESOLUTION"] = parent.currentHorizontalResolution + " x " + parent.currentVerticalResolution;
};
};
// вычисляем характеристики монитора
if (wmi) {// если удалось получить доступ к объекту
// вычисляем общие характеристики монитора
parent = null;// сбрасываем значение
response = wmi.execQuery(app.fun.debug(
"SELECT instanceName, serialNumberId, userFriendlyName, userFriendlyNameLength, weekOfManufacture, yearOfManufacture" +
" FROM WmiMonitorID" +
" WHERE active = TRUE"
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
if (!item.userFriendlyNameLength) continue;
if (item.instanceName) parent = item;
// характеристики
if (value = app.fun.bin2str(item.userFriendlyName)) if (value = app.fun.clear(value, " 4K", " HDR")) data["MON-NAME"] = value;
if (value = app.fun.bin2str(item.serialNumberId)) if (value = app.fun.clear(value)) if ("0" != value) data["MON-SERIAL"] = value;
if (item.yearOfManufacture && item.weekOfManufacture) data["MON-RELEASE"] = app.lib.date2str(app.fun.getDateOfWeek(item.weekOfManufacture, item.yearOfManufacture), "d.m.Y H:i:s");
if (item.yearOfManufacture && item.weekOfManufacture) data["MON-RELEASE-DATE"] = app.lib.date2str(app.fun.getDateOfWeek(item.weekOfManufacture, item.yearOfManufacture), "d.m.Y");
// останавливаемся на первом элименте
break;
};
// вычисляем дополнительные характеристики монитора
if (parent && parent.instanceName) {// если есть идентификатор для запроса
response = wmi.execQuery(app.fun.debug(
"SELECT maxHorizontalImageSize, maxVerticalImageSize" +
" FROM WmiMonitorBasicDisplayParams" +
" WHERE instanceName = " + app.fun.repair(parent.instanceName)
));
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
// характеристики
if (value = item.maxHorizontalImageSize) data["MON-SIZE-X"] = value;
if (value = item.maxVerticalImageSize) data["MON-SIZE-Y"] = value;
if (item.maxHorizontalImageSize && item.maxVerticalImageSize) {// если заданы значения
value = Math.sqrt(Math.pow(item.maxHorizontalImageSize, 2) + Math.pow(item.maxVerticalImageSize, 2));
value = Math.round(value / 2.54);// переводим в дюймы и округляем
data["MON-SIZE"] = item.maxHorizontalImageSize + " x " + item.maxVerticalImageSize + " cm / " + value + " in";
data["MON-SIZE-Z"] = value;
};
// останавливаемся на первом элименте
break;
};
};
};
// вычисляем дисковую подсистему
score = 0;// обнуляем текущую оценку
if (storage) {// если удалось получить доступ к объекту
response = storage.execQuery(app.fun.debug(
"SELECT model, firmwareVersion, mediaType, serialNumber, size" +
" FROM MSFT_PhysicalDisk"
));
} else {// для поддержки старых операционных систем
response = cim.execQuery(app.fun.debug(
"SELECT *" +
" FROM Win32_DiskDrive"
));
};
items = new Enumerator(response);
while (!items.atEnd()) {// пока не достигнут конец
item = items.item();// получаем очередной элимент коллекции
items.moveNext();// переходим к следующему элименту
// определяем тип насителя
switch (item.mediaType) {// поддерживаемые типы
// для современных операционных систем
case 0: key = "USB"; break;
case 3: key = "HDD"; break;
case 4: key = "SSD"; break;
case 5: key = "SCM"; break;
// для старых операционных систем
case "Removable Media":
key = "USB";
break;
case "Fixed hard disk media":
case "Fixed hard disk media":
if (item.model && -1 != item.model.indexOf("Solid")) key = "SSD";
else if (item.model && -1 != item.model.indexOf("SSD")) key = "SSD";