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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Поиск слова в строке из реестра (http://forum.oszone.net/showthread.php?t=325127)

Сиволапый 22-03-2017 14:08 2722051

Поиск слова в строке из реестра
 
Доброго времени суток всем. Есть скрипт:
Код:

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 2722060

Код:

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 2722064

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

Сиволапый 23-03-2017 06:59 2722306

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

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

Iska 23-03-2017 08:58 2722317

Цитата:

Цитата Сиволапый
Только теперь у меня проблемы с тем, как дальше сказать скрипту уходить в шаг :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 2722543

А не могли бы Вы обьяснить логику работы? :) Оно работает, но не могу понять как :)
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 2722548

Цитата:

Цитата Сиволапый
&& - это значит, насколько мне известно, что то что стоит после этого, будет выполняться только если успешно выполнилось то, что стоит перед этим. »

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

Цитата:

Цитата Сиволапый
call :noconfig || call :config - дальше идет это, т.е. :конфиг будет выполняться только тогда, когда :ноконфиг выполниться не смог... »

Рассматривайте код так:
Код:

ЕСЛИ findstr.exe вернул нулевой код возврата ТО
    Вызывать процедуру по метке :noconfig
ИНАЧЕ
    Вызывать процедуру по метке :config
КОНЕЦЕСЛИ

Update: Добавлю для ясности. Что тот, что другой код из #5 можно переписать так:
Код:

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 2722569

Iska,
Спасибо

Сиволапый 27-03-2017 08:41 2723303

В общем у меня получился вот такой вариант:
Код:

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 2723313

Цитата:

Цитата Сиволапый
В общем у меня получился вот такой вариант: »

Простите, я не смог понять Вашей логики. Если существует каталог или файл "%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 2723324

Цитата:

Цитата Iska
Простите, я не смог понять Вашей логики. Если существует каталог или файл "%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 систем. Ну а % в сет дир сейчас уже и не вспомню, для чего поставил :)

Цитата:

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

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

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

Iska 27-03-2017 10:14 2723337

Цитата:

Цитата Сиволапый
Если папка TightVNC существует, то не надо устанавливать vnc, он уже установлен. »

С чего бы это он вдруг был установлен?! Наличие или отсутствие папки ничего об этом не говорит. Совершенно.

Цитата:

Цитата Сиволапый
Если существует каталог ProgramFiles(x86), это значит что система х64 »

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

Цитата:

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

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

Цитата:

Цитата Сиволапый
А не могли бы рассказать подробнее что интересного во втором коде? »

Честно — не хочется.

Сиволапый 29-03-2017 09:08 2723954

Цитата:

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

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

Цитата:

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

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

Elven 29-03-2017 12:21 2724030

Цитата:

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

А от чьего имени происходит установка в случае развертывания приложения через GPO? Имел аналогичную проблему при развертывании LAPS, однако решил плюнуть на замороки с правами и положил в папку NETLOGON на контроллере. А так вроде нужны разрешения на шаре чтение для DomainComputers или для каждого компа по отдельности (если моя память не спит с другим).

Сиволапый 29-03-2017 14:00 2724067

Цитата:

Цитата Elven
А от чьего имени происходит установка в случае развертывания приложения через GPO? Имел аналогичную проблему при развертывании LAPS, однако решил плюнуть на замороки с правами и положил в папку NETLOGON на контроллере. А так вроде нужны разрешения на шаре чтение для DomainComputers или для каждого компа по отдельности (если моя память не спит с другим). »

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

Elven 29-03-2017 15:20 2724091


Iska 29-03-2017 16:46 2724113

Цитата:

Цитата Сиволапый
Установка через GPO не проходит. В логах пишет что источник установочных пакетов недоступен, хотя он доступен, полностью расшарен... »

Ага. Ну, так это же совсем другое дело, нежели то, что было озвучено. В NETLOGON класть, конечно, не надо, но вот это:
Цитата:

Цитата Elven
нужны разрешения на шаре чтение для DomainComputers »

требуется задавать.

Сиволапый 30-03-2017 08:31 2724270

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

Сиволапый 30-03-2017 09:40 2724284

Ну и опять же, если установленное приложение через GPO удалить, то снова при перезагрузке оно не поставится, нужно запихивать пк в другое оу, а потом опять перетаскивать обратно. Это тоже нельзя решить средствами GPO?

Elven 30-03-2017 12:28 2724347

Цитата:

Цитата Сиволапый
А вообще в домене при введении пк в домен, все компьютеры помещаются в оу Computers, а этот процесс как-то можно регулировать не руками а автоматически, чтоб определенные пк (например сервера) помещались, например, в другую оу сразу при введении в домен? »

Это не OU. Поменять можно так
Цитата:

Цитата Сиволапый
Ну и опять же, если установленное приложение через GPO удалить, то снова при перезагрузке оно не поставится, нужно запихивать пк в другое оу, а потом опять перетаскивать обратно. Это тоже нельзя решить средствами GPO? »

Вот здесь вообще не понял, зачем перетаскивать? Просто политику в которой установка софта применить на нужную OU и все. Если нужно применять политику не ко всем компьютерам OU - используйте группы безопасности. Благо с изменениями, если моя память не спит с другим, от мая прошлого года одной махонькой галочки достаточно чтобы применять на все кроме этой самой группы (до этого вроде как можно было сделать только запретом чтения политики).

А если нужно применять только на одну группу - еще проще.

Сиволапый 30-03-2017 12:54 2724361

Цитата:

Цитата Elven
Вот здесь вообще не понял, зачем перетаскивать? Просто политику в которой установка софта применить на нужную OU и все. Если нужно применять политику не ко всем компьютерам OU - используйте группы безопасности. Благо с изменениями, если моя память не спит с другим, от мая прошлого года одной махонькой галочки достаточно чтобы применять на все кроме этой самой группы (до этого вроде как можно было сделать только запретом чтения политики).
А если нужно применять только на одну группу - еще проще. »

Нет. Я имею в виду другое. Есть оу, в нем есть пк, политикой на него установился софт. И если пользователь, у которого есть права локального админа (да, есть такие) удалит этот софт, то при следующей перезагрузке софт на пк снова не поставится...

Iska 30-03-2017 13:35 2724370

Сиволапый, у пользователей по определению не должно быть привилегий локальных администраторов. В принципе. Если в Вашем домене такое наличествует — значит, что-то не так в Датском королевстве.

Сиволапый 31-03-2017 07:27 2724576

Iska,
Именно вот такого ответа и ждал :) Но по большей части я с вами согласен.

Ладно, спасибо всем за внимание и помощь! Дальше сам :)


Время: 05:51.

Время: 05:51.
© OSzone.net 2001-