Что нового

[Процессы] Пример запуска себя с админстраторскими правами (UAC)

SyDr

Сидра
Сообщения
651
Репутация
158
Зачем это может понадобиться? В качестве примера могу привести Process Explorer от Марка Руссиновича: он может работать как с правами администратора, так и с правами обычного пользователя (вполне возможно, что программу будет запускать пользователь без администраторских прав). Во втором случае он не отображает информацию о многих процессах. Пользователь может выбрать пункт в меню "Показать информацию обо всех процессах". Появится стандартный запрос UAC (различается в зависимости от того, какие у пользователя права есть). Если разрешение получено - запускается новая копия Process Explorer, имеющая права администратора. Старая закрывается.
Согласитесь, что требовать права администратора только в случае, когда это необходимо, лучше, чем требовать их всегда (косой взгляд в сторону одной директивы).

Сам пример:
Код:
If Not IsAdmin() Then ; прав администратора нет
	$answer = MsgBox(262144 + 256 + 48 + 4, Default, 'Программе необходимы полные администраторские права для работы. Предоставить их ей?')
	If $answer = 6 Then ; нажата кнопка Да
		ShellExecute(@AutoItExe, $CmdLineRaw, @WorkingDir , "runas", @SW_SHOWNORMAL)
		; 1) путь к файлу
		; 2) параметры
		; 3) рабочий каталог
		; 4) действие. В справке runas почему-то не задокументировано
		; 5) флаг. В данном случае используется тот же, что и был использован при запуске самой программы
		If Not @error Then ; если всё нормально - прекращаем работу
			Exit
		Else ; пользователь не разрешил скрипту внести изменения на компьютер
			MsgBox(262144 + 48, Default, 'Разрешение не получено. Программа завершает свою работу.')
			; можно работать дальше с обычными правами
			Exit
		EndIf
	Else ; пользователь нажал нет в диалоге скрипта
		MsgBox(262144 + 48, Default, 'Программе НУЖНЫ администраторские права для работы. Программа завершает свою работу.')
		Exit
	EndIf
Else ; права уже есть
	MsgBox(262144 + 48, '', 'Пора захыватывать мир :)')
EndIf
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Windows 7 x86

Пограмма зацикливается, постоянно выдает "Программе необходимы полные администраторские права для работы. Предоставить их ей?".

"runas" содержит "%1" %*
 
Автор
SyDr

SyDr

Сидра
Сообщения
651
Репутация
158
Странно. Только что проверил все возможные комбинации ответов на MsgBox и запрос UAC. И в обычном варианте, и в скомпилированном. Во всех случаях скрипт отработал нормально. Система тоже Windows 7 x86
После непродолжительного теста было выявлено, что такое случается, если скрипт запускать с правами обычного пользователя при отключённом Контроле учётных записей пользователей. Естественно, что запрос UAC не выводится. Он же отключён :laugh: В таком случае, в скрипте необходимо также проверить, включён или нет UAC, и в случае, если отключён, предложить пользователю самостоятельно перезапустить программу с правами администратора :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
SyDr, а разве #RequireAdmin делает не тоже самое?
 
Автор
SyDr

SyDr

Сидра
Сообщения
651
Репутация
158
Не совсем.
Использование #RequireAdmin равносильно (вроде бы :smile:):
Код:
If Not IsAdmin() Then
	ShellExecute(@AutoItExe, $CMDLineRaw, @WorkingDir, "runas", @SW_SHOWNORMAL)
	Exit
EndIf


В качестве примера могу привести ситуацию: необходимо добавить программу в автозапуск для всех пользователей. Для этого нужны права администратора. В этом случае при использовании #RequireAdmin программа всегда будет требовать права администратора. А при включённом UAC, насколько я знаю, из стандартных мест загрузки (Раздел реестра Run и каталог Автозагрузка) невозможно запустить программу с правами администратора. Или, как вариант, создавать ещё один скрипт с этой директивой, которой и будет производить необходимые изменения. :smile:

Или вот пример, приближенный к реальности :smile:: FTM, выдав сообщение о том, что не может сохранить изменения, может предложить пользователю перезапустить себя с правами администратора. При этом пользователи с включённым UAC и не имеющие возможности запустить программу с правами администратора, не лишаются возможности пользоваться программой (как это произошло бы в случае использования #RequireAdmin).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Да, согласен.

SyDr сказал(а):
Или вот пример, приближенный к реальности...

Здесь не нужны права администратора, нужы только права на запись в HKEY_CLASSES_ROOT.
 
Автор
SyDr

SyDr

Сидра
Сообщения
651
Репутация
158
Ну как не нужны? В этот раздел обычные пользователи не имеют прав на запись. Только чтение. Записывать может сама система (SYSTEM) и Администраторы.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Прошу не считать это некропостингом, но все же я замучался ;)

Банальный пример:
Код:
OnAutoItExitRegister( "OnExit" )

If Not IsAdmin() Then ; прав администратора нет
    $answer = MsgBox(262144 + 256 + 48 + 4, Default, 'Программе необходимы полные администраторские права для работы. Предоставить их ей?')
    If $answer = 6 Then ; нажата кнопка Да
		OnAutoItExitUnRegister( "OnExit" )
        ShellExecute(@AutoItExe, $CmdLineRaw, @WorkingDir , "runas", @SW_SHOWNORMAL)

        If Not @error Then
            Exit
        Else
            MsgBox(262144 + 48, Default, 'Разрешение не получено. Программа завершает свою работу.')
            Exit
        EndIf
    Else
        MsgBox(262144 + 48, Default, 'Программе НУЖНЫ администраторские права для работы. Программа завершает свою работу.')
        Exit
    EndIf
Else
    MsgBox(262144 + 48, '', 'Пора захыватывать мир :)')
EndIf

Func OnExit()
	MsgBox( 0, '', "wtf?" )
EndFunc

Запускаем без полномочий администратора и жмем да, далее наблюдаем выполнение функции OnExit ( которого быть не должно ). Есть идеи почему так?

В перезапущенном скрипте выполняется, вчера видимо перегрелся и не обратил внимания где стоит UnRegister. В любом случае для корректной работы следует убрать проверку на получение прав.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
firex [?]
Запускаем без полномочий администратора и жмем да, далее наблюдаем выполнение функции OnExit ( которого быть не должно ). Есть идеи почему так?
у меня, в учетке "гость", код крутится по кругу, пытаясь получить права админа (не удается), но не завершает работу
 
Верх