1

Тема: CMD/BAT: Удалённое создание задания в шедулере

Коллеги, приветствую !
Есть следующая задача, в решении пакетником затрудняюсь, может быть кому-нибудь не составит труда, буду очень благодарен... 
вообщем задача в следующем:
1) в локальной сети может быть до 99 компов однотипного наименования с числовым индексом. (например host01, host02, host03....   host99)
2) Нужно по сети в назначенные задания каждому компу (который ответил на пинг) добавить задачу (при её отсутствии) , и нужно чтобы это задание было поставлено на событие "при загрузке компьютера" и запускалось от определённой учётки (от локального администратора)

для примера можно указать запуск Notepad.exe
Заранее благодарен.

Времени не хватает... :-(

2 (изменено: hvs, 2011-02-25 20:55:47)

Re: CMD/BAT: Удалённое создание задания в шедулере

Ну тогда что то вроде этого

set taskname=task1
for /L %%i in (1,1,99) do (
  rem Пингуем комп
  ping host% -n 1
  rem если не откликнулся (код ошибки 1, переходим на следующую итерацию)
  if %errorlevel% 1 goto :nextstep
  rem сбрасываем код ошибки
  cd .
  rem получаем список заданий на удаленном компе 
  rem и ищем в списке имя нужного задания
  schtasks -query -s \\host%%i  -u localadminname -p localadminpassword |find /i "%taskname%"

  rem если такое имя не найдено программой find (код ошибки 1), переходим к созданию 
  if %errorlevel% 1 goto :createtask
  goto :nextstep

  :createtask
  rem создаем задание
  rem localadminname = имя локального админа
  rem localadminpassword = пароль локального админа
  rem onstart = запускать при старте компа
  rem notepad = notepad.exe
  rem 
  schtasks -create -s host%%i -u localadminname p localadminpassword -ru localadminname -rp localadminpassword -tn %taskname% -sc onstart -tr notepad
  :nextstep
  cd .
)

Пишу на скорую руку по памяти с работы, могу ошибиться в расстановке ключей, если что-то непонятно или есть желание "привести к божескому виду" (через переменные, "красивые циклы и условные опреатор") - милости прошу, спрашивайте, поправлю и объясню.

3 (изменено: Евген, 2011-02-25 21:31:23)

Re: CMD/BAT: Удалённое создание задания в шедулере

2 hvs Спасибо что откликнулись !
Заранее благодарен !
Проверить смогу только в понедельник, если чего - обязательно отпишусь...
Сразу же вопрос, расшифруйте плиз эти цифры в коде (вторая строчка)

(1,1,99)

полагаю что (шаг, начальное значение, конечное значение). Может быть только последовательность первых двух я попутал....
ещё...  забыл такое...  у нас много офисов, и под значением host в названии компьютеров могут быть разные буквы.
Например irbh, irsh, nefh, regh...    т.е. это бы в начале как-то предусмотреть (если есть возможность) чтобы само брало из названия компа первые 4 символа, или устроил бы вариант в ручную в переменной указывать первые 4 символа...

Времени не хватает... :-(

4 (изменено: hvs, 2011-02-28 15:43:31)

Re: CMD/BAT: Удалённое создание задания в шедулере

2 Евген

полагаю что (шаг, начальное значение, конечное значение)

Точнее, "начало,шаг,конец"

ещё...  забыл такое...  у нас много офисов, и под значением host в названии компьютеров могут быть разные буквы.
Например irbh, irsh, nefh, regh...    т.е. это бы в начале как-то предусмотреть (если есть возможность) чтобы само брало из названия компа первые 4 символа, или устроил бы вариант в ручную в переменной указывать первые 4 символа...

Однозначного решения просто не будет, точнее, в таком случае лучше использовать конструкцию цикла for в которой список не вчисляется, а просто перечисляется в скобках. Разумеется, при таком формате ключ /L уже не используется. Выглядеть будет примерно так:

for %%i in (remotehost1 remotehost2 nearhost1 nearhost2 localserver1 localserver2) do (
  rem Все остальные операторы без изменений

)

Либо можно внести список серверов в отдельный файл и считывать в цикле  for построчно имена компьютеров (серверов или рабочих станций - уже не важно). В это случае необходимо использовать конструкцию for /F.

Допустим, в корне диска D: у Вас есть файл  с именем hosts.lst - простой текстовый файл, где на каждой строке указано только одно имя обрабатываемого хоста, например:

srv1
srv2
srv3
remotesrv1
remotesrv2
remotesrv3
localsrv1
localsrv2
localsrv3
dc1
dc2
dc3
sql1
sql2
sql3
sccm1
sccm2
sccm3

Теперь конструкция цикла будет выглядеть вот так

for /F %%i in (d:\hosts.lst) do (
  rem Все остальные операторы без изменений

)

В этом случае цикл прост считывает построчно имена хостов из указанного файла и, присваивает занчение переменной %%i и выполняет с ними теже самые действия. что и первоначальном варианте.


PS
Я все хотел поинтересоваться, зачем Вам нужен такой непростой вариант с использованием сценариев? Вы не используете  Active direcotry? Если используете, в ней все будет реализовываться гораздо проще и безопасней (пароли то в в сценарии придется вводить прямо в текст самого сценария прямым текстом или заморачиваться со считыванием их из другого файла.)

5 (изменено: Евген, 2011-02-28 18:23:00)

Re: CMD/BAT: Удалённое создание задания в шедулере

hvs пишет:

PS
Я все хотел поинтересоваться, зачем Вам нужен такой непростой вариант с использованием сценариев? Вы не используете  Active direcotry? Если используете, в ней все будет реализовываться гораздо проще и безопасней (пароли то в в сценарии придется вводить прямо в текст самого сценария прямым текстом или заморачиваться со считыванием их из другого файла.)

я так понимаю что у нашего управления политические разногласия с отделом сисадминов, поэтому всё делаем через ...опу
Был и удобнее вариант...  через SCCM агента толкнуть нужное задание, но...   политические разногласия делают своё дело...:rolleyes:

Времени не хватает... :-(

6

Re: CMD/BAT: Удалённое создание задания в шедулере

Понятно.
Как у Вас с проверкой сценария? Если что-то не так - "пишите и обрящите":D. В крайнем случае можно будет и вариант со считыванием пароля (паролей) из другого файла реализовать (примитивненько, но можно).

7

Re: CMD/BAT: Удалённое создание задания в шедулере

hvs пишет:

Как у Вас с проверкой сценария?

Наверное всё-таки для большего удобства реализую на vbs а schtasks через wshshell запущу...
Вам ,конечно, большущее спасибо что откликнулись !

Времени не хватает... :-(

8

Re: CMD/BAT: Удалённое создание задания в шедулере

Рад, что хоть в чем-то помог.

9

Re: CMD/BAT: Удалённое создание задания в шедулере

Коллеги, вот на какие грабли наткнулся...

задание-то удаляется после выполнения...  :-(  какой ключ надо добавить к schtasks чтобы не удалялось и выполнялось только при включении компа ?

Времени не хватает... :-(

10

Re: CMD/BAT: Удалённое создание задания в шедулере

Решение есть....
в конце запланированного задания добавил прописывание самого себя в назначенные задания снова.
Таким образом задание будет выполняться снова и снова...  типа рекурсивный вызов...

Времени не хватает... :-(

11 (изменено: Евген, 2011-03-04 14:00:37)

Re: CMD/BAT: Удалённое создание задания в шедулере

Надо же ведь сколько граблей встречается в достаточно простом задании...

по факту встретился со следующим:
1) пользователи использовали "спящий" режим - отключил

powercfg.exe /h off

2) после отключения "спящего" режима пользователи по ошибке отправляли комп в "ждущий режим" - отключил

Set WshShell=CreateObject ("WScript.Shell")
Dim MaskBytes(4)
Dim TwoMaskBytes(2)
MaskBytes(0) = &H04
MaskBytes(1) = &H00
MaskBytes(2) = &H00
MaskBytes(3) = &H00
MaskStr = "" 
For Each MaskByte in MaskBytes 
strByte = right( "00" & hex(MaskByte), 2 ) 
MaskStr = strByte & MaskStr 
Next 
WSHShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ACPI\Parameters\AMLIMaxCTObjs",CLng("&H" & MaskStr), "REG_BINARY" 

WshShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ACPI\Parameters\Attributes",112,"REG_DWORD"

TwoMaskBytes(0) = &H20
TwoMaskBytes(1) = &H05
MaskStr = "" 
For Each MaskByte in TwoMaskBytes 
strByte = right( "00" & hex(MaskByte), 2 ) 
MaskStr = strByte & MaskStr 
Next 
WshShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ACPI\Parameters\WakeUp\FixedEventMask",CLng("&H" & MaskStr),"REG_BINARY" 


TwoMaskBytes(0) = &H00
TwoMaskBytes(1) = &H84
MaskStr = "" 
For Each MaskByte in TwoMaskBytes 
strByte = right( "00" & hex(MaskByte), 2 ) 
MaskStr = strByte & MaskStr 
Next 
WshShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ACPI\Parameters\WakeUp\FixedEventStatus",CLng("&H" & MaskStr),"REG_BINARY" 

MaskBytes(0) = &H18
MaskBytes(1) = &H50
MaskBytes(2) = &H00
MaskBytes(3) = &H10
MaskStr = "" 
For Each MaskByte in MaskBytes 
strByte = right( "00" & hex(MaskByte), 2 ) 
MaskStr = strByte & MaskStr 
Next 
WSHShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ACPI\Parameters\WakeUp\GenericEventMask",CLng("&H" & MaskStr), "REG_BINARY" 


MaskBytes(0) = &H10
MaskBytes(1) = &H00
MaskBytes(2) = &HFF
MaskBytes(3) = &H00 
MaskStr = "" 
For Each MaskByte in MaskBytes 
strByte = right( "00" & hex(MaskByte), 2 ) 
MaskStr = strByte & MaskStr 
Next 
WSHShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ACPI\Parameters\WakeUp\GenericEventStatus",CLng("&H" & MaskStr), "REG_BINARY"

3) после отключения использования "ждущего" режима, оказалось что некоторые пользователи просто вообще забывали выключить комп - всем в шедулер поставил shutdown -s -t 0 -f на 22:00

вот сейчас нормально стало срабатывать событие ONSTART в шедулере...

Времени не хватает... :-(

12 (изменено: jite, 2011-03-05 01:05:21)

Re: CMD/BAT: Удалённое создание задания в шедулере

после отключения "спящего" режима пользователи по ошибке отправляли комп в "ждущий режим"...

Это под какую ОС такие хитрые правки реестра?

Под Win7, то для отключения какого либо сна можно сделать все через powercfg - утилиту с довольно мерзким синтаксисом, о котором впрочем можно забыть, если мы будем использовать пакетники, а мы будем...
1) Ручками настраиваем Сбалансированный режим (например): отключаем всякие виды сна, да и вообще, настраиваем как хотим.
2) Сохраняем конфигурацию (обратите внимание, что этой утилите недостаточно просто имени файла - еще хочет конкретный путь, на мой взгляд это просто придурь авторов, но что сделаешь).

POWERCFG -export %cd%\sleep_off.cfg 381b4222-f694-41f0-9685-ff5bb260df2e

3) На этом подготовительная часть завершена. На всех прочих машинах обеспечиваем локальное присутствие сохраненного sleep_off.cfg рядом с пакетником следующего содержания:

rem Set off HIBERNATE mode
POWERCFG -H OFF

rem guid for "Balanced" plan
set GUID=381b4222-f694-41f0-9685-ff5bb260df2e

rem guid for "High efficiency" plan
set tmp_GUID=8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c

rem Set Balanced inactive
POWERCFG -s %tmp_GUID%

rem delete Balanced
POWERCFG -DELETE %GUID%

rem Import saved Balanced
POWERCFG -import "%cd%\sleep_off.cfg" %GUID%

rem set Balanced active
POWERCFG -s %GUID%

Смысл состоит в том, чтобы переключить режим на отличный от Сбалансированного для того чтобы удалить последний, затем импортировать сохраненный ранее вариант и снова сделать активным.
Запускаем пакетный - и больше комп спать не будет.
Примечание: пакетный файл  не срабатывает при запуске с сетевого диска - по причине странного поведения powercfg в части чтения нелокальных файлов.

13 (изменено: Евген, 2011-03-05 10:57:46)

Re: CMD/BAT: Удалённое создание задания в шедулере

jite пишет:

Это под какую ОС такие хитрые правки реестра?

Это отключение использования "ждущего" режима для трижды краснознаменной корпоративной хрюшки...   :-)

Времени не хватает... :-(