VB. Запускаем свой exe-шник от имени администратора

Здесь обсуждаются вопросы по программированию на Visual Basic.


Модератор: UncleFather

Аватара пользователя
UncleFather
Site Admin
Сообщения: 1505
Зарегистрирован: 17 авг 2004 16:20, Вт
Контактная информация:

VB. Запускаем свой exe-шник от имени администратора

Сообщение UncleFather »

Задача:

Имеется установленная Microsoft Visual Studio 6.0. На Visual Basic создан проект, откомпилирован в exe-файл.
Необходимо сделать так, чтобы на тех компьютерах, где этот exe-шник будет запускаться, он бы запускался в контексте Администратора (от имени Администратора).

Конечно, можно создать ярлык, в свойствах которого указать, что запускаться нужно от имени Администратора, или сделать то же самое в свойствах самого exe-файла. Но эти способы годятся только в том случае, когда есть доступ к конечному компьютеру (компьютеру пользователя), либо уровень навыков пользователя позволит ему самому это сделать. К сожалению, это не всегда так.

Поэтому задача состоит в том, чтобы в сам exe-файл «прошить» информацию о том, что он должен запускаться от имени Администратора.


Решение 1:

Можно просто в имя запускаемой программы включить слово «Installer». Windows 7, 8, 8.1 (скорее всего, это относится и к Vista и к более поздним версиям) сама поймет, что это приложение нужно запускать с Администраторскими привилегиями и отметит такой файл значком:

01.jpg
01.jpg (9.58 КБ) 21502 просмотра

При этом, естественно, манифест Администратора, в файл записываться не будет.


Решение 2:

Можно создать файл манифеста с таким же именем, как исполняемый exe файл и с расширением manifest, положить его в ту же папку, где лежит скомпилированный exe-файл:

04.jpg

Синтаксис и создание файла манифеста не входят в рамки этой статьи, но в нем обязательно должен быть установлен параметр «requestedExecutionLevel». К тому же содержимое манифеста можно скопировать из любого другого подходящего файла, который уже содержит в себе манифест Администратора. Для этого понадобится утилита типа «ResourceHacker»:

03.jpg

Решение 3:

Можно загрузить манифест в файл ресурса с номером 24.
Для этого нужно открыть оболочку Microsoft Visual C++ 6.0, создать новый файл ресурса, в котором создать новый ресурс с номером 24, в который скопировать содержимое манифеста:

05.jpg

и сохранить готовый файл ресурса.

Затем, уже в оболочке Microsoft Basic 6.0 нужно подгрузить этот созданный файл ресурса в проект:

06.jpg
07.jpg

После этого, в заново скомпилированном exe файле будет содержаться манифест Администратора.


Примечание:

Exe-файлы, скомпилированные в VB6 и запускаемые от имени Администратора, нормально работающие на 32-х разрядных ОС, не всегда работают так, как было задумано разработчиком на 64-х разрядных системах.

Например, это касается исполнения внешних программ, вызываемых из Visual Basic методом ShellExecute или WshShell.Run объекта «WScript.Shell». Окна (интерфейсы) запускаемых внешних программ не всегда видны пользователю, какие бы значения параметров, отвечающих за фокус, размер и положение окон, мы ни применяли. От разрядности запускаемой внешней программы это тоже не зависит, как не зависит и от того, скомпилирована ли запускаемая внешняя программа для запуска в контексте Администратора (то есть вложен ли в нее манифест Администратора). Не зависит это и от состояния UAC (контроль учетных записей пользователя) на конечном компьютере.

У меня на 64-х разрядных ОС были видны окна запускаемых из моего VB6 приложения установщиков программ, например, установщика AccessRuntime, и не были видны открываемые pdf-файлы и распаковываемые sfx rar архивы.


Решение 4, позволяющее избежать ошибок, указанных в примечании:

Если в программе не используются окна форм (то есть используются только модули), то можно создать VBS (Visual Basic Script), вместо программы на VB (Visual Basic) и откомпилировать его хоть для 32-х, хоть для 64-х -разрядной системы, включив в него манифест Администратора. См. статью VBS. Как перекомпилировать (конвертировать) VBS в exe.


Alexander A. Manaeff©

Понравилась статья? Будем крайне признательны за репосты в соцсетях! Материально поддержать проект можно здесь

Мои странички:
ВКонтакте
Одноклассники
Youtube
Facebook
Instagram

Изображение
Изображение
Изображение
Изображение

BogdaN
Сообщения: 3
Зарегистрирован: 07 ноя 2016 16:18, Пн

Re: VB. Запускаем свой exe-шник от имени администратора

Сообщение BogdaN »

UncleFather писал(а):


Примечание:[/b]

Exe-файлы, скомпилированные в VB6 и запускаемые от имени Администратора, нормально работающие на 32-х разрядных ОС, не всегда работают так, как было задумано разработчиком на 64-х разрядных системах.

Например, это касается исполнения внешних программ, вызываемых из Visual Basic методом ShellExecute или WshShell.Run объекта «WScript.Shell». Окна (интерфейсы) запускаемых внешних программ не всегда видны пользователю, какие бы значения параметров, отвечающих за фокус, размер и положение окон, мы ни применяли. От разрядности запускаемой внешней программы это тоже не зависит, как не зависит и от того, скомпилирована ли запускаемая внешняя программа для запуска в контексте Администратора (то есть вложен ли в нее манифест Администратора). Не зависит это и от состояния UAC (контроль учетных записей пользователя) на конечном компьютере.

У меня на 64-х разрядных ОС были видны окна запускаемых из моего VB6 приложения установщиков программ, например, установщика AccessRuntime, и не были видны открываемые pdf-файлы и распаковываемые sfx rar архивы.


А есть ли способ помимо того, что описан в примечании, чтобы корректно запустилась программа написанная для 32-х на 64-х разрядных системах?

Аватара пользователя
UncleFather
Site Admin
Сообщения: 1505
Зарегистрирован: 17 авг 2004 16:20, Вт
Контактная информация:

Re: VB. Запускаем свой exe-шник от имени администратора

Сообщение UncleFather »

BogdaN писал(а):

А есть ли способ помимо того, что описан в примечании, чтобы корректно запустилась программа написанная для 32-х на 64-х разрядных системах?

По логике, такого способа нет. Для полноценной работы в 64-х разрядной среде нужно писать приложения соответствующей разрядности. Так как 32-х разрядные в такой среде работают с ограничениями, то, например, они просто не видят некоторые ветки реестра и объекты файловой системы в 64-х разрядной среде.


Alexander A. Manaeff©

Понравилась статья? Будем крайне признательны за репосты в соцсетях! Материально поддержать проект можно здесь

Мои странички:
ВКонтакте
Одноклассники
Youtube
Facebook
Instagram

Изображение
Изображение
Изображение
Изображение

BogdaN
Сообщения: 3
Зарегистрирован: 07 ноя 2016 16:18, Пн

Re: VB. Запускаем свой exe-шник от имени администратора

Сообщение BogdaN »

UncleFather писал(а):
BogdaN писал(а):

А есть ли способ помимо того, что описан в примечании, чтобы корректно запустилась программа написанная для 32-х на 64-х разрядных системах?

По логике, такого способа нет. Для полноценной работы в 64-х разрядной среде нужно писать приложения соответствующей разрядности. Так как 32-х разрядные в такой среде работают с ограничениями, то, например, они просто не видят некоторые ветки реестра и объекты файловой системы в 64-х разрядной среде.

Еще один вопрос. На сколько сложно переписать х32 приложение в х64?

Аватара пользователя
UncleFather
Site Admin
Сообщения: 1505
Зарегистрирован: 17 авг 2004 16:20, Вт
Контактная информация:

Re: VB. Запускаем свой exe-шник от имени администратора

Сообщение UncleFather »

BogdaN писал(а):

Еще один вопрос. На сколько сложно переписать х32 приложение в х64?

Дельное замечание. :oops: Конечно же, в общем случае не «переписать», а «скомпилировать». Но иногда нужно будет действительно именно переписать, с учетом того, что х32 приложения не «видят» в 64-х разрядных ОС некоторые объекты файловой системы и реестра, а так же, учитывая то, что некоторые объекты перенесены в другие места или просто не существуют в 32-х битных ОС, например SysWOW64 в файловой системе и Wow6432Node в реестре.


Alexander A. Manaeff©

Понравилась статья? Будем крайне признательны за репосты в соцсетях! Материально поддержать проект можно здесь

Мои странички:
ВКонтакте
Одноклассники
Youtube
Facebook
Instagram

Изображение
Изображение
Изображение
Изображение

BogdaN
Сообщения: 3
Зарегистрирован: 07 ноя 2016 16:18, Пн

Re: VB. Запускаем свой exe-шник от имени администратора

Сообщение BogdaN »

Тут скорее все-таки переписать. Дело в том, что большая часть кода была утеряна(остался один exe-шник).
Декомпилятор(VB Decompiler) вроде бы справился с задачей и показал код остальных форм(частями совпал с тем, что был на руках), но для того чтобы скомпилировать и подправить, знаний не хватает(
Возможно у Вас есть знакомые которые готовы посмотреть, что можно сделать?

Аватара пользователя
UncleFather
Site Admin
Сообщения: 1505
Зарегистрирован: 17 авг 2004 16:20, Вт
Контактная информация:

Re: VB. Запускаем свой exe-шник от имени администратора

Сообщение UncleFather »

BogdaN писал(а):

Тут скорее все-таки переписать. Дело в том, что большая часть кода была утеряна(остался один exe-шник).
Декомпилятор(VB Decompiler) вроде бы справился с задачей и показал код остальных форм(частями совпал с тем, что был на руках), но для того чтобы скомпилировать и подправить, знаний не хватает(
Возможно у Вас есть знакомые которые готовы посмотреть, что можно сделать?

Если речь идет о Visual Basic 6 - то я даже не видел у него 64-х разрядной версии. Есть, правда, обходной маневр Compiling 64 bit applications using Visual Studio 6, но и он подходит, судя по описанию, только для C/C++.

Поэтому, если компилятор VB6 не принципиален - можете писать, например, при помощи Visual Studio .NET (то есть поздних версий Visual Studio), учитывая материалы статьи Visual Studio IDE 64-Bit Support или Установка 64-разрядных компонентов Visual Studio.

Или воспользоваться вообще другой IDE, которая позволяет создавать 64-х разрядные приложения без лишних «заморочек».

Если Вас интересует переписывание Вашего ПО на возмездной основе - пишите в личку.


Alexander A. Manaeff©

Понравилась статья? Будем крайне признательны за репосты в соцсетях! Материально поддержать проект можно здесь

Мои странички:
ВКонтакте
Одноклассники
Youtube
Facebook
Instagram

Изображение
Изображение
Изображение
Изображение

Ответить