|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9] |
|
Скрипты Inno Setup. Помощь и советы [часть 9]
|
Ветеран Сообщения: 1270 |
Профиль | Отправить PM | Цитировать
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме Inno Setup. Прочие вопросы. Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах: Скрипты Inno Setup. Помощь и советы [часть 6] | Скрипты Inno Setup. Помощь и советы [часть 6].7z Скрипты Inno Setup. Помощь и советы [часть 7] | Скрипты Inno Setup. Помощь и советы [часть 7].7z Скрипты Inno Setup. Помощь и советы [часть 8] | Скрипты Inno Setup. Помощь и советы [часть 8].7z |
|
Отправлено: 16:09, 04-04-2018 |
Пользователь Сообщения: 54
|
Профиль | Отправить PM | Цитировать Цитата Chudmin:
Вполне возможно, что команда извлечения ExtractTemporaryFile действует принудительно, в обход стандартного функционала инсталлятора и поэтому флаги из секции [Files] не отрабатывают. По-моему так и есть, флаги там работают только при стандартных действиях инсталлятора, т.е. при нажатии кнопки Install на конечном этапе. А у вас до этого не доходит и вы вызываете Taskkill до запуска инсталлятора из секции [ Code ] программы. Поэтому нужно искать другое решение, т.е. как-то вызывать taskkill из кода программы, либо подключать библиотеку taskkill.dll или KillProc.dll и вызывать его через [external 'KillProcByExeName@files:KillProc.dll stdcall], как недавно выкладывал код boss911 здесь: http://forum.oszone.net/thread-33414...essage_2836987 здесь: http://forum.oszone.net/thread-33414...ml#edit2836987 здесь: http://forum.oszone.net/thread-33414...ml#post2836987 |
|
Отправлено: 20:10, 23-10-2018 | #121 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 98
|
Профиль | Отправить PM | Цитировать Цитата ErikPshat:
|
|
Отправлено: 20:14, 23-10-2018 | #122 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата AnastasiyaM:
|
|
Отправлено: 21:23, 23-10-2018 | #123 |
Пользователь Сообщения: 54
|
Профиль | Отправить PM | Цитировать Цитата AnastasiyaM:
@echo Добавление нового пользователя @echo off set user_name=Vasia_Pupkin set user_passw=12345678 echo. echo 1. Добавление нового пользователя net user %user_name% %user_passw% /add /expires:never /fullname:%user_name% echo. echo 2. Обновление свойств пользователя echo. wmic path UserAccount where "Name='%user_name%'" set PasswordExpires=false /nointeractive echo. echo 3. Добавление в группу "Администраторы" и удаление из "Пользователя" net localgroup "Администраторы" %user_name% /add net localgroup "Пользователи" %user_name% /delete @pause |
|
Последний раз редактировалось ErikPshat, 24-10-2018 в 00:18. Отправлено: 22:09, 23-10-2018 | #124 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать ErikPshat, чего, кого?
Цитата ErikPshat:
Цитата ErikPshat:
Нужно: реализация на InnoSetup Pascal Scripting функции CreateProcessAsUser/CreateProcessWithLogon. |
||
Отправлено: 22:29, 23-10-2018 | #125 |
Пользователь Сообщения: 54
|
Профиль | Отправить PM | Цитировать Iska, ну я написал код батника, можно всё перенести в код Inno Setup.
А почему тогда, при создании нового пользователя, после запуска батника, требует ввод пароля? Потому что созданный пользователь является просто Гостем и для него всегда будет запршиваться пароль. |
Отправлено: 22:41, 23-10-2018 | #126 |
Новый участник Сообщения: 7
|
Профиль | Отправить PM | Цитировать Цитата ErikPshat:
|
|
Отправлено: 23:16, 23-10-2018 | #127 |
Пользователь Сообщения: 54
|
Профиль | Отправить PM | Цитировать AnastasiyaM, ну так я что-то недогоняю. Я же вам и предложил код, который:
1. Создаёт нового пользователя с Именем и Паролем. 2. Настраивает пользователя, т.е. ставит галочку, что Пароль не временный, а "Срок действия пароля не ограничен". 3. Делает пользователя Админом и даёт права на выполнение действий без ввода пароля. Теперь вы можете от его имени запускать необходимые процессы, без запроса пароля. И команду ranas можете выполнять. |
Отправлено: 00:28, 24-10-2018 | #128 |
Новый участник Сообщения: 7
|
Профиль | Отправить PM | Цитировать ErikPshat, нужен обязательно бесправный пользователь.
Цитата ErikPshat:
Я пока сделала такой костыль в секции теперь во время установки сообщение командной строки с запросом пароля появляется на экране. Не идеально, но работает |
|
Отправлено: 01:17, 24-10-2018 | #129 |
Ветеран Сообщения: 1270
|
Профиль | Отправить PM | Цитировать AnastasiyaM, вам нужно создавать пользователя уже с паролем, иначе на первом же логоне система скажет ни-ни, потом создать профиль и получить SID. Вот пример без автологона и с требованием пароля при первом входе. Пароль и прочие настройки вам все равно придется в учетке пользователя делать.
Скрытый текст
[Registry] #define UserName "Visitor" Root: HKU; Subkey: {code:GetUserSid|{#UserName}}\Software\Microsoft\Windows\CurrentVersion\Run; ValueName: {#MyAppExeName}; ValueType: string; ValueData: {app}\{#MyAppExeName}; Check: CheckCreateUser('{#UserName}') [Code] #define A = (Defined UNICODE) ? "W" : "A" const ERROR_SUCCESS = 0; ERROR_INSUFFICIENT_BUFFER = 122; LOGON32_LOGON_INTERACTIVE = 2; LOGON32_PROVIDER_DEFAULT = 0; type TProfileInfo = record dwSize: DWORD; dwFlags: DWORD; lpUserName: string; lpProfilePath: string; lpDefaultPath: string; lpServerName: string; lpPolicyPath: string; hProfile: THandle; end; function LookupAccountName(lpSystemName, lpAccountName: string; var Sid: Byte; var cbSid: DWORD; ReferencedDomainName: string; var cbReferencedDomainName: DWORD; var peUse: LongWord): BOOL; external 'LookupAccountName{#A}@advapi32.dll stdcall'; function ConvertSidToStringSid(var Sid: Byte; var StringSid: LongWord): BOOL; external 'ConvertSidToStringSid{#A}@advapi32.dll stdcall'; function LogonUser(lpszUsername, lpszDomain, lpszPassword: string; dwLogonType, dwLogonProvider: DWORD; var phToken: THandle): BOOL; external 'LogonUser{#A}@advapi32.dll stdcall'; function LoadUserProfile(hToken: THandle; var lpProfileInfo: TProfileInfo): BOOL; external 'LoadUserProfile{#A}@userenv.dll stdcall'; function UnloadUserProfile(hToken, hProfile: THandle): BOOL; external 'UnloadUserProfile@userenv.dll stdcall'; function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall'; function CheckCreateUser(const UserName: string): Boolean; var TempPassword: string; UserToken: THandle; ProfileInfo: TProfileInfo; ResultCode: Integer; begin Result := False; try { Create user account. } TempPassword := 'PqYDLMAD'; if not Exec(ExpandConstant('{cmd}'), Format('/c net user "%s" "%s" /add /expires:never', [UserName, TempPassword]), '', SW_HIDE, ewWaitUntilTerminated, ResultCode) or (ResultCode <> ERROR_SUCCESS) then Exit; { Create user profile. } if not LogonUser(UserName, '.', TempPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, UserToken) then RaiseException(SysErrorMessage(DLLGetLastError)); ProfileInfo.dwSize := SizeOf(ProfileInfo); ProfileInfo.lpUserName := UserName; if not LoadUserProfile(UserToken, ProfileInfo) and not UnloadUserProfile(UserToken, ProfileInfo.hProfile) then RaiseException(SysErrorMessage(DLLGetLastError)); { Change user account. } if not Exec(ExpandConstant('{cmd}'), Format('/c net user "%s" "" /logonpasswordchg:yes', [UserName]), '', SW_HIDE, ewWaitUntilTerminated, ResultCode) or (ResultCode <> ERROR_SUCCESS) then Exit; Result := True; except ShowExceptionMessage; finally if UserToken <> 0 then CloseHandle(UserToken); end; end; function GetUserSid(const UserName: string): string; var Sid: array of Byte; DomainName: string; SidSize, DomainNameSize: DWORD; Buffer: LongWord; begin Result := ''; try SetArrayLength(Sid, 1); if not LookupAccountName('', UserName, Sid[0], SidSize, '', DomainNameSize, Buffer) and BOOL(DLLGetLastError <> ERROR_INSUFFICIENT_BUFFER) then Exit; SetArrayLength(Sid, SidSize); DomainName := StringOfChar(#0, DomainNameSize - 1); if not LookupAccountName('', UserName, Sid[0], SidSize, DomainName, DomainNameSize, Buffer) and BOOL(DLLGetLastError <> ERROR_SUCCESS) then RaiseException(SysErrorMessage(DLLGetLastError)); if not ConvertSidToStringSid(Sid[0], Buffer) then RaiseException(SysErrorMessage(DLLGetLastError)); Result := CastIntegerToString(Buffer); except ShowExceptionMessage; finally end; end; |
Отправлено: 12:36, 24-10-2018 | #130 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Скрипты Inno Setup. Помощь и советы [часть 7] | El Sanchez | Автоматическая установка приложений | 2499 | 02-02-2015 08:59 | |
Скрипты Inno Setup. Помощь и советы [часть 6] | El Sanchez | Автоматическая установка приложений | 2494 | 10-03-2014 11:51 | |
Скрипты Inno Setup. Помощь и советы [часть 5] | El Sanchez | Автоматическая установка приложений | 1999 | 28-03-2013 19:09 | |
Скрипты Inno Setup. Помощь и советы [часть 4] | El Sanchez | Автоматическая установка приложений | 2099 | 22-05-2012 23:16 | |
Скрипты Inno Setup. Помощь и советы [часть 3] | Serega | Автоматическая установка приложений | 3755 | 26-10-2011 17:58 |
|