Alexander A Manaeff -

 
 

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

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

Модератор: UncleFather

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

Сообщение UncleFather » 21 июн 2016 11:54, Вт

Задача:

Имеется установленная 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 КБ) Просмотров: 1438

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




Решение 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.
Аватара пользователя
UncleFather
Site Admin
 
Сообщения: 1307
Зарегистрирован: 17 авг 2004 16:20, Вт

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

Сообщение BogdaN » 07 ноя 2016 16:46, Пн

UncleFather писал(а):


Примечание:


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

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

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





А есть ли способ помимо того, что описан в примечании, чтобы корректно запустилась программа написанная для 32-х на 64-х разрядных системах?
BogdaN
 
Сообщения: 3
Зарегистрирован: 07 ноя 2016 16:18, Пн

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

Сообщение UncleFather » 08 ноя 2016 10:29, Вт

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


По логике, такого способа нет. Для полноценной работы в 64-х разрядной среде нужно писать приложения соответствующей разрядности. Так как 32-х разрядные в такой среде работают с ограничениями, то, например, они просто не видят некоторые ветки реестра и объекты файловой системы в 64-х разрядной среде.
Аватара пользователя
UncleFather
Site Admin
 
Сообщения: 1307
Зарегистрирован: 17 авг 2004 16:20, Вт

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

Сообщение BogdaN » 09 ноя 2016 14:58, Ср

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


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


Еще один вопрос. На сколько сложно переписать х32 приложение в х64?
BogdaN
 
Сообщения: 3
Зарегистрирован: 07 ноя 2016 16:18, Пн

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

Сообщение UncleFather » 10 ноя 2016 07:08, Чт

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


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

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

Сообщение BogdaN » 10 ноя 2016 13:46, Чт

Тут скорее все-таки переписать. Дело в том, что большая часть кода была утеряна(остался один exe-шник).
Декомпилятор(VB Decompiler) вроде бы справился с задачей и показал код остальных форм(частями совпал с тем, что был на руках), но для того чтобы скомпилировать и подправить, знаний не хватает(
Возможно у Вас есть знакомые которые готовы посмотреть, что можно сделать?
BogdaN
 
Сообщения: 3
Зарегистрирован: 07 ноя 2016 16:18, Пн

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

Сообщение UncleFather » 10 ноя 2016 16:43, Чт

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-х разрядные приложения без лишних «заморочек».

Если Вас интересует переписывание Вашего ПО на возмездной основе - пишите в личку.
Аватара пользователя
UncleFather
Site Admin
 
Сообщения: 1307
Зарегистрирован: 17 авг 2004 16:20, Вт


Вернуться в Visual Basic

Кто сейчас на конференции

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

Alexander A Manaeff -
@Mail.ru .