purebasic.info

PureBasic forum
Текущее время: Чт июн 04, 2020 4:25 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Помощник - инсталатор
СообщениеДобавлено: Чт апр 09, 2020 4:54 am 
Не в сети
ассистент

Зарегистрирован: Вт мар 06, 2018 7:45 am
Сообщений: 20
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Тут в связи с шухером по установке дистанционного доступа с домашних компов на рабочие компы по системе разработанной нашим главным админом
я сначала дописал/актуализировал доку от глав.админа для юзеров в PDF
А потом с целью пробить тупость некоторых юзеров интегрировал все в один exe-шник.
~20M. Для Windows.
Получился некий помощник-инсталятор (ПИ).
Идея - юзер должен получить (скачать или принести на флэшке) всего один файл.
И запустить его. И больше никаких докачек.
Правда по опыту эксплуатации пробить тупость отдельных юзеров не удалось.
Но даже в таком случае общаться стало проще.

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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
 
 
Procedure.s GetSysErrorText(ErrCode)
        Protected result.s="", *Memory, length
        *Memory = AllocateMemory (255)
        length = FormatMessage_ (#FORMAT_MESSAGE_FROM_SYSTEM, #Null, ErrCode, 0, *Memory, 255, #Null)
        result=PeekS (*Memory, length - 2)
        FreeMemory (*Memory)
        ProcedureReturn result
EndProcedure
 
Procedure WaitToClean(*FileName) ;new thread
        Protected Filename$=PeekS(*FileName), nFile, ErrCode
        Debug Filename$
        If FileSize(Filename$)<0 ; нет файла
                MessageRequester("Assistant Info", "Временный файл ["+Filename$+"] для зачистки не найден!", #PB_MessageRequester_Info)
                ProcedureReturn #True
        EndIf
        Repeat
                If FileSize(Filename$)<0 ; нет файла
                        Break
                EndIf
                nFile=OpenFile(#PB_Any, Filename$) ;пробуем открыть файл
                If nFile=0 ;не открылся - занят - ждем дальше
                        ErrCode=GetLastError_()
                        Debug ErrCode
                        Debug GetSysErrorText(ErrCode)
                        Delay(1000)
                Else ; открылся - значит свободен - грохнуть его
                        CloseFile(nFile)
                        If 0=DeleteFile(Filename$ , #PB_FileSystem_Force) ;облом
                                ErrCode=GetLastError_()
                                MessageRequester("Assistant Info", "Ошибка при удалении временного файла ["+Filename$+"]"+#CRLF$+
                                                                   "ErrorCode="+Str(ErrCode)+#CRLF$+
                                                                   "ErrorText="+GetSysErrorText(ErrCode))
                        Else
                                Debug "File deleted"
                        EndIf
                        Break
                EndIf
        ForEver
        ProcedureReturn #True
EndProcedure
 
;---- IncludeFile Windows -------------------
IncludeFile "Win0.pbf"
 
 
Global exeFile$=ProgramFilename()
Global exePath$ = GetPathPart(exeFile$)
Global v32$="kerio-control-vpnclient-9.1.4-1535-win32.exe"
Global v64$="kerio-control-vpnclient-9.1.4-1535-win64.exe"
Global PDF$="Kerio VPN.pdf"
Global AA$="AA_v3.exe"
Global Temp$=GetEnvironmentVariable("temp")
Global Tmp$=GetEnvironmentVariable("tmp")
Global Filename$
 
OpenWindow_0(10,10)
 
GadgetToolTip(#Btn_v32, "Ткни сюда мышкой 1 раз  чтобы установить 32-битную версию Kerio VPN client")
GadgetToolTip(#Btn_v64, "Ткни сюда мышкой 1 раз  чтобы установить 64-битную версию Kerio VPN client")
GadgetToolTip(#Btn_Kerio_Start, "Ткни сюда мышкой 1 раз чтобы запустить Kerio VPN client")
GadgetToolTip(#Btn_RDP_Start, "Ткни сюда мышкой 1 раз чтобы запустить [Подключение к удаленному рабочему столу]")
GadgetToolTip(#Btn_AA_Start, "Ткни сюда мышкой 1 раз чтобы запустить [программу дистанционного администрирования]")
GadgetToolTip(#Btn_PDF_Start, "Ткни сюда мышкой 1 раз чтобы открыть инструкцию по установке если вам непонятно то что написано выше в этом окне")
 
If FileSize(Temp$)=-2 ; dir
ElseIf FileSize(Tmp$)=-2 ; dir
        Temp$=Tmp$
Else
        MessageRequester("Assistant error", "Не могу определить системную папку для временных файлов ", #PB_MessageRequester_Error)
        End
EndIf
 
ProgFilesx86$ = GetEnvironmentVariable("ProgramFiles(x86)")
 
If Len(ProgFilesx86$)>0
        SetGadgetText(#Text_Bits,"Похоже что у вас стоит 64-битная система Windows")
Else
        SetGadgetText(#Text_Bits,"Похоже что у вас стоит 32-битная система Windows")
        ProgFilesx86$ = GetEnvironmentVariable("ProgramFiles")
EndIf
 
Kerio$ = ProgFilesx86$+"\Kerio\VPN Client\kvpncgui.exe"
 
SetGadgetText(#Editor_0, "Чтобы получить [Имя пользователя], [Пароль] для KerioVPNclient и "+
                         "[IP-адрес своего рабочего компьютера] нужно "+
                         "отправить сообщение с указанием своих "+
                         "Фамилия Имя Отчество на телефон  "+
                         "962-289-xxxx по СМС или Whatsapp")
 
SetGadgetText(#Editor_3, "Соединение : 80.237.x.xxx"+#CRLF$+
                         "Сервер : 80.237.x.xxx"+#CRLF$+
                         "[Имя пользователя] и [Пароль] - полученные по телефону")
 
SetGadgetText(#Editor_4, "Вводим [IP-адрес своего рабочего компьютера] и нажимаем Подключить. "+#CRLF$+
"И получаем доступ к экрану своего рабочего компьютера. Работаем. "+#CRLF$+
"По окончании работы НЕ ВЫКЛЮЧАТЬ рабочий компьютер. Только закрыть [Подключение к удаленному рабочему столу] на домашнем компьютере. "+#CRLF$+
"Для повторного соединения поднимаем канал KerioVPN client (см.п.3) и вызываем [Подключение к удаленному рабочему столу] (см.п.4)")
 
SetGadgetText(#Editor_5,"Если не удалось установить связь вышеописанным способом но ваш интернет – работает. "+#CRLF$+
                        "Запустить программу дистанционного администрирования"+#CRLF$+
                        "Позвонить назначенному сотруднику отд.ИТ ТРБ-Ванино. Сообщить ему <Ваш ID> и <Пароль>."+#CRLF$+
                                                "Он попытается подключиться к вашему компьютеру и проделать операции из первой части. ")
 
 
Repeat ; Start of the event loop
        Event = WaitWindowEvent() ; This line waits until an event is received from Windows
        WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
        GadgetID = EventGadget() ; Is it a gadget event?
        EventType = EventType()  ; The event type
       
        Select WindowID
                Case #Window_0
                        ;{
                        Select Event
                                Case #PB_Event_CloseWindow
                                        Break ; выйти из цикла Repeate
                                       
                                Case #PB_Event_Gadget
                                        Select EventGadget()
                                                Case #Btn_v32
                                                        Filename$=Temp$+"\"+v32$
                                                        nFile = CreateFile(#PB_Any, Filename$ )
 
                                                        If nFile=0
                                                                CloseFile(nFile)
                                                                MessageRequester("Assistant error", "Не могу создать временный файл ["+Filename$+"] !", #PB_MessageRequester_Error)
                                                        Else
                                                                nLen=?v32end-?v32beg
                                                                Result = WriteData(nFile, ?v32beg, nLen)
                                                                CloseFile(nFile)
                                                                If Result=nLen ;Ok
                                                                        RunProgram(Filename$)
                                                                        CreateThread(@WaitToClean(),@FileName$)
                                                                Else
                                                                        MessageRequester("Assistant error", "Не могу произвести запись во временный файл ["+Filename$+"] !", #PB_MessageRequester_Error)
                                                                EndIf
                                                        EndIf
                                                       
                                                Case #btn_v64
                                                        Filename$=Temp$+"\"+v64$
                                                        nFile = CreateFile(#PB_Any, Filename$ )
 
                                                        If nFile=0
                                                                CloseFile(nFile)
                                                                MessageRequester("Assistant error", "Не могу создать временный файл ["+Filename$+"] !", #PB_MessageRequester_Error)
                                                        Else
                                                                nLen=?v64end-?v64beg
                                                                Result = WriteData(nFile, ?v64beg, nLen)
                                                                CloseFile(nFile)
                                                                If Result=nLen ;Ok
                                                                        RunProgram(Filename$)
                                                                        CreateThread(@WaitToClean(),@FileName$)
                                                                Else
                                                                        MessageRequester("Assistant error", "Не могу произвести запись во временный файл ["+Filename$+"] !", #PB_MessageRequester_Error)
                                                                EndIf
                                                        EndIf
                                                       
                                                Case #Btn_Kerio_Start
                                                        If FileSize(Kerio$)<0
                                                                MessageRequester("Assistant error", "Файл ["+Kerio$+"] не найден", #PB_MessageRequester_Error)
                                                        Else
                                                                RunProgram(Kerio$)
                                                        EndIf
                                                       
                                                Case #Btn_RDP_Start
                                                        Filename$ = GetEnvironmentVariable("SystemRoot")+"\system32\mstsc.exe"
                                                        If FileSize(Filename$)<0
                                                                MessageRequester("Assistant error", "Файл ["+Filename$+"] не найден", #PB_MessageRequester_Error)
                                                        Else
                                                                RunProgram(Filename$)
                                                        EndIf
                                                       
                                                Case #Btn_PDF_Start
                                                        Filename$=Temp$+"\"+PDF$
                                                        nFile = CreateFile(#PB_Any, Filename$ )
 
                                                        If nFile=0
                                                                CloseFile(nFile)
                                                                MessageRequester("Assistant error", "Не могу создать временный файл ["+Filename$+"] !", #PB_MessageRequester_Error)
                                                        Else
                                                                nLen=?PDFend-?PDFbeg
                                                                Result = WriteData(nFile, ?PDFbeg, nLen)
                                                                CloseFile(nFile)
                                                                If Result=nLen ;Ok
                                                                        RunProgram(Filename$)
                                                                        Delay(5000) ;подождать пока Acrobat (или другая) откроет PDF-файл
                                                                        CreateThread(@WaitToClean(),@FileName$)
                                                                Else
                                                                        MessageRequester("Assistant error", "Не могу произвести запись во временный файл ["+Filename$+"] !", #PB_MessageRequester_Error)
                                                                EndIf
                                                        EndIf
                                                       
                                                Case #Btn_AA_Start
                                                        Filename$=Temp$+"\"+AA$
                                                        nFile = CreateFile(#PB_Any, Filename$ )
 
                                                        If nFile=0
                                                                CloseFile(nFile)
                                                                MessageRequester("Assistant error", "Не могу создать временный файл ["+Filename$+"] !", #PB_MessageRequester_Error)
                                                        Else
                                                                nLen=?AAend-?AAbeg
                                                                Result = WriteData(nFile, ?AAbeg, nLen)
                                                                CloseFile(nFile)
                                                                If Result=nLen ;Ok
                                                                        RunProgram(Filename$)
                                                                        CreateThread(@WaitToClean(),@FileName$)
                                                                Else
                                                                        MessageRequester("Assistant error", "Не могу произвести запись во временный файл ["+Filename$+"] !", #PB_MessageRequester_Error)
                                                                EndIf
                                                        EndIf
 
                                        EndSelect
                        EndSelect
                        ;}
        EndSelect
ForEver
 
End
 
DataSection
 
v32beg:
IncludeBinary "kerio-control-vpnclient-9.1.4-1535-win32.exe"
v32end:
 
v64beg:
IncludeBinary "kerio-control-vpnclient-9.1.4-1535-win64.exe"
v64end:
 
AAbeg:
IncludeBinary "AA_v3.exe"
AAend:
 
PDFbeg:
IncludeBinary "Kerio VPN.pdf"
PDFEnd:
 
EndDataSection
 
 



Код окна Win0.pbf
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
 
 
Enumeration FormWindow
  #Window_0
EndEnumeration
 
Enumeration FormGadget
  #Text_0
  #Text_1
  #Frame_0
  #Text_Bits
  #Frame_1
  #Text_Kerio
  #Btn_v32
  #Btn_v64
  #Frame_2
  #Text_Kerio3
  #Btn_Kerio_Start
  #Frame_3
  #Text_Kerio2
  #Editor_0
  #Frame_4
  #Text_Kerio4
  #Btn_RDP_Start
  #Editor_4
  #Editor_3
  #Frame_2_Copy1
  #Text_Kerio5
  #Btn_AA_Start
  #Editor_5
  #Btn_PDF_Start
EndEnumeration
 
Enumeration FormFont
  #Font_Window_0_0
  #Font_Window_0_1
EndEnumeration
 
LoadFont(#Font_Window_0_0,"Arial", 10, #PB_Font_Bold)
LoadFont(#Font_Window_0_1,"Arial", 12, #PB_Font_Bold)
 
 
Procedure OpenWindow_0(x = 0, y = 0, width = 800, height = 636)
  OpenWindow(#Window_0, x, y, width, height, "software installation assistant @ Sadstar (FreeWare)", #PB_Window_SystemMenu)
  SetWindowColor(#Window_0, RGB(128,255,255))
  TextGadget(#Text_0, 4, 4, 792, 20, "Помощник по установке дистанционного доступа к рабочему компьютеру", #PB_Text_Center)
  SetGadgetColor(#Text_0, #PB_Gadget_FrontColor,RGB(0,0,255))
  SetGadgetColor(#Text_0, #PB_Gadget_BackColor,RGB(255,255,128))
  SetGadgetFont(#Text_0, FontID(#Font_Window_0_0))
  TextGadget(#Text_1, 4, 28, 792, 20, " для сотрудников ООО ТРБ-Ванино", #PB_Text_Center)
  SetGadgetColor(#Text_1, #PB_Gadget_BackColor,RGB(128,255,255))
  SetGadgetFont(#Text_1, FontID(#Font_Window_0_0))
  FrameGadget(#Frame_0, 8, 48, 788, 48, "", #PB_Frame_Double)
  TextGadget(#Text_Bits, 16, 64, 772, 24, "")
  SetGadgetColor(#Text_Bits, #PB_Gadget_BackColor,RGB(128,255,255))
  SetGadgetFont(#Text_Bits, FontID(#Font_Window_0_1))
  FrameGadget(#Frame_1, 8, 100, 788, 52, "")
  TextGadget(#Text_Kerio, 16, 116, 216, 24, "1. Установить Kerio VPN Client")
  SetGadgetColor(#Text_Kerio, #PB_Gadget_BackColor,RGB(128,255,255))
  SetGadgetFont(#Text_Kerio, FontID(#Font_Window_0_0))
  ButtonGadget(#Btn_v32, 244, 116, 208, 28, "Установить 32-битную версию")
  ButtonGadget(#Btn_v64, 472, 116, 208, 28, "Установить 64-битную версию")
  FrameGadget(#Frame_2, 8, 236, 788, 80, "")
  TextGadget(#Text_Kerio3, 16, 248, 244, 24, "3. Запустить Kerio VPN Client")
  SetGadgetColor(#Text_Kerio3, #PB_Gadget_BackColor,RGB(128,255,255))
  SetGadgetFont(#Text_Kerio3, FontID(#Font_Window_0_0))
  ButtonGadget(#Btn_Kerio_Start, 16, 280, 272, 28, "Запустить Kerio VPN client")
  FrameGadget(#Frame_3, 8, 156, 788, 80, "")
  TextGadget(#Text_Kerio2, 16, 172, 188, 24, "2. Получить коды доступа")
  SetGadgetColor(#Text_Kerio2, #PB_Gadget_BackColor,RGB(128,255,255))
  SetGadgetFont(#Text_Kerio2, FontID(#Font_Window_0_0))
  EditorGadget(#Editor_0, 212, 172, 580, 56, #PB_Editor_ReadOnly | #PB_Editor_WordWrap)
  SetGadgetFont(#Editor_0, FontID(#Font_Window_0_0))
  FrameGadget(#Frame_4, 8, 316, 788, 156, "")
  TextGadget(#Text_Kerio4, 16, 328, 388, 24, "4. Запустить Подключение к удаленному рабочему столу")
  SetGadgetColor(#Text_Kerio4, #PB_Gadget_BackColor,RGB(128,255,255))
  SetGadgetFont(#Text_Kerio4, FontID(#Font_Window_0_0))
  ButtonGadget(#Btn_RDP_Start, 412, 328, 272, 28, "Подключение к удаленному рабочему столу")
  EditorGadget(#Editor_4, 12, 360, 780, 108, #PB_Editor_ReadOnly | #PB_Editor_WordWrap)
  SetGadgetFont(#Editor_4, FontID(#Font_Window_0_0))
  EditorGadget(#Editor_3, 304, 248, 488, 60, #PB_Editor_ReadOnly | #PB_Editor_WordWrap)
  SetGadgetFont(#Editor_3, FontID(#Font_Window_0_0))
  FrameGadget(#Frame_2_Copy1, 8, 472, 788, 160, "")
  TextGadget(#Text_Kerio5, 16, 488, 160, 24, "5. Аварийный вариант")
  SetGadgetColor(#Text_Kerio5, #PB_Gadget_BackColor,RGB(128,255,255))
  SetGadgetFont(#Text_Kerio5, FontID(#Font_Window_0_0))
  ButtonGadget(#Btn_AA_Start, 28, 520, 128, 56, "программа дистанционного администрирования", #PB_Button_Default | #PB_Button_MultiLine)
  EditorGadget(#Editor_5, 176, 484, 616, 140, #PB_Editor_ReadOnly | #PB_Editor_WordWrap)
  SetGadgetFont(#Editor_5, FontID(#Font_Window_0_0))
  ButtonGadget(#Btn_PDF_Start, 28, 592, 128, 28, "  PDF инструкция", #PB_Button_Default | #PB_Button_MultiLine)
EndProcedure
 
 



https://yadi.sk/d/ATbBqlorK1iYkA
Здесь лежит еще скриншот и готовый экзешник.
Если нужно получить начинку - запускаете ПИ, нажимаете нужную кнопку, запускается программа - пока она не закрыта ее файл можно скопировать из %TEMP%

-----------
Всем - здоровья и удачи.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Помощник - инсталатор
СообщениеДобавлено: Чт апр 09, 2020 6:25 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6609
Благодарил (а): 34 раз.
Поблагодарили: 230 раз.
Пункты репутации: 61
sadstar писал(а):
Идея простая - извлечь нужный файл из тела ПИ, сохранить в системную папку для временных файлов и передать этот файл системе для исполнения.

Антивирус не ругает?

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Помощник - инсталатор
СообщениеДобавлено: Чт апр 09, 2020 7:02 am 
Не в сети
ассистент

Зарегистрирован: Вт мар 06, 2018 7:45 am
Сообщений: 20
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Не замечено.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB