Что нового

Запуск скрипта с правами администратора при включенном UAC

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Допустим, что вы написали программу, в ходе работы которой могут потребоваться права администратора, но в тоже время, ваша программа должна работать и для ограниченных пользователей (с урезанными возможностями). Если вы используете

Код:
#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
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Yashied
Огромное Вам спасибо!!!
Я всю последнюю неделю голову ломал, как это сделать.
Вы, как всегда, на высоте. :thanks:
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
madmasles сказал(а):
Я всю последнюю неделю голову ломал, как это сделать.
Ну так спросили бы на нашем форуме...

:smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
OffTopic:
Yashied [?]
Ну так спросили бы
Дык,... стесняюсь, однако. :-[

У меня пропала возможность поставить + , а очень хотелось.
 

gora

Знающий
Сообщения
315
Репутация
19
<FONT color=#0000ff>Yashied</FONT> [?]
Достаточно изменить один параметр в файле манифеста - "asInvoker" на "highestAvailable". Как вариант, если вы используете для компиляции скриптов AutoIt3Wrapper, то
1 Что какое "файл манифеста"?
2 Как быть, если AutoIt3Wrapper не используется?
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
gora сказал(а):
Что какое "файл манифеста"?
Открой .exe файл в любом редакторе реестра и сам все поймешь.
 

gora

Знающий
Сообщения
315
Репутация
19
Yashied
Спасибо, уже разобрался.
 

gora

Знающий
Сообщения
315
Репутация
19
Yashied
Несколько вопросов по предложенной методике:
1 Строка:
Код:
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
создает сертификат, но повторный ее запуск создает еще один сертификат на указанное имя и проверки наличия сертификата на указанное имя нет. При наличии нескольких сертификатов на одно имя в системе добавить цифровую подпись в файл не удается.
Может сделать проверку наличия сертификата на указанное имя в системе, дабы не плодить дубликаты?
2 Каждый сертификат на указанное имя, созданный в разное время и/или на разных машинах, будет индивидуален. Возникает такая ситуация:
- скомпилирована утилита и подписана сертификатом 1
- утилита разослана пользователям
- пользователям рекомендовано добавить сертификат 1 в "доверенные" по методике из шапки
- утилита обновлена автором на другом компьютере и подписана сертификатом 2. Просто автор на другом компьютере сделал себе сертификат и не знает, что он не совпадает с первым.
- утилита разослана пользователям
Теперь пользователям нужно добавить сертификат 2 в "доверенные"?
Логичнее автору подписывать все обновленные им версии утилиты единым сертификатом 1, но как его переносить с компьютера на компьютер для возможности в дальнейшем подписывать им утилиту на любом компьютере автора?
 

ynbIpb

Скриптер
Сообщения
398
Репутация
109
А есть ли возможность добиться того, чтобы окно UAC вообще не появлялось при условии, что UAC включён. Естественно только для тех файлов которые подписаны моей подписью (никаких зловредных намерений)
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
gora сказал(а):
Несколько вопросов по предложенной методике...
Добавьте в конец командной строки имя файла .cer, и сертификат будет записан в этот файл. Далее используйте только этот файл для установки сертификата. Или можете установить сертификат из любой ранее подписанной вами программы.

Код:
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.cer"
 

gora

Знающий
Сообщения
315
Репутация
19
<FONT color=#0000ff>Yashied</FONT> [?]
Далее используйте только этот файл для установки сертификата.
Этот вариант не подходит, ибо он позволяет сохранить и установить сертификат в системе, но использовать такой сертификат для подписи своих программ нельзя! Он этого не позволяет!
Но с этим вопросом мне удалось разобраться и перенос сертификата я смог сделать, а вот как сделать проверку наличия сертификата на указанное имя в системе, так и остался для меня нерешенным. Может есть какое-то решение?
 

gora

Знающий
Сообщения
315
Репутация
19
<FONT color=#ff0000>CreatoR</FONT> [?]
Как у тебя такое получилось?
Выделил текст для цитирования, нажал появляющуюся подсказку "Quote [++]" и это все попадает в окно Быстрого ответа.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
gora сказал(а):
Но с этим вопросом мне удалось разобраться и перенос сертификата я смог сделать.
Как ты это сделал?
 

gora

Знающий
Сообщения
315
Репутация
19
Создал сертификат Вашей ком. строкой
Экспортировал его с паролем в формате .pfx
Такой сертификат, при переносе и установке в другую систему, позволяет добавлять цифровую подпись.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Вот я и спрашиваю, как ты его экспортировал?

Я это делаю через утилиту pvkimprt.exe.

Код:
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 -sv selfcert.pvk selfcert.cer
cert2spc selfcert.cer selfcert.spc
pvkimprt -pfx selfcert.spc selfcert.pvk
del selfcert.cer
del selfcert.spc
del selfcert.pvk
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 166
Репутация
2 331
gora [?]
Выделил текст для цитирования, нажал появляющуюся подсказку "Quote [++]" и это все попадает в окно Быстрого ответа.
Какой у тебя браузер?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 166
Репутация
2 331
gora [?]
Спасибо, поправил. IE как всегда занимается произвольностью, сам вдруг решает убирать кавычки у color... :-X
 

gora

Знающий
Сообщения
315
Репутация
19
Можно ли средствами AutoIt проверить наличие цифровой подписи у файла.
 
Верх