Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Нужна помощь с выгрузкой из WMIC (http://forum.oszone.net/showthread.php?t=308112)

8ash8 18-11-2015 15:28 2576172

Нужна помощь с выгрузкой из WMIC
 
Добрый день, есть необходимость создать батник для сбора информации о ПК, в процессе написания столкнулся с некоторыми проблемами, буду благодарен если поможете разобраться.

Мой код:
Скрытый текст
@echo on
chcp 1251 >nul
color 70
echo COMPUTER NAME: %computername% >> %date%_%computername%.txt
For /F "Tokens=1* " %%A In ('WMIC OS GET CSDVersion^, Caption^|FindStr .^|More +1^|FindStr /n .') Do echo OS: %%B >> %date%_%computername%.txt
For /F "Tokens=1,3* Delims=,:" %%A In ('WMIC OS GET OSArchitecture /FORMAT:CSV^|FindStr .^|More +1^|FindStr /n .') Do echo ARCHITECTURE: %%B >> %date%_%computername%.txt
For /F "Tokens=1,3* Delims=,:" %%A In ('WMIC OS GET InstallDate /FORMAT:CSV^|FindStr .^|More +1^|FindStr /n .') Do echo INSTALL_DATE: %%B >> %date%_%computername%.txt
WMIC OS GET InstallDate |FindStr : >> %date%_%computername%.txt
For /F "Tokens=1,3* delims=,:" %%A IN ('WMIC OS GET TotalVisibleMemorySize /FORMAT:CSV^|FindStr .^|More +1^|FindStr /n .') Do echo RAM: %%B Kb >> %date%_%computername%.txt
For /F "Tokens=1,3* Delims=,:" %%A In ('WMIC CPU GET Name^ /FORMAT:CSV^|FindStr .^|More +1^|FindStr /n .') Do echo CPU: %%B >> %date%_%computername%.txt
For /F "Tokens=1,3 Delims==:" %%A In ('WMIC path Win32_NetworkAdapter Where ^"AdapterTypeId^=0 And NetConnectionStatus^=2^" GET Name /VALUE^|FindStr .^|FindStr /n .') Do echo NETWORK CARD: %%B >> %date%_%computername%.txt
For /F "Tokens=1* Delims==:" %%A In ('WMIC path Win32_NetworkAdapter Where ^"AdapterTypeId^=0 And NetConnectionStatus^=2^" GET MACAddress^|FindStr .^|More +1^|FindStr /n .') Do echo MACAddress: %%B >> %date%_%computername%.txt
For /F "Tokens=1,3* Delims=,:" %%A In ('WMIC BIOS GET Manufacturer^,Name /FORMAT:CSV^|FindStr .^|More +1^|FindStr /n .') Do echo BIOS: %%B, %%C >> %date%_%computername%.txt
For /F "Tokens=1,3 Delims==:" %%A In ('WMIC path Win32_SoundDevice GET Name /VALUE^|FindStr .^|FindStr /n .') Do echo SOUND CARD: %%B >> %date%_%computername%.txt
For /F "Tokens=1,3 Delims==:" %%A In ('WMIC DISKDRIVE Where InterfaceType^=^'IDE^' GET Model /VALUE^|FindStr .^|FindStr /n .') Do echo HDD: %%B >> %date%_%computername%.txt
For /F "Tokens=1,3* Delims=,:" %%A In ('WMIC path Win32_VideoController GET Name^,AdapterRAM /FORMAT:CSV^|FindStr .^|More +1^|FindStr /n .') Do echo VIDEOCARD: %%C, %%B bytes RAM >> %date%_%computername%.txt
pause


в результате выдает:
Скрытый текст
COMPUTER NAME: R2D2
OS: Windows 7 Professional Service Pack 1
ARCHITECTURE: 32-bit
INSTALL_DATE: 20150311103240.000000+180
RAM: 3145272 Kb
CPU: Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz
NETWORK CARD: Ђ¤*ЇвҐа ¬*ЈЁбва*«м*®© бҐвЁ ўЁавг*«м*®© ¬*иЁ*л (Њ*©Єа®б®дв) #6
MACAddress: 00:15:5D:C4:C0:00
BIOS: American Megatrends Inc., BIOS Date: 05/23/12 17:15:53 Ver: 09.00.06
HDD: Virtual HD ATA Device
HDD: Virtual HD ATA Device
VIDEOCARD: , ‚Ё¤Ґ®гбва®©бвў® иЁ*л VMBus (Њ*©Єа®б®дв) bytes RAM


1) Не могу понять почему при выгрузке не меняется кодировка с 866 на 1251, хотя chcp 1251 >nul в начале батника указываю.
2) Подскажите как произвести форматирование выгружаемых данных в строке INSTALL_DATE: с 20150311103240.000000+180 на 2015.03.11 (заменить выгрузку строки не из WMIC а из sysinfo не предлагать)
3) Как перевести выгружаемые данные в строке RAM из Кb в Мb. Побывал сделать через переменную:

Скрытый текст
For /F "Tokens=1,3* delims=,:" %%A IN ('WMIC OS GET TotalVisibleMemorySize /FORMAT:CSV^|FindStr .^|More +1^|FindStr /n .') Do (
set /a Memory = "%%B/1024"
)
echo RAM: %Memory% Mb >> %date%_%computername%.txt

но безрезультатно, в чем косяк понять не могу.
4) Если кто знает есть ли возможность через WMIC выгрузить имена учетных записей на ПК (Windows 7). Буду благодарен за пример.

В результате хотелось бы чтобы информация выводилась в следующем формате:
Скрытый текст

COMPUTER NAME: R2D2
OS: Windows 7 Professional Service Pack 1
ARCHITECTURE: 32-bit
INSTALL_DATE: 2015.03.11
RAM: 3072 МB
CPU: Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz
NETWORK CARD: Адаптер магистральной сети виртуальной машины (Майкрософт) #6
MACAddress: 00:15:5D:C4:C0:00
BIOS: American Megatrends Inc., BIOS Date: 05/23/12 17:15:53 Ver: 09.00.06
HDD: Virtual HD ATA Device
HDD: Virtual HD ATA Device
VIDEOCARD: Видеоустройство шины VMBus (Майкрософт) bytes RAM
USER NAME:

Foreigner 18-11-2015 16:13 2576181

Цитата:

Цитата 8ash8
4) Если кто знает есть ли возможность через WMIC выгрузить имена учетных записей на ПК (Windows 7). »

Код:

@echo off

for /f "skip=1" %%i in ('wmic useraccount get name ^| findstr "."') do echo %%i


8ash8 17-02-2016 16:57 2607101

Добрый день, столкнулся с такой проблемой на домашнем ПК все выгружается нормально, а вот в на работе в домене запрос наглухо виснет (ждал более 30мин.) с чем это может быть связанно кто знает?

Iska 17-02-2016 17:09 2607112

Цитата:

Цитата 8ash8
а вот в на работе в домене запрос наглухо виснет (ждал более 30мин.) с чем это может быть связанно кто знает? »

С опросом доступных контроллеров доменов.

Kazun 17-02-2016 17:09 2607113

Задержка в домене происходит из-за получения всех данный из AD, чтобы получить только локальных пользователей, надо использовать фильтр по localaccount:

Код:

wmic useraccount where localaccount='true' get name
в батнике:

Код:

wmic useraccount where localaccount^='true' get name

8ash8 18-02-2016 11:06 2607416

Спасибо, а не подскажите, как ещё можно сделать выгрузку наименований учетных записей (доменных) на ПК. Может как то через реестр возможно?

Elven 18-02-2016 11:37 2607433

Код:

dsquery user -limit 0 >> result.txt

Iska 18-02-2016 13:03 2607468

Цитата:

Цитата 8ash8
выгрузку наименований учетных записей (доменных) »

Точно так же, но указать «…where localaccount='false'…» или «… where "localaccount<>'true'" …».

8ash8 18-02-2016 13:41 2607489

Цитата:

Цитата Iska
Цитата 8ash8:
выгрузку наименований учетных записей (доменных) »
Точно так же, но указать «…where localaccount='false'…» или «… where "localaccount<>'true'" …».

Увы, но все равно зависает (((

Iska 18-02-2016 14:01 2607495

Цитата:

Цитата 8ash8
Увы, но все равно зависает ((( »

Ну, это само собой. Раз у Вас раньше «подвисал» опросе контроллеров, то, разумеется, и теперь будет.

Опробуйте рекомендованный выше «dsquery», он работает не через провайдера Wbem, а напрямую с интерфейсами ADSI.

8ash8 18-02-2016 15:34 2607545

Вот нашел способ выгрузить нужные данные через реестр, но появилось 2 вопроса

For /F "Tokens=3 Delims== " %%A IN ('Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-20" /F ProfileImagePath') DO set I=%%A
Echo %I%

1) Кто может подсказать, как в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\ сделать выгрузку значений ветки подходящих под маску S-1-5-2*?
2) При выгрузке ProfileImagePath получается запись типа C:\Windows\ServiceProfiles\NetworkService, как оставить значение после последнего \. Т. к. путь может быть разной длины, при помощи Findstr я не представляю как это можно задать. Кто может подсказать?

Iska 18-02-2016 15:59 2607559

Цитата:

Цитата 8ash8
Вот нашел способ выгрузить нужные данные через реестр, »

А точно ли «нужные»? Опишите словами, что именно Вы хотите получить.

8ash8 18-02-2016 16:32 2607574

При входе под доменной учеткой, на ПК создается профиль пользователя, мне нужно выгрузить имена всех пользователей, которые логинелись на ПК под своими доменными записями, стандартные учетки мне без надобности. На основании статьи статьи мне нужны учетки с sid S -1.5-домен-512 и 513.
Выгружая параметр ProfileImagePath мы получаем путь к файлу профиля, а имя профиля в свою очередь и будет именем доменной утечки из под которой входили на ПК.
Т.к. Пользователей может быть несколько то мне нужно чтобы выгружались все по маске.

Iska 18-02-2016 16:53 2607578

Цитата:

Цитата 8ash8
мне нужно выгрузить имена всех пользователей, которые логинелись на ПК под своими доменными записями »

Ага, теперь ясно.

Цитата:

Цитата 8ash8
а имя профиля в свою очередь и будет именем доменной утечки из под которой входили на ПК. »

А вот чёрта-с-два. Нет такого соответствия в принципе. Можете очень лихо «наколоться» с этим. По умолчанию имя каталога задаётся на основе NETBIOS-имени (помнится) учётной записи, но не более.

Получайте только SID'ы, а затем по ним делайте запрос к контроллеру на разрешение SID'а в какое-нибудь из потребных имён учётной записи.

8ash8 19-02-2016 10:16 2607790

Цитата:

Цитата Iska
А вот чёрта-с-два. Нет такого соответствия в принципе. Можете очень лихо «наколоться» с этим. По умолчанию имя каталога задаётся на основе NETBIOS-имени (помнится) учётной записи, но не более.

Получайте только SID'ы, а затем по ним делайте запрос к контроллеру на разрешение SID'а в какое-нибудь из потребных имён учётной записи.

Я так понимаю Вы предлагаете, выгрузить SIDы из реестра, а потом через запрос к контролеру преобразовать их в имена?
Вот только при обращении к контроллеру по средством wmic необходимо порядка 2,5 часов (порядка 100к записей), чтобы запрос отработал, что не приемлемо по времени ((.
Можно конечно попробовать выгружать записи с контролера в файл к примеру раз в неделю и уже сверяться с ним, но тогда вопрос в каком формате лучше выгружать, чтобы скрипт быстрее отрабатывал?

Elven 19-02-2016 10:40 2607803

8ash8, на wmic свет клином не сошелся. Зачем городить велосипед на костылях если есть давно придуманный (и, кстати, уже упоминавшийся) dsquery?

Iska 19-02-2016 10:43 2607805

Цитата:

Цитата 8ash8
Я так понимаю Вы предлагаете, выгрузить SIDы из реестра, а потом через запрос к контролеру преобразовать их в имена? »

Да. Иначе есть ненулевая вероятность получить не то, что планировалось.

Цитата:

Цитата 8ash8
Вот только при обращении к контроллеру по средством wmic необходимо порядка 2,5 часов (порядка 100к записей), »

Я уже сказал — для этого пробуйте утилиты/скрипты, работающие напрямую через ADSI.


Время: 19:24.

Время: 19:24.
© OSzone.net 2001-