Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для K.A.V.

Ленивый кусок мяса


Contributor


Сообщения: 1986
Благодарности: 723

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: zip ShellExecEx.zip
(1.4 Kb, 7 просмотров)

Ну вы даёте, ребята
Не в обиду будет сказано, но всё то, что выше описал динозавра о якобы некорректном коде с IsUserAdmin и RequestExecutionLevel прямо говорит о небольшом непонимании, как это всё работает.
Может, вся проблема в том, что человек просто не понимает, для чего нужно RequestExecutionLevel/манифест и что происходит, когда он "повышает" права через UAC (Запуск от имени)?

Простой пример:
Цитата динозавра:
Но его просто можно запустить от имени и никакой Quit уже не сработает. »
Конечно, "От имени" - это означает, что вы вышли из системы с ограниченными правами (Вы уже не Вася) и залогинились под другой учетной записью с правами админа (Вы уже Антон)
Цитата динозавра:
В нашей справке. Не указано, что тот код, что там, и мои в том числе работают только в ХР, ну еще на других с полностью отключенным UAC. С включенным UAC по рекомендованному умолчанию любой бесправный пользователь от имени установит прогу или чего там. Нужно только паролить. »
Всё работает правильно, просто вы не понимаете, как это работает

Всё же достаточно просто, на мой взгляд
RequestExecutionLevel прописываем тот уровень прав на старте приложения (грубо говоря, это контролирует система, сразу понимая, кто перед ней и что ему нужно), который нам необходим для выполнения всех операций. Если вы делаете установку серьёзного ПО с записью в системные папки - то без повышенных прав вам не обойтись

Вы просто неправильно понимаете смысла запуска приложения через UAC (Запуск от имени администратора) и как это отразится на уровне скрипта и работе пакета установки
Вся соль в том, что когда вы повышаете права через UAC (или прописываете в скрипте RequestExecutionLevel admin), то вы можете забыть про своего "оригинального" пользователя в скрипте, под которым работаете (его имени пользователе и типе учетной записи), по-крайней мере голыми средствами NSIS вы не узнаете правды о запустившем инсталлятор (но есть но (в конце ))

На пальцах:
1. Вася (не админ) => RequestExecutionLevel user => В скрипте: Вася (IsUserAdmin == 0)
2. Вася (не админ) => RequestExecutionLevel admin => В скрипте: Антон (IsUserAdmin == 1)

Не понимаю, зачем такое (опять же) извращение с определением типа учетной записи/закрытие инсталлера и т.д. (вы точно установщик пишите?)
Т.к. нормальные установщики "без задних мыслей" никогда не стесняются попросить ОС дать ей чуточку привилегий, чтобы избавить всех от лишних проблем и правильной установки ПО

Можно, конечно, попробовать пойти другим путём и повышать права самостоятельно через ShellExecEx, запоминать от имени какой учетной записи был изначально запущен процесс установки.
Но выглядит это довольно странно

1. RequestExecutionLevel user
2.
Код: Выделить весь код
!include ".\ShellExecEx.nsh"
3. Распаковть ShellExecEx.nsh в папку со своим скриптом установщика
4. При запуске установщика определяем тип учетной записи и имя пользователя, если нужно для дальнейших извращений - где-нибудь сохраняем
5. В нужном месте запускаем сами себя с просьбой о повышении прав
Код: Выделить весь код
${ShellExecEx} $0 'runas' '"$EXEPATH"' '' '' '' 2
Дальше делайте что хотите...Закрывайте оригинальный процесс под Васей не админом, проверяйте статус процесса и т.д.

Могу предположить, что такой метод, как вариант, может использоваться в установщике, где только 1 выборочный компонент из 10 требует повышения прав и не всегда необходимо тыкать пользователю о необходимости админских прав

Или я тут жути нагнал и не понял, о чем вы?

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:55, 01-02-2021 | #2551