- Сообщения
- 5,379
- Репутация
- 2,724
Допустим, что вы написали программу, в ходе работы которой могут потребоваться права администратора, но в тоже время, ваша программа должна работать и для ограниченных пользователей (с урезанными возможностями). Если вы используете
то она не будет работать для ограниченных пользователей, только с правами администратора. Как в этом случае быть? Оказывается все очень просто. Достаточно изменить один параметр в файле манифеста - "asInvoker" на "highestAvailable". Как вариант, если вы используете для компиляции скриптов AutoIt3Wrapper, то достаточно в начале скрипта написать следующую строчку:
В этом случае, манифест будет изменен автоматически при компиляции скрипта. Теперь, ваша программ будет успешно работать как для ограниченных пользователей, так и для администраторов, не снижая их привелегий. Если этого не делать, то для администраторов программа конечно же будет работать, но только с правами ограниченных пользователей. Все это справедливо только с включенным User Account Control (UAC).
В случае запуска программы под учетной записью администратора, вы увидите привычное диалоговое окно UAC.
Нажимайте Yes и программа будет запущена с правами администратора. Для обычных пользователей, это окно показано не будет, и программа продолжит работать с ограниченными правами.
В принципе, на этом можно и остановиться, но меня напрягло то, что для моей программы отображается Publisher как Unknown. Обидно! После поиска решения выяснилось, что все не так уж и просто. Для того, чтобы в поле Publisher отображалось, например, ваше имя, нужно эту программу подписать, т.е. добавить электронный сертификат. А чтобы добавить сертификат поддерживаемый по умолчанию Microsoft, его (сертификат) нужно для начала купить, потратив кучу денег, времени и нервов. Но отчаиваться еще рано. Оказывается можно создать свой собственный сертификат (self-signed certificate). Конечно, с таким сертификатом ваша программа не пройдет проверку, но если его добавить в проверенные, то все будет работать как и положенно.
Итак, для начала нужно создать сертификат, это делается утилитой makecert.exe, которая входит в состав Microsoft Windows Software Development Kit (SDK). Командная строка для создания собственного сертификата имеет следующий вид:
Вместо "Vasya Pupkin" поставьте свое имя или еще что-нибудь. После этого появится окно с предупреждением. Нажимайте Yes, и ваш сертификат будет добавлен в список проверенных. Это нужно сделать только один раз на вашем компьютере и естественно с правами администратора. Теперь вы можете добавлять этот сертификат в ваши программы. Делается это с помощью утилиты signtool.exe из того же SDK:
Здесь "Vasya Pupkin" - это тоже самое, что вы указали при создании сертификата, а "MyProg.exe" - полный путь к вашей программе, в которую нужно добавить указанный сертификат.
ВАЖНО. После того, как сертификат был добавлен в файл, его (файл) уже нельзя изменять (добавлять или удалять ресурсы и т.д.), в противном случае сертификат будет удален из этого файла, и вам придется добавлять его снова.
Теперь, запустив программу, вы увидите диалоговое окно UAC такого вида (что, собственно и требовалось):
Одно замечание, если эту программу запустить на другом компьютере, на котором не установлен ваш сертификат, то окно UAC будет желтым, как и в первом случае, но, так как сертификат присутствует в самом файле, пользователь всегда может сам добавить его в список разрешенных. После чего, все ваши программы, подписанные этим сертификатом, будут у него запускаться как на втором скриншоте. А добавляется сертификат через диалог "File Properties" в несколько кликов мышкой:
ВАЖНО. Сертификат должен быть добавлен в хранилище Trusted Root Certification Authorities. Список установленных сертификатов можно посмотреть с помощью Microsoft Management Console (mmc.exe).
И на последок, т.к. утилита signtool.exe требует запуска командной строки с правами администратора, я написал простенький скрипт для подписи ваших программ (все необходимые утилиты находятся в архиве).
Sign.zip
Код:
#RequireAdmin
то она не будет работать для ограниченных пользователей, только с правами администратора. Как в этом случае быть? Оказывается все очень просто. Достаточно изменить один параметр в файле манифеста - "asInvoker" на "highestAvailable". Как вариант, если вы используете для компиляции скриптов AutoIt3Wrapper, то достаточно в начале скрипта написать следующую строчку:
Код:
#AutoIt3Wrapper_Res_RequestedExecutionLevel=highestAvailable
В этом случае, манифест будет изменен автоматически при компиляции скрипта. Теперь, ваша программ будет успешно работать как для ограниченных пользователей, так и для администраторов, не снижая их привелегий. Если этого не делать, то для администраторов программа конечно же будет работать, но только с правами ограниченных пользователей. Все это справедливо только с включенным User Account Control (UAC).
В случае запуска программы под учетной записью администратора, вы увидите привычное диалоговое окно UAC.
Нажимайте Yes и программа будет запущена с правами администратора. Для обычных пользователей, это окно показано не будет, и программа продолжит работать с ограниченными правами.
В принципе, на этом можно и остановиться, но меня напрягло то, что для моей программы отображается Publisher как Unknown. Обидно! После поиска решения выяснилось, что все не так уж и просто. Для того, чтобы в поле Publisher отображалось, например, ваше имя, нужно эту программу подписать, т.е. добавить электронный сертификат. А чтобы добавить сертификат поддерживаемый по умолчанию Microsoft, его (сертификат) нужно для начала купить, потратив кучу денег, времени и нервов. Но отчаиваться еще рано. Оказывается можно создать свой собственный сертификат (self-signed certificate). Конечно, с таким сертификатом ваша программа не пройдет проверку, но если его добавить в проверенные, то все будет работать как и положенно.
Итак, для начала нужно создать сертификат, это делается утилитой makecert.exe, которая входит в состав Microsoft Windows Software Development Kit (SDK). Командная строка для создания собственного сертификата имеет следующий вид:
Код:
makecert -r -pe -n "CN=Vasya Pupkin" -b 01/01/2010 -e 01/01/2019 -eku 1.3.6.1.5.5.7.3.3 -ss Root
Вместо "Vasya Pupkin" поставьте свое имя или еще что-нибудь. После этого появится окно с предупреждением. Нажимайте Yes, и ваш сертификат будет добавлен в список проверенных. Это нужно сделать только один раз на вашем компьютере и естественно с правами администратора. Теперь вы можете добавлять этот сертификат в ваши программы. Делается это с помощью утилиты signtool.exe из того же SDK:
Код:
signtool sign /s Root /n "Vasya Pupkin" "MyProg.exe"
Здесь "Vasya Pupkin" - это тоже самое, что вы указали при создании сертификата, а "MyProg.exe" - полный путь к вашей программе, в которую нужно добавить указанный сертификат.
ВАЖНО. После того, как сертификат был добавлен в файл, его (файл) уже нельзя изменять (добавлять или удалять ресурсы и т.д.), в противном случае сертификат будет удален из этого файла, и вам придется добавлять его снова.
Теперь, запустив программу, вы увидите диалоговое окно UAC такого вида (что, собственно и требовалось):
Одно замечание, если эту программу запустить на другом компьютере, на котором не установлен ваш сертификат, то окно UAC будет желтым, как и в первом случае, но, так как сертификат присутствует в самом файле, пользователь всегда может сам добавить его в список разрешенных. После чего, все ваши программы, подписанные этим сертификатом, будут у него запускаться как на втором скриншоте. А добавляется сертификат через диалог "File Properties" в несколько кликов мышкой:
ВАЖНО. Сертификат должен быть добавлен в хранилище Trusted Root Certification Authorities. Список установленных сертификатов можно посмотреть с помощью Microsoft Management Console (mmc.exe).
И на последок, т.к. утилита signtool.exe требует запуска командной строки с правами администратора, я написал простенький скрипт для подписи ваших программ (все необходимые утилиты находятся в архиве).
Код:
#RequireAdmin
#Include <Constants.au3>
Global Const $YourName = 'Vasya Pupkin'
Global Const $YourFile = 'MyProg.exe'
Global $Str = '', $Err = ''
$PID = Run('signtool.exe sign /s Root /n "' & $YourName & '" "' & $YourFile & '"', '', @SW_HIDE, BitOR($STDOUT_CHILD, $STDERR_CHILD))
While 1
$Str &= StdoutRead($PID)
If @error Then
ExitLoop
EndIf
WEnd
While 1
$Err &= StderrRead($PID)
If @error Then
ExitLoop
EndIf
WEnd
If $Err Then
MsgBox(16, 'SignTool', $Err)
Else
MsgBox(64, 'SignTool', $Str)
EndIf
Sign.zip