KeyWeb
51111111111Rating 5.00 (1 Vote)
Возникла задача, быстро распространить исполняемый файл по сети. В сети работают Windows машины, при этом условия были следующие
  • Не использовать GPO
  • Записать файл в определенное место в системе
  • Записать путь к файлу в реестре (автозапуск)
Заранее скажу, что ранее все действия производились администраторами в ручную, выполнить действия на 2 - 3 машины руками, конечно можно, но когда их становится например 20 или 200... Мне проще работать с VBS'криптами, они чуствуют себя в среде Windows просто прекрасно, легко имплементируются и т.п., PowerShell для данной задачи слишком "тяжел" на мой взгляд, короче VBS и WMI, это мои варианты :)

Скрипт на установку файла в системе

Скрипт установщик, который доставляется на целевую машину другим скриптом, его задача - запись в реестр информации о файле, в первой версии скрипта он так же копировал файл на целевую машину, но позже эта функция была выпилена (идет как комментированная строка в скрипте) и добавлена в скрипт, который инициализирует процесс запуска. Назовем скрипт inst.vbs.
On error resume next
Dim objFSO
Const HKEY_LOCAL_MACHINE = &H80000002
Const strLocalFolder="C:\Program\Folder\", strProgramTmpFolder="C:\Program\Folder\Tmp\", strNetworkFile="\\Server\Share$\Program.exe"

Const Overwrite = True

strComputer = "."

Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")

If Not objFSO.FolderExists(strLocalFolder) Then
	objFSO.CreateFolder strLocalFolder
End If

If Not objFSO.FolderExists(strProgramTmpFolder) Then
	objFSO.CreateFolder strProgramTmpFolder
End If

'objFSO.CopyFile strNetworkFile, strLocalFolder, Overwrite

'Work with REgistry
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _  
    strComputer & "\root\default:StdRegProv") 
	

strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" 
strValueName = "Program" 
strValue = "C:\Program\Folder\Program.exe" 
oReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue 

  

Скрипт инициализатор

Для серийной обработки компьютеров, был создан файл computers.txt, который размещается в каталоге вместе со скриптом, содержимео файла должно выглядеть так:
comp1
comp2
comp3
compN
Далее загружаем PsExec, размещаем в папке со скриптом, пишем скрипт, который разместит inst.vbs и запустит его на удаленной машине. Назовем скрипт start.vbs:
Dim fso
scriptDir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)
fileName = scriptDir + "\computers.txt"
installScript = scriptDir + "\inst.vbs"
strNetworkFile="\\Server\Share$\Program.exe"
exec = scriptDir + "\PsExec.exe"

Const Overwrite = True

Set objShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(filename)

Do Until f.AtEndOfStream
   
  computer = "\\" + f.ReadLine
  path = computer + "\c$\Program\Folder\"
  fullpath = "c:\Program\Folder\inst.vbs"

  If Not fso.FolderExists(computer & "\c$\Program\Folder") Then  
    fso.CreateFolder computer & "\$\Program\Folder"
  End If
  
  fso.CopyFile installScript, path, Overwrite
  objShell.Run "cmd.exe /c " & exec & " -s -d " & computer & " cscript.exe /nologo " & fullpath
  
  fso.CopyFile strNetworkFile, computer & path, Overwrite
  
  WScript.Echo "Done! " & computer
  
Loop

f.Close

 Запуск VBScript в командной строке

Запускаем наш start.vbs в командной строке запущенной от имени администратора (который имеет привилигерованный доступ на удаленные машины), переходим в папку со скриптом используя команду cd, выполняем команду:

cscript start.vbs

 Проверка запущенной задачи на удаленных машинах

После установки программы, можно либо перезагрузить удаленные машины, либо запустить программу так же удаленно, у кого на что хватит фантазии. Как бы там ни было, в будущем необходимо проверять, запущенна ли программа на удаленных машинах или нет. Для этой цели будет использоваться WMI (если проверять руками, то можно использовать консольную утилиту tasklist). Для проверки создаем скрипт, в котором указываем имя программы, подключаем к нему лист с компьютерами (в процессе создания скрипта мне помог пост со StackOverflow), создаем скрипт, размещаем его в папке с остальными скриптами. Код будет следующим:
processname = "Program.exe"
query = "SELECT * FROM Win32_Process WHERE Name='" & processname & "'"

Set fso = CreateObject("Scripting.FileSystemObject")
scriptDir = fso.GetParentFolderName(WScript.ScriptFullName)

fileName = scriptDir + "\computers.txt"
Set f = fso.OpenTextFile(fileName)

Do Until f.AtEndOfStream

  skipServer = False
  server = f.ReadLine

  On Error Resume Next
  Set wmi = GetObject("winmgmts://" & server &"/root/cimv2")
  If Err Then
	WScript.Echo "Error " & Err.Number & " connecting to " & server & " - " & Err.Description
    On Error Goto 0
    skipServer = True
  End If
  On Error Goto 0

  If Not skipServer Then
    found = "not "
    For Each process in wmi.ExecQuery(query)
      found = ""
      Exit For
    Next

    WScript.Echo processname & " " & found & "running on " & server & "."
  End If
Loop

f.Close
  
 В итоге вывод будет следующим:

cscript tasklist.vbs
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.

Error 462 connecting to comp1 - The remote server machine does not exist or is unavailable
Program.exe running on comp2.
Error 462 connecting to comp3 - The remote server machine does not exist or is unavailable
Program.exe running on comp4.
Program.exe running on comp5.
Program.exe running on comp6.

Итог

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

Добавить комментарий


Обновить
Защитный код

KeyWeb

Сейчас один гость и ни одного зарегистрированного пользователя на сайте

Вверх
Вниз