Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Работа с циклом

Ответить
Настройки темы
CMD/BAT - [решено] Работа с циклом

Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всем доброго времени суток!

Господа, в продолжении темы http://forum.oszone.net/thread-349049.html.

Навоял вот такую штуку, но она не спешит работать, подскажите пожалуйста, где косяк? Все наверняка очень плохо, и проблемы с синтаксисом.
Идея заключается в том чтобы забирать из текстового файла IP адреса, и подставлять их в цикл, для автоматического удаленного заведения пользователей сразу на нескольких удаленных ПК.

Код: Выделить весь код
echo off

echo Введите имя пользователя
set /p username=
 
echo Введите пароль
set /p password=

echo Введите имя нового пользователя
set /p newuser=

echo Введите пароль нового пользователя
set /p newpass=

rem количество переменных (ip) считывается из файла
for /f "usebackq" %%S in (`find /c /v ""^<"ip.txt"`) do (set /a NumStr=%%S)

rem забирает в переменную ipinfile значение из файла IP.txt

:M2
if [NOT] NumStr = 0 goto M0
goto M1
:M0
for /f "skip=%NumStr% - 1" %%A IN ("IP.txt") do (set "ipinfile=%%~A"&&goto:M3)
:M3
set /a NumStr = NumStr - 1

wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net user %newuser% /add"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net user %newuser% %newpass%"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net localgroup Администраторы %newuser% /add"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net localgroup Administrators %newuser% /add"

goto M2
:M1
pause

Отправлено: 08:45, 25-06-2021

 

Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Nilf, чем больше вы будете усложнять код и себе работу тем больше у вас будет проблем и непонимания
зачем вот это
Цитата Nilf:
echo Введите имя пользователя
set /p username=
echo Введите пароль
set /p password=
echo Введите имя нового пользователя
set /p newuser=
echo Введите пароль нового пользователя
set /p newpass= »
если есть какой-то мифический "IP.txt". Почему мифический - никто его не видел, что в нем, как это там записано чтобы проверить правильно ли вы считываете из него информацию. О его необходимости выше сказал, что-то одно только нужно, код делается для автоматизации и упрощения работы, это не должен быть комбайн со стразами.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:01, 25-06-2021 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Elven

Ветеран


Сообщения: 992
Благодарности: 268

Профиль | Сайт | Отправить PM | Цитировать


Ядрёны поммидоры, а зачем goto? И зачем перебирать файл с ip для выяснения количества оных, если все равно используются все?
Особо доставило вот это вот:
Код: Выделить весь код
for /f "skip=%NumStr% - 1" %%A IN ("IP.txt") do (set "ipinfile=%%~A"&&goto:M3)
:M3
set /a NumStr = NumStr - 1
Т.е. выяснить количество IP, перебирать файл с ними каждый раз ПОЛНОСТЬЮ но брать только одно значение и уменьшать в следующий раз количество пропускаемых строк, а последующие итерации обламываются безусловным переходом.
Это я, извините, на эмоциях написал, но оно - правда. Теперь собственно к делу, из скрипта удаляем к лешему начиная с rem количество переменных (ip) считывается из файла
до pause, оставляем только это:
Код: Выделить весь код
for /f %%A IN ("IP.txt") do (
set "ipinfile=%%~A"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net user %newuser% /add"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net user %newuser% %newpass%"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net localgroup Администраторы %newuser% /add"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net localgroup Administrators %newuser% /add"
)
ну и комментарии по желанию можно оставить.
Протестить негде, но вроде как если всё остальное в порядке - должно работать.

еще один момент, вот это
Код: Выделить весь код
set "ipinfile=%%~A"
тоже является лишним, т.к. можно %%~A подставлять прямо в строчки с wmic, но это уже на усмотрение ТСа.

alpap, согласен. Судя по тому что ТС пытается сделать - у него одноранговая сеть с одинаковой учеткой с правами администратора на хостах, но я откровенно устал писать что запуск подобной, эмммм... автоматизации в одноранговой сети штука довольно спорная и геморная, если так уж хочется выстрелить себе в ногу - кто я такой чтобы мешать? В конце концов сами мы тоже когда-то по граблям ходили, однако помочь с мягкими насадками на рукоять - в наших силах.

Ну и насчет насадок на грабли: есть такая хорошая и полезная штука как ansible - с ней возня в одноранговой сети (если уж нет возможности AD) становится чуть менее болезненной.

Последний раз редактировалось Elven, 25-06-2021 в 11:18.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:12, 25-06-2021 | #3


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


непонятно видимо?
Если собираетесь считывать информацию из файла, то только там и должна быть вся информация, причем в таком примерно виде
Код: Выделить весь код
192.168.31.2,Vasya,12345
192.168.31.5,Petya,67890
...
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:15, 25-06-2021 | #4


Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ок. Понял.

Пример файла IP.txt:

192.168.31.1
192.168.31.2
192.168.31.3
192.168.31.4
....

Т.е. происходит банальное перечисление IP адресов на которые нужно отправить команду о добавлении нового пользователя. одна строка - один IP. Идея была такова что считается количество строк из файла, это значение подставляется в цикл, и по итог когда это значение придет к нулю (т.е. закончиться перебор всех строк) исполнение файла заканчивается.

Цитата:
Nilf, чем больше вы будете усложнять код и себе работу тем больше у вас будет проблем и непонимания
зачем вот это
Цитата Nilf:
echo Введите имя пользователя
set /p username=
echo Введите пароль
set /p password=
echo Введите имя нового пользователя
set /p newuser=
echo Введите пароль нового пользователя
set /p newpass= »
Касаемо этого, мне необходимо задавать логин и пароль нового пользователя, плюс логин и пароль пользователя-администратора, под которым будет запускаться скрипт на удаленном ПК.

Отправлено: 11:27, 25-06-2021 | #5


Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Elven:
ansible »
Спасибо за разъяснение, будем попробовать. А по поводу того чтобы юзать сторонний софт, к сожалению не получиться, есть такое ограничений что только встроенными в ОС средствами.

Цитата:
непонятно видимо?
Если собираетесь считывать информацию из файла, то только там и должна быть вся информация, причем в таком примерно виде
Код:Выделить весь код
192.168.31.2,Vasya,12345
192.168.31.5,Petya,67890
...
У меня там только IP было.

Отправлено: 12:03, 25-06-2021 | #6


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата Nilf:
закончиться перебор всех строк »
не нужно этого, цикл и так прекратится
Цитата Nilf:
перечисление IP адресов на которые нужно отправить команду о добавлении нового пользователя. одна строка - один IP »
ха, а если на одну машину надо несколько пользователей, я не просто так предложил свой вариант txt, например так может ведь быть?
Код: Выделить весь код
192.168.31.1,Vasya,1234
192.168.31.1,Petya,5678
192.168.31.1,Olya,4321
192.168.31.2,Oleg,A1B1C1
но это все подойдет только если пользователи создаются одинаковые
иначе надо составлять файл примерно так:
Код: Выделить весь код
Vasya,1234,192.168.31.1,net user UserNew1
Petya,5678,192.168.31.1,net user UserNew2 3476
Olya,4321,192.168.31.1,net localgroup Администраторы UserN
Oleg,A1B1C1,192.168.31.2,net localgroup Administrators NewUser2
тогда код будет выглядеть довольно просто:
Код: Выделить весь код
@echo off
for /f "usebackq tokens=1-3* delims=," %%a in ("IP.txt") do (
  wmic /user:"%%~a" /password:"%%~b" /node:"%%~c" process call create "cmd /c %%~d /add"
)
pause

Последний раз редактировалось alpap, 25-06-2021 в 12:48.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:27, 25-06-2021 | #7


Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата alpap:
Цитата Nilf:
перечисление IP адресов на которые нужно отправить команду о добавлении нового пользователя. одна строка - один IP »
ха, а если на одну машину надо несколько пользователей, я не просто так предложил свой вариант txt, например так может ведь быть? »
Да, действительно, так куда удобнее получиться в таком случае, спасибо!

Отправлено: 13:17, 25-06-2021 | #8


Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Elven:
еперь собственно к делу, из скрипта удаляем к лешему начиная с rem количество переменных (ip) считывается из файла
до pause, оставляем только это:
Код:
for /f %%A IN ("IP.txt") do (
set "ipinfile=%%~A"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net user %newuser% /add"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net user %newuser% %newpass%"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net localgroup Администраторы %newuser% /add"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net localgroup Administrators %newuser% /add"
)
ну и комментарии по желанию можно оставить.
Протестить негде, но вроде как если всё остальное в порядке - должно работать. »
Ошибка получается: "Учетные данные пользователя не могут быть использованы для местных подключений."
Видимо если в такой последовательности, то получается что скрипт не стучится по заданному адресу, а пытается выполниться на локальном компе.

Отправлено: 15:14, 25-06-2021 | #9


Аватара для Elven

Ветеран


Сообщения: 992
Благодарности: 268

Профиль | Сайт | Отправить PM | Цитировать


у меня нет под рукой cmd чтобы проверить наверняка. больше всего похоже на какие-то грабли с переменной/переменными.
для проверки значения можно вывести все используемые переменные, например так:
Код: Выделить весь код
echo ipinfile = %ipinfile%
echo username = %username%
ну и так далее.
но скорей всего дело в set, вроде бы в нем кавычки не нужны, т.е.
Код: Выделить весь код
set ipinfile=%%~A

Отправлено: 15:24, 25-06-2021 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Работа с циклом

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Циклом выполнить GET curl mulrus Скриптовые языки администрирования Windows 3 07-08-2018 18:15
CMD/BAT - Работа с циклом в BAT файле mforim Скриптовые языки администрирования Windows 1 31-12-2017 18:32
CMD/BAT - [решено] Помогите разобраться с циклом Andrei_IW Скриптовые языки администрирования Windows 9 11-07-2016 10:09
PowerShell - Проблема с циклом tuguror Скриптовые языки администрирования Windows 8 19-09-2015 17:39
Нужна помощь: Не могу справится с циклом killer.bin AutoIt 1 09-06-2009 14:42




 
Переход