PDA

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 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

Serg866
11-02-2016, 18:15
Посмотри на даты комментов. Многое уже изменилось. Да и вообще - никогда не верь комментам, пока не проверишь сам
Зря я эту ссылку дал... »
Да скорее это я зря эту тему поднял.
Получается нет "бесшумного" способа подправить файл hosts.
И вообще в целом блокирнуть адрес сайта, не нарвавшись на УГ-антивири, UAC и прочую фигню.

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

MKN
12-02-2016, 10:12
Получается нет "бесшумного" способа подправить файл hosts. »
Ну как же нет ? :) Как править строки в hosts рассказал K.A.V.

"Отобрать" файл hosts у системы (W7 и выше) - способов навалом. От классического командного, типа

nsExec::exec 'takeown.exe /F "$SYSDIR\drivers\etc\hosts"' ; текущий пользователь становится владельцем файла
nsExec::exec 'icacls.exe "$SYSDIR\drivers\etc\hosts" /grant $UserName:F /T' ; полный доступ текущего пользователя к файлу

как получить $UserName - тоже куча способов
от обычных ExpandEnvStrings $UserName %username%
до API_шных - GetUserName
Примеров - море

Для получения разных вариантов доступа есть плагин - AccessControl. Выбирай и пробуй...

Боишься беспокойства от UAC- есть и плагин, есть и другие способы

Если антивирь защищает hosts - ну предупреди ты в нужный момент, пользователя сообщением, что делать в таком случае. (именно так поступают авторы многих патчей, затрагивающих заодно и несчастный hosts ... ),

Зачем придумывать проблемы, когда всё давно уже решено... :)

Serg866
12-02-2016, 18:14
А этот плагин может задать брендмауэру блокировку сайта?
Он юникод поддерживает. Только я не понимаю какое правило использовать

http://nsis.sourceforge.net/LiteFirewall_Plugin

MKN
12-02-2016, 18:40
Serg866,
У LiteFirewall Plugin всего два правила :
Добавление приложения в список исключений брандмауэра Windows - liteFirewall::AddRule
Удаление приложения из списка исключений брандмауэра Windows - liteFirewall::RemoveRule

Serg866
13-02-2016, 07:39
MKN
Ну окей, тогда с помощью этого плагина как задавать блокировку сайта?
Может ради этого на ANSI перейду.

http://nsis.sourceforge.net/NSIS_Simple_Firewall_Plugin


Плохо что в справочнике нет ничего на эту тему.

MKN
13-02-2016, 11:25
с помощью этого плагина как задавать блокировку сайта?
Плохо что в справочнике нет ничего на эту тему. »
Зачем это в справочнике, всё ведь уже расписано в доках к плагинам ?
Simple_Firewall_Plugin похоже не блокирует отдельные сайты. Детально не изучал...

А почему разонравился способ редактирования HOSTS ? :)

Нужный адрес добавляется без проблем.

Ессно, ничего не получится, если hosts защищён антивирусом.
Поэтому и надо, перед установкой твоей программы - сообщить пользователю, что делать !
Т.е. , если установлен антивирус, определить какой это антивирус, и дать пользователю в сообщении пошаговые рекомендации, как в настройках антивируса проверить, включена ли защита hosts, и как её отключить.
Хорошо бы для каждого типа антивируса - своё сообщение. Или хотя бы для нескольких основных антивирей. (Можно сделать и для всех, не велик труд, и на будущее пригодится. )
:)
Или в readme программы указать (пример из какой то проги) :
Важно!: Некоторые антивирусные программы, включая Essential Microsoft Security (Windows Defender) не позволяют модифицировать хост файл из предосторожности.
Это сделано для предотвращения модификации хост файла вирусами, шпионским или вредоносным ПО.
Если вы столкнулись с этой проблемы, необходимо временно отключить антивирусное программное обеспечение или отключить защиту хост-файла.

Как определить , какой антивирус установлен в ОС :

;http://nsis.sourceforge.net/WMI_header
OutFile AntiVirusProduct.exe
!include WMI.nsh

Section
${WMIGetInfo} root\SecurityCenter2 AntiVirusProduct displayName Info
SectionEnd

Function Info
MessageBox MB_OK "Установлен : $2"
FunctionEnd

в Windows XP надо использовать SecurityCenter (а не SecurityCenter2 ! )

Можно обойтись и без WMI.nsh. Просто использовать в скрипте команду для wmic.

Serg866
13-02-2016, 16:21
Я такой скрипт не потяну. Очень много всего надо определять.
И плюс результат всё равно не стоит свеч.
Один фиг у людей будут антивири ругаться.
Одно дело, когда какой-то левый антивирь срабатывает у 2 человек из 100, а тут у каждого второго будет срабатывать. Слишком рисковано...

ZaxBoys66
18-02-2016, 21:19
NSIS Check Defrag Disk

NSIS used command line check,defrag disk and clean History,Cookies browsers,empty recycle bin

NSIS used command line to shutdown,restart,sleep,hibernate PC

NSIS Download files with async progressbar

Kopejkin
20-02-2016, 16:39
Какие требования предъявляются к bmp-изображениям, чтобы на создаваемой nsDialogs страничке их (изображений) фон был бы прозрачен?

Flix
20-02-2016, 18:50
Kopejkin, попробуйте использовать 32-бит изображения Bitmap. 32-бит Bitmap - это стандартное растровое изображение с глубиной 24-бит, плюс альфа-канал (прозрачность) с глубиной 8-бит (24+8=32). Обычный редактор изображений Microsoft Paint поддерживает создание и запись изображений в формате BMP только с глубиной 24-бит. Поэтому для получения 32-бит Bitmap изображений воспользуйтесь программами сторонних разработчиков, например, Axialis IconWorkshop, Paint.Net с плагином BMPX и др.

Альтернативный вариант (в теории) — это использовать вместо BMP формат ICO (и соответственно макрокоманду ${NSD_CreateIcon} вместо ${NSD_CreateBitmap}). При этом предварительно конвертируйте ваши изображения в 32-бит формат ICO.

Dodakaedr
21-02-2016, 09:47
Есть такой макрос !define ANSIToUTF8 "!insertmacro ANSIToUTF8"
!macro ANSIToUTF8 SOURCE_STRING OUTPUT_STRING
Push `${SOURCE_STRING}`
System::Store SR2
System::Call "kernel32::MultiByteToWideChar(i0,i0,tR2,i-1,i0,i0)i.R1"
IntOp $R1 $R1 * 2
System::Alloc $R1
Pop $R0
System::Call "kernel32::MultiByteToWideChar(i0,i0,tR2,i-1,iR0,iR1)"
System::Call "kernel32::WideCharToMultiByte(i65001,i0,iR0,i-1,t.s,iR1,i0,i0)"
System::Free $R0
System::Store L
Pop `${OUTPUT_STRING}`
!macroend
Можно его как-то сделать противоположным? То есть UTF8ToANSI.

Вопрос снят. Нашел Utf8Converter (http://nsis.sourceforge.net/Utf8Converter)

Dodakaedr
21-02-2016, 10:43
Помогите, пожалуйста, разобраться с ini файлом. Не определяется секция и при записи нового значения создается дубль секции.

Flix
21-02-2016, 15:21
Dodakaedr, NSIS не умеет работать с INI-файлами в кодировках отличной от ANSI. А ваш файл INI имеет кодировку UTF-8. По этой причине и получается ошибка. Воспользуйтесь плагином Unicode для преобразования кодировок. Примерный код сценария будет следующий:

# Обработка INI-файлов кодировке UTF-8
# Используемые плагины:
# - Unicode v1.1 (http://nsis.sourceforge.net/Unicode_plug-in)
# - EnumINI (http://nsis.sourceforge.net/EnumINI_plug-in)

outfile "TestINI.exe"

Section main
; Выполняем конвертацию исходного файла INI из кодировки UTF-8 в ANSI
; во временный файл с именем _Config.ini
unicode::FileUnicode2Ansi "$EXEDIR\Config.ini" "$EXEDIR\_Config.ini" AUTO
; Извлекаем из стека результат обращения к функции
Pop $1
; Проверяем наличие в INI-файле секции с именем "General"
EnumINI::SectionExist "$EXEDIR\_Config.ini" "General"
; Извлекаем из стека результат обращения к функции
Pop $1
; Выполняем сравнение значения переменной $1 с "1"
StrCmp $1 "1" 0 +6
; Если результат сравнения положительный (секция существует), то...
; Показываем уведомление пользователю
MessageBox MB_OK|MB_ICONINFORMATION "Указанная секция существует."
; Записываем во временный новый INI-файл значение для заданного ключа
WriteINIStr "$EXEDIR\_Config.ini" "General" "RutaBaseExtraccion" "$EXEDIR\"
; Выполняем конвертацию временного файла INI из кодировки ANSI в UTF-8
; и перезаписываем исходный файл INI
unicode::FileAnsi2Unicode "$EXEDIR\_Config.ini" "$EXEDIR\Config.ini" UTF-8
; Извлекаем из стека результат обращения к функции
Pop $1
; Переходим на команду удаления временного файла INI (_Config.ini)
Goto +2
; Если результат сравнения отрицательный (секция НЕ существует), то...
; Показываем уведомление пользователю
MessageBox MB_OK|MB_ICONSTOP "Указанная секция не существует!!!"
; Удаляем временный файл INI, он больше не нужен.
Delete "$EXEDIR\_Config.ini"
SectionEnd
Рекомендую ввести дополнительные проверки как, например, наличие самого файла INI и результатов конвертирования.
К сожалению, оба используемых плагина сделаны в редакции ANSI, поэтому пользоатели NSIS Unicode оказываются в пролёте.

K.A.V.
21-02-2016, 16:00
К сожалению, оба используемых плагина сделаны в редакции ANSI, поэтому пользоатели NSIS Unicode оказываются в пролёте. »
Не пробовал никто CallAnsiPlugin plug-in (http://nsis.sourceforge.net/CallAnsiPlugin_plug-in)?

lavey13
23-02-2016, 15:08
А возможно как то отключить автоматический detailprint таких команд как rename и delete?

Serg866
09-03-2016, 12:23
Привет.

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

С уважением, Serg866

MKN
09-03-2016, 13:02
проверка подключения к интернету »
Самое простое - использовать штатный плагин Dialer (он уже входит в "боксовый пакет" NSIS)

Dialer::GetConnectedState
Pop $1
MessageBox MB_OK "$1"

Если интернет есть, то в $1 - online
если нет, то в в $1 - offline

Можно также использовать (но совершенно ни к чему) :
; http://msdn.microsoft.com/ru-ru/library/windows/desktop/aa384702(v=vs.85).aspx
System::Call 'wininet.dll::InternetGetConnectedState(*i .r0, i 0) i.r1'
IntFmt $R1 "0x%X" "$0" ; (connection in hex)
MessageBox MB_OK "$1 $R1 "
; есть сеть - $1 == 1
; нет - $1 == 0

; $R1 - описание соединения: Modem=0x01, LAN=0x02, Proxy=0x04, RAS=0x10, Offline=0x20 Configured=0x40 и др
; также в $R1 может быть результат сложения разных сочетаний... Например :
; Значение 0x12 представляет собой сочетание INTERNET_CONNECTION_LAN (0x02) и INTERNET_CONNECTION_RAS_INSTALLED (0x10)

Далее для твоей задачи, обыкновенная логика и открытие нужного url

Serg866
09-03-2016, 16:50
MKN. Красава! То что надо.
С проверкой я понял, а команду для открытия url как прописывать?
если что у меня в скрипте один url уже есть (линк на созданной странице)

kotkovets
10-03-2016, 09:09
команду для открытия url как прописывать? »
через shell.
ExecShell "open" "http://nsis.sf.net/"

Serg866
10-03-2016, 12:06
Коллеги, попутно ещё такая задачка.
Надо прописать удаление с раб.стола папки, в имени которой есть пробел и плюс название на кириллице.

Условно это вот так выглядит

RMDir /r $DESKTOP\Моя папка

И конечо не работает, ругается при компиляции из-за пробела.




© OSzone.net 2001-2012