Что нового

[Мозговой штурм] Алгоритм установки

Chang

Новичок
Сообщения
45
Репутация
0
Всем примет. Имеет софтину + файлы настроек под разную архитектуру и разные процессоры.

Задача:
Определить архитектуру -> определить процессор -> установить софт + положить в него файл с нужными настройками -> вывести сообщение об успешной установке.

Реализация при помощи AutoIt:
1. Запускаем скрипт определения разрядности ОС
2. Определив разрядность запускается скрипт с определением типа процессора, лежащий в папке 32 или 64
3. Скрипт определения типа процессора запускает нужный самораспаковывоющийся архив, в котором лежит и софт и готовые настройки :stars:

Проблема:
Софт один и тот же. Пусть распаковки один и тот же. Меняются только файлы с настройками. Софт имеет свойство обновляться и каждый раз архивировать это добро надоедает ((( Хочется больше автоматизации и отчета об установке. Приходится руками лезть и проверять наличие файлов в папке.

Вопрос:
Как бы вы реализовали этот алгоритм установки ? :whistle: (примеры приветствуются) ;)
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
OffTopic:
Chang, это в раздел заказов или покупки\продажи
 
Автор
C

Chang

Новичок
Сообщения
45
Репутация
0
Туда я ещё доберусь :whistle: Пока мне хочется понять, какая правильная последовательность действий и имеет ли смысл кардинально переделывать то, что уже работает )))
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Я бы так сделал:
Код:
FileDelete(@ScriptDir & "\info.txt")
$CMD = "systeminfo > " & @ScriptDir & "\info.txt"
RunWait(@ComSpec & " /c " & $CMD)
$parameters = FileReadToArray(@ScriptDir & "\info.txt")
$cpu = StringSplit($parameters[16], ":", 2)
$type_os = StringSplit($parameters[14], ":", 2)
ConsoleWrite($cpu[1] & @CRLF)
ConsoleWrite($type_os[1] & @CRLF)
If (StringInStr($cpu[1], "AMD64"))<>0 And (StringInStr($type_os[1], "x64"))<>0 Then
	MsgBox(0, "", "Запускаем самораспаковывающийся архив для AMD и 64-разрядной системы")
EndIf
 
Автор
C

Chang

Новичок
Сообщения
45
Репутация
0
hedji, я правильно понимаю, что ты предлагаешь изначально собрать информацию о системе (процессор и разрядность), записать это все в текстовый файл, а зачем на основе этой инфы запускать тот или иной инсталлятор. Верно ?
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Chang сказал(а):
hedji, я правильно понимаю, что ты предлагаешь изначально собрать информацию о системе (процессор и разрядность), записать это все в текстовый файл, а зачем на основе этой инфы запускать тот или иной инсталлятор. Верно ?

Да, все верно.
 
Автор
C

Chang

Новичок
Сообщения
45
Репутация
0
Тогда способ не универсальный. Если все устанавливать с флешки, то тут проблем возникнуть не должно. А если стать с CD ))) Файл создать не получится (
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Не думал, что кто-то еще бегает с флешками и CD, обычно все разливается через GPO или SCCM.
Ну пишите info.txt не в папку скрипта, а в C:\Windows\Temp или в документы текущего юзера.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Chang [?]
имеет ли смысл кардинально переделывать то, что уже работает )))
Приходит сын, ученик начальных классов, из школы. Папа программист сидит за отладкой программы, мозг замучен.
- Папа, нам в школе сказали, что солнце встает на востоке и садится на западе
Папа поднимает на сына красные глаза:
- Это точно работает? Ты проверял?
- Да
- Тогда ничего не трогай ничего не меняй
)))

Пытаясь сделать что то идеальнее чем есть можно встрять. Иногда часть ручной работы приветствуется, так как пользователь частично контролирует процесс установки.

[?]
Софт имеет свойство обновляться и каждый раз архивировать это добро надоедает ((( Хочется больше автоматизации и отчета об установке. Приходится руками лезть и проверять наличие файлов в папке.
Исходя из этого можно конкретно и подробно описать задачу. Тогда появится пример решения. А в общем алгоритм обычный. Проблема в реализации. Чем архивируется? зачем архивация.. и прочее и прочее
 
Автор
C

Chang

Новичок
Сообщения
45
Репутация
0
joiner, корпоративная система складского учета с костылями (писал естественно не я). Костыли заключаются в том, что в зависимости от архитектуры нужны разные настройки для корректной работы программы. Соответственно у меня есть ряд настроек для архитектуры x86 и свои настройки для x64. Поговорил с разработчиками софта, настройки меняются очень редко, а софт что-то там допиливают по требованию руководства и кладовщиков, поэтому время от времени он обновляется.

Обновления накатываются путем заменения и добавления файлов в папку с установленной системой.

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

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

Вот только никак правильный алгоритм не могу в голове составить. Поэтому и пришел именно в этот раздел форума, а не в стол заказов ...
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Просто замена файлов без переустановки самой проги?
Тогда так:
1) Делаем расшаренную папку, храним в ней текущую версию, файлы настроек под разные системы, файл с номером версии
2) Раз в сутки (ночью) скрипт запускается планировщиком, закрывает прогу, если открыта
3) Читает номер версии из файла в удаленной папке и в локальной
4) Если версии отличаются, прибивает локальную папку
5) Скачивает новую версию
6) Проверяет системные параметры
7) Скачивает и подкладывает в локальную папку фал настроек

При выходе новой версии выкладываем её в расшаренную папку, меняем номер версии.
 
Автор
C

Chang

Новичок
Сообщения
45
Репутация
0
hedji, спасибо большое. Это идеальная схема и надеюсь в ближайшее время наши системники дойдут до подобной автоматизации. Передам им.

И дополнтельный вопрос. На компах стоят брендмауры, без защиты никуда! Где-то это стандартные виндовские защитники, но в основном это Каспер интернет секьюрити и 360 Total Security. Всего у нас в компании порядка 42 компуков. Я так понимаю, мне надо будет для реализации подобного обновления добавить исключения в них ? Это как-то можно прописать средствами autoit или только ручками ?
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Зависит от паранойи безопасников настроек антивирусов, можно только гадать.
Расшаренные папки обычно антивирусник не должен блочить, главное чтобы не блочил сам скрипт.

Пока сетка еще маленькая начните играться с AD и GPO, сильно поможет в вопросах централизации управления и избавит от задач "обежать ХХХшт. ПК ногами и на каждом что-то сделать".
 
Автор
C

Chang

Новичок
Сообщения
45
Репутация
0
Вот с исключениями я особо не дружу ))) Т.к. все они по своему формируют списки исключений. Поэтому и встал вопрос, а что если чтобы 42 раза не ковыряться в настройках брандмауэров, узнать у кого что установлено и прописать правила для исключений ...
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
#include <AutoItConstants.au3>
Global Const $wbemFlagReturnImmediately = 0x10
Global Const $wbemFlagReturnWhenComplete = 0x0
Global Const $wbemFlagBidirectional = 0x0
Global Const $wbemFlagForwardOnly = 0x20
Global Const $wbemFlagNoErrorObject = 0x40
Global Const $wbemFlagReturnErrorObject = 0x0
Global Const $wbemFlagSendStatus = 0x80
Global Const $wbemFlagDontSendStatus = 0x0
Global Const $wbemFlagUseAmendedQualifiers = 0x20000

_Win32_Processor()
ConsoleWrite(_SystemInfo() & @LF)

Func _SystemInfo()
	Local $iPID = Run("SystemInfo.exe", "", @SW_HIDE, $STDERR_MERGED)
	ProcessWaitClose($iPID)
	Return StdoutRead($iPID)
EndFunc   ;==>_SystemInfo

Func _Win32_Processor()
	#cs
		;This property is not supported before Windows Server 2016 Technical Preview and Windows 10
		AssetTag
		Characteristics
		NumberOfEnabledCore
		PartNumber
		SerialNumber
		ThreadCount
		;This property is not supported before Windows 8 and Windows Server 2012
		SecondLevelAddressTranslationExtensions
		VirtualizationFirmwareEnabled
		VMMonitorModeExtensions
		;Array
		PowerManagementCapabilities
	#ce
	Local $oWMI = ObjGet("winmgmts:\\.\root\CIMV2")
	If Not IsObj($oWMI) Then Return ConsoleWrite("--> Error 1" & @LF)
	Local $oItems = $oWMI.ExecQuery("SELECT * FROM Win32_Processor", "WQL", BitOR($wbemFlagReturnImmediately, $wbemFlagForwardOnly))
	If Not IsObj($oItems) Then Return ConsoleWrite("--> Error 2" & @LF)
	For $oIt In $oItems
		ConsoleWrite("++> AddressWidth: " & $oIt.AddressWidth & @LF & _
				"++> Architecture: " & $oIt.Architecture & @LF & _
				"++> Availability: " & $oIt.Availability & @LF & _
				"++> Caption: " & $oIt.Caption & @LF & _
				"++> ConfigManagerErrorCode: " & $oIt.ConfigManagerErrorCode & @LF & _
				"++> ConfigManagerUserConfig: " & $oIt.ConfigManagerUserConfig & @LF & _
				"++> CpuStatus: " & $oIt.CpuStatus & @LF & _
				"++> CreationClassName: " & $oIt.CreationClassName & @LF & _
				"++> CurrentClockSpeed: " & $oIt.CurrentClockSpeed & @LF & _
				"++> CurrentVoltage: " & $oIt.CurrentVoltage & @LF & _
				"++> DataWidth: " & $oIt.DataWidth & @LF & _
				"++> Description: " & $oIt.Description & @LF & _
				"++> DeviceID: " & $oIt.DeviceID & @LF & _
				"++> ErrorCleared: " & $oIt.ErrorCleared & @LF & _
				"++> ErrorDescription: " & $oIt.ErrorDescription & @LF & _
				"++> ExtClock: " & $oIt.ExtClock & @LF & _
				"++> Family: " & $oIt.Family & @LF & _
				"++> InstallDate: " & $oIt.InstallDate & @LF & _
				"++> L2CacheSize: " & $oIt.L2CacheSize & @LF & _
				"++> L2CacheSpeed: " & $oIt.L2CacheSpeed & @LF & _
				"++> L3CacheSize: " & $oIt.L3CacheSize & @LF & _
				"++> L3CacheSpeed: " & $oIt.L3CacheSpeed & @LF & _
				"++> LastErrorCode: " & $oIt.LastErrorCode & @LF & _
				"++> Level: " & $oIt.Level & @LF & _
				"++> LoadPercentage: " & $oIt.LoadPercentage & @LF & _
				"++> Manufacturer: " & $oIt.Manufacturer & @LF & _
				"++> MaxClockSpeed: " & $oIt.MaxClockSpeed & @LF & _
				"++> Name: " & $oIt.Name & @LF & _
				"++> NumberOfCores: " & $oIt.NumberOfCores & @LF & _
				"++> NumberOfLogicalProcessors: " & $oIt.NumberOfLogicalProcessors & @LF & _
				"++> OtherFamilyDescription: " & $oIt.OtherFamilyDescription & @LF & _
				"++> PNPDeviceID: " & $oIt.PNPDeviceID & @LF & _
				"++> PowerManagementSupported: " & $oIt.PowerManagementSupported & @LF & _
				"++> ProcessorId: " & $oIt.ProcessorId & @LF & _
				"++> ProcessorType: " & $oIt.ProcessorType & @LF & _
				"++> Revision: " & $oIt.Revision & @LF & _
				"++> Role: " & $oIt.Role & @LF & _
				"++> SocketDesignation: " & $oIt.SocketDesignation & @LF & _
				"++> Status: " & $oIt.Status & @LF & _
				"++> StatusInfo: " & $oIt.StatusInfo & @LF & _
				"++> Stepping: " & $oIt.Stepping & @LF & _
				"++> SystemCreationClassName: " & $oIt.SystemCreationClassName & @LF & _
				"++> SystemName: " & $oIt.SystemName & @LF & _
				"++> UniqueId: " & $oIt.UniqueId & @LF & _
				"++> UpgradeMethod: " & $oIt.UpgradeMethod & @LF & _
				"++> Version: " & $oIt.Version & @LF & _
				"++> VoltageCaps: " & $oIt.VoltageCaps & @LF)
	Next
EndFunc   ;==>_Win32_Processor
 
Автор
C

Chang

Новичок
Сообщения
45
Репутация
0
Tempo, не особо шарю, подскажи пожалуйста, это к чему ? :blink:
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Chang, 2 варианта получения информации о системе без создания файла
 
Автор
C

Chang

Новичок
Сообщения
45
Репутация
0
Понял. Спасибо :-[ Буду теперь зазбираться. Осталось теперь понять, как это все связать воедино с моей задачей )
 

CRD

Новичок
Сообщения
57
Репутация
0
Как-то все сложно у вас тут. Почему нельзя проверить разрядность через @OSArch? Или я чего-то не понимаю :-X
 
Верх