Войти

Показать полную графическую версию : Поиск слова в строке из реестра


Страниц : [1] 2

Сиволапый
22-03-2017, 14:08
Доброго времени суток всем. Есть скрипт:
echo on
cls
for /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName ^| find "ProductName"') do set ProductName=%%b


if "%ProductName%" == "Windows Server 2008 R2 Datacenter" goto noconfig
if "%ProductName%" == "Windows Server 2008 R2 Enterprice" goto noconfig
if "%ProductName%" == "Windows Server 2008 R2 Standart" goto noconfig
if "%ProductName%" == "Microsoft Windows Server 2003" goto noconfig
if "%ProductName%" == "Microsoft Windows XP" goto config
if "%ProductName%" == "Windows 7 Ultimate" goto config
if "%ProductName%" == "Windows 7 Enterprise" goto config
if "%ProductName%" == "Windows 7 Professional" goto config
if "%ProductName%" == "Windows 7 Home Premium" goto config
if "%ProductName%" == "Windows 7 Home Basic" goto config
if "%ProductName%" == "Windows 7 Starter" goto config



:noconfig
echo Config do not need
@pause
exit

:config
@echo AutoConfiguration Lan DHCP Script
echo config work
@pause

Помогите пожалуйста сделать так, чтоб он не сверял всю строку целиком, а проверял только часть строки и если в ней есть слово Server, уходил в noconfig, а если нет такого слова, то в config. Это будет скрипт автоматической установки, но только на клиентские машины а не на сервера.
Части конфиг и но конфиг пока тестовые, для проверки работы первого условия :)

P.S. Совсем не силен в программировании, по возможности, не кидайтесь помидорами :)

Заранее спасибо.

Elven
22-03-2017, 14:35
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | find "ProductName" | findstr /i server && echo noconfig ||echo config

greg zakharov
22-03-2017, 14:53
Не проще ли вообще брать данные из HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions (значение ProductType)? Там возвожны только три значения: WinNT, LanmanNT и Server.

Сиволапый
23-03-2017, 06:59
greg zakharov,
Спасибо за подсказку. При таком раскладе подойдет и уже существующий, работающий скрипт :)

Elven,
Это работает, он правильно определяет и выдает config\noconfig. Только теперь у меня проблемы с тем, как дальше сказать скрипту уходить в шаг :config или :noconfig... Если слово сервер найдено, то переменной надо присвоить значение сервер, если нет, то например 1 и в соответствии со значением переменной идти в следующий шаг. Вот только реализовать это в коде у меня не получается... Пните ещё немного дальше?

Iska
23-03-2017, 08:58
Только теперь у меня проблемы с тем, как дальше сказать скрипту уходить в шаг :config или :noconfig... »
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | find "ProductName" | findstr /i server && (
rem Здесь код для noconfig

) || (
rem Здесь код для config

)
и не надо ничего никому присваивать и никуда ходить.

Но, если очень уж хочется — используйте call :Метка или goto :Метка.
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | find "ProductName" | findstr /i server && call :noconfig || call :config

Сиволапый
24-03-2017, 08:08
А не могли бы Вы обьяснить логику работы? :) Оно работает, но не могу понять как :)
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | find "ProductName" | findstr /i server - выполняется вот эта часть кода, допустим слово найдено.
&& - это значит, насколько мне известно, что то что стоит после этого, будет выполняться только если успешно выполнилось то, что стоит перед этим.
call :noconfig || call :config - дальше идет это, т.е. :конфиг будет выполняться только тогда, когда :ноконфиг выполниться не смог...
А как машина понимает, когда ей выполнять конфиг а когда ноконфиг? Ведь никаких переменных явно заданных которые бы говорили что если значение такое, делай так, если другое, эдак, нет...

Iska
24-03-2017, 08:43
&& - это значит, насколько мне известно, что то что стоит после этого, будет выполняться только если успешно выполнилось то, что стоит перед этим. »
Нет. «&&» — оператор, который продолжает исполнение команды только в том случае, если предыдущая команда вернула нулевой код возврата (да, обычно это должно обозначать «успешно», «отсутствие ошибок» и т.п., но должно — не значит есть; не всегда и не везде). «||» — противоположный по смыслу оператор: если не нулевой код возврата.

call :noconfig || call :config - дальше идет это, т.е. :конфиг будет выполняться только тогда, когда :ноконфиг выполниться не смог... »
Рассматривайте код так:
ЕСЛИ findstr.exe вернул нулевой код возврата ТО
Вызывать процедуру по метке :noconfig
ИНАЧЕ
Вызывать процедуру по метке :config
КОНЕЦЕСЛИ

Update: Добавлю для ясности. Что тот, что другой код из #5 (http://forum.oszone.net/post-2722317-5.html) можно переписать так:
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | find "ProductName" | findstr /i server
if %errorlevel% equ 0 (
rem Здесь код для noconfig

) else (
rem Здесь код для config

)
Обращаю Ваше внимание, что именно «if %errorlevel% equ 0». Более старый формат в виде «if errorlevel 0» здесь не годится, поскольку означает «код возврата равен или больше 0», старый формат может быть использован в виде «if not errorlevel 1» — «код возврата не (равен или больше 1)».

Сиволапый
24-03-2017, 10:08
Iska,
Спасибо

Сиволапый
27-03-2017, 08:41
В общем у меня получился вот такой вариант:
echo on
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | find "ProductName" | findstr /i server && call :noconfig || call :config



:noconfig
echo Config do not need
exit

:config
@ECHO ON
set dir=%\\172.16.10.12\PolicyInstall\
@cls
@ECHO ON

@If exist "%programfiles%/TightVNC" (
@echo Done!

) else (

@If exist "%programfiles(x86)%" (
@echo Installing: TightVNC x 64


@"%dir%tightvnc-2.8.5-gpl-setup-64bit.msi" /quiet
) else (

@echo Installing: TightVNC x 32
@"%dir%tightvnc-2.8.5-gpl-setup-32bit.msi" /quiet
)
reg.exe import "%dir%vncsrv.reg"
net stop "TightVNC Server" && net start "TightVNC Server"
@echo Done!
)
exit

Всё отлично, работает. Все ставится через GPO политики компьютера (т.к. не у всех пользователей есть админские права). Но на ХР не ставится. Где то прочитал, что в ХР сетевая установка не будет работать (хотя если руками запускать, то все ставится)... Переделал по другому, чтоб для ХР установщик копировался и запускался с диска:

@echo on
@for /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName ^| find "ProductName"') do set ProductName=%%b
@reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | find "ProductName" | findstr /i server && call :noconfig || call :config



:noconfig
@echo Config do not need
@exit

:config
@ECHO ON
@If exist "%programfiles%/TightVNC" (
@echo Done!
@pause
@exit
)

@set dir=%\\172.16.10.12\PolicyInstall\

@If "%ProductName%" == "Microsoft Windows XP" (
@echo Installing: TightVNC x 32
@xcopy "%dir%*.msi*" "%temp%/*.msi" /q /y /c
@"%temp%/tightvnc-2.8.5-gpl-setup-32bit.msi" /quiet
reg.exe import "%dir%vncsrv.reg"
net stop "TightVNC Server" && net start "TightVNC Server"
@echo Done!
@pause
@exit
)

@If exist "%programfiles(x86)%" (
@echo Installing: TightVNC x 64
@"%dir%tightvnc-2.8.5-gpl-setup-64bit.msi" /quiet
)
(
@echo Installing: TightVNC x 32
@"%dir%tightvnc-2.8.5-gpl-setup-32bit.msi" /quiet
)
reg.exe import "%dir%vncsrv.reg"
net stop "TightVNC Server" && net start "TightVNC Server"
@echo Done!
)
@pause
exit

Немного криво конечно, собрал из двух разных скриптов один :) Если так запускать руками, то тоже работает, на ХР копируется и ставится с диска, на 7 ставится по сети. Но через GPO в ХР опять не работает... Подскажите для ХР нужно делать какой то другой, особенный скрипт?

P.S. Паузы я понавставлял для проверки. В скрипте который на доменном контроллере пауз нету...

Iska
27-03-2017, 09:32
В общем у меня получился вот такой вариант: »
Простите, я не смог понять Вашей логики. Если существует каталог или файл "%ProgramFiles%\TightVNC" — Вы ничего не делаете. Если не существует — Вы проверяете существование каталога или файла "%ProgramFiles(x86)%". Если последний существует — устанавливаете tightvnc-2.8.5-gpl-setup-64bit.msi, иначе устанавливаете tightvnc-2.8.5-gpl-setup-32bit.msi. Для чего % в «set dir=%\\172.16.10.12\PolicyInstall\» я также не понял. Со вторым кодом ещё интереснее.

Не проще ли вместо всего этого просто назначить msi пакеты для установки посредством той же групповой политики, а из файла реестра либо сделать шаблон неуправляемой групповой политики и настроить последнюю, либо же раздавать значения из этого файла реестра предпочтениями групповой политики?

Сиволапый
27-03-2017, 09:50
Простите, я не смог понять Вашей логики. Если существует каталог или файл "%ProgramFiles%\TightVNC" — Вы ничего не делаете. Если не существует — Вы проверяете существование каталога или файла "%ProgramFiles(x86)%". Если последний существует — устанавливаете tightvnc-2.8.5-gpl-setup-64bit.msi, иначе устанавливаете tightvnc-2.8.5-gpl-setup-32bit.msi. Для чего % в «set dir=%\\172.16.10.12\PolicyInstall\» я также не понял. Со вторым кодом ещё интереснее. »

Если папка TightVNC существует, то не надо устанавливать vnc, он уже установлен. Если существует каталог ProgramFiles(x86), это значит что система х64 и устанавливать надо пакет для х64 систем, иначе, устанавливается пакет для х32 систем. Ну а % в сет дир сейчас уже и не вспомню, для чего поставил :)

Не проще ли вместо всего этого просто назначить msi пакеты для установки посредством той же групповой политики, а из файла реестра либо сделать шаблон неуправляемой групповой политики и настроить последнюю, либо же раздавать значения из этого файла реестра предпочтениями групповой политики? »

Средствами групповой политики пробовал, но оно не устанавливалось автоматически, а появлялось в "Программах и компонентах" в разделе "Установка новой программы по сети"... Т.е. устанавливать то нужно было все равно руками. Возможно я что то не то\не там настроил в гпо, навалилась куча других задач, про это на время забылось, потом когда вернулся к этому, почему решил попробовать сделать через бат файл. Вот как то так :)

А не могли бы рассказать подробнее что интересного во втором коде? :) Ну мне просто интересно послушать кого то кто более сведущ в программировании :)

Iska
27-03-2017, 10:14
Если папка TightVNC существует, то не надо устанавливать vnc, он уже установлен. »
С чего бы это он вдруг был установлен?! Наличие или отсутствие папки ничего об этом не говорит. Совершенно.

Если существует каталог ProgramFiles(x86), это значит что система х64 »
Не факт. Совсем не факт. Наличие каталога говорит только о наличии каталога. Не более.

Средствами групповой политики пробовал, но оно не устанавливалось автоматически, а появлялось в "Программах и компонентах" в разделе "Установка новой программы по сети"... Т.е. устанавливать то нужно было все равно руками. Возможно я что то не то\не там настроил в гпо »
Угу. Вы публиковали (publish) пакет для распространения вместо того, чтобы назначать (assign). Попробуйте именно назначать пакеты — тогда будет идти установка в автоматическом режиме.

А не могли бы рассказать подробнее что интересного во втором коде? »
Честно — не хочется.

Сиволапый
29-03-2017, 09:08
Угу. Вы публиковали (publish) пакет для распространения вместо того, чтобы назначать (assign). Попробуйте именно назначать пакеты — тогда будет идти установка в автоматическом режиме. »

Установка через GPO не проходит. В логах пишет что источник установочных пакетов недоступен, хотя он доступен, полностью расшарен... Бат файлом тоже не ставится в ХР, но только в логах совсем ничего не пишет...

Не факт. Совсем не факт. Наличие каталога говорит только о наличии каталога. Не более. »

Не знаю как вам, но мне кажется, что вряд ли пользователи 32 битной версии ОС начнут создавать такую папку специально, чтоб скрипт не работал. Это уже из разряда каких то шпионских романов. Проверять разрядность системы через переменные PROCESSOR_ARCHITECTURE и PROCESSOR_ARCHITEW6432 мне, как НЕ ПРОГРАММИСТУ, показалось слишком большой и сложной конструкцией, хотя не спорю, подобный способ наверно более надежен.

Elven
29-03-2017, 12:21
В логах пишет что источник установочных пакетов недоступен, хотя он доступен, полностью расшарен... Бат файлом тоже не ставится в ХР, но только в логах совсем ничего не пишет... »
А от чьего имени происходит установка в случае развертывания приложения через GPO? Имел аналогичную проблему при развертывании LAPS, однако решил плюнуть на замороки с правами и положил в папку NETLOGON на контроллере. А так вроде нужны разрешения на шаре чтение для DomainComputers или для каждого компа по отдельности (если моя память не спит с другим).

Сиволапый
29-03-2017, 14:00
А от чьего имени происходит установка в случае развертывания приложения через GPO? Имел аналогичную проблему при развертывании LAPS, однако решил плюнуть на замороки с правами и положил в папку NETLOGON на контроллере. А так вроде нужны разрешения на шаре чтение для DomainComputers или для каждого компа по отдельности (если моя память не спит с другим). »

А это идея, надо попробовать :)
А при установке через GPO, не скриптом, домен то не будет разбираться какая версия ОС и какой из двух msi пакетов ставить? Т.е. в данном случае имеет смысл добавлять только установочный пакет для 32 битных систем?

Elven
29-03-2017, 15:20
http://s011.radikal.ru/i316/1703/e7/ecd75a11be91.png

Iska
29-03-2017, 16:46
Установка через GPO не проходит. В логах пишет что источник установочных пакетов недоступен, хотя он доступен, полностью расшарен... »
Ага. Ну, так это же совсем другое дело, нежели то, что было озвучено. В NETLOGON класть, конечно, не надо, но вот это:
нужны разрешения на шаре чтение для DomainComputers »
требуется задавать.

Сиволапый
30-03-2017, 08:31
Да, если дать права компьютерам на шару то всё работает. Ну по крайней мере на ХР ставится... Но данный способ не решает проблемы с установкой на сервера :) В этом случае надо переносить сервера в отдельную оушку какую нибудь. А вообще в домене при введении пк в домен, все компьютеры помещаются в оу Computers, а этот процесс как-то можно регулировать не руками а автоматически, чтоб определенные пк (например сервера) помещались, например, в другую оу сразу при введении в домен?

Сиволапый
30-03-2017, 09:40
Ну и опять же, если установленное приложение через GPO удалить, то снова при перезагрузке оно не поставится, нужно запихивать пк в другое оу, а потом опять перетаскивать обратно. Это тоже нельзя решить средствами GPO?

Elven
30-03-2017, 12:28
А вообще в домене при введении пк в домен, все компьютеры помещаются в оу Computers, а этот процесс как-то можно регулировать не руками а автоматически, чтоб определенные пк (например сервера) помещались, например, в другую оу сразу при введении в домен? »
Это не OU. Поменять можно так (https://obskuroblog.wordpress.com/2016/11/24/%D0%B2%D0%BE%D1%82-%D0%B7%D0%B0%D0%B3%D0%BD%D0%B0%D0%BB%D0%B8-%D0%B2%D1%8B-%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80-%D0%B2-%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD-%D0%B8-%D0%B3%D0%B4%D0%B5/)
Ну и опять же, если установленное приложение через GPO удалить, то снова при перезагрузке оно не поставится, нужно запихивать пк в другое оу, а потом опять перетаскивать обратно. Это тоже нельзя решить средствами GPO? »
Вот здесь вообще не понял, зачем перетаскивать? Просто политику в которой установка софта применить на нужную OU и все. Если нужно применять политику не ко всем компьютерам OU - используйте группы безопасности. Благо с изменениями, если моя память не спит с другим, от мая прошлого года одной махонькой галочки достаточно чтобы применять на все кроме этой самой группы (до этого вроде как можно было сделать только запретом чтения политики).
http://s019.radikal.ru/i619/1703/84/c05b2a7ea4ac.png
А если нужно применять только на одну группу - еще проще.
http://s019.radikal.ru/i615/1703/df/db1ff9d0d894.png




© OSzone.net 2001-2012