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

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн SyDr [?]

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

Сам пример:
Код: AutoIt [Выделить]
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
 


Русское сообщество AutoIt


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Windows 7 x86

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

"runas" содержит "%1" %*
« Последнее редактирование: Август 10, 2010, 12:00:31 от Yashied »


Думай, прежде чем говорить.

Оффлайн SyDr [?]

  • Локальный модератор
  • *
  • Сообщений: 649

  • Автор темы
  • Репутация: 157
  • Пол: Мужской
  • Сидра
    • Награды
  • Версия AutoIt: 3.3.12.0
Странно. Только что проверил все возможные комбинации ответов на MsgBox и запрос UAC. И в обычном варианте, и в скомпилированном. Во всех случаях скрипт отработал нормально. Система тоже Windows 7 x86
После непродолжительного теста было выявлено, что такое случается, если скрипт запускать с правами обычного пользователя при отключённом Контроле учётных записей пользователей. Естественно, что запрос UAC не выводится. Он же отключён  :laugh: В таком случае, в скрипте необходимо также проверить, включён или нет UAC, и в случае, если отключён, предложить пользователю самостоятельно перезапустить программу с правами администратора :)

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
SyDr, а разве #RequireAdmin делает не тоже самое?

Русское сообщество AutoIt


Оффлайн SyDr [?]

  • Локальный модератор
  • *
  • Сообщений: 649

  • Автор темы
  • Репутация: 157
  • Пол: Мужской
  • Сидра
    • Награды
  • Версия AutoIt: 3.3.12.0
Не совсем.
Использование #RequireAdmin равносильно (вроде бы :)):
Код: AutoIt [Выделить]

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

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

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Да, согласен.

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

Здесь не нужны права администратора, нужы только права на запись в HKEY_CLASSES_ROOT.
« Последнее редактирование: Август 10, 2010, 15:30:11 от Yashied »

Оффлайн SyDr [?]

  • Локальный модератор
  • *
  • Сообщений: 649

  • Автор темы
  • Репутация: 157
  • Пол: Мужской
  • Сидра
    • Награды
  • Версия AutoIt: 3.3.12.0
Ну как не нужны? В этот раздел обычные пользователи не имеют прав на запись. Только чтение. Записывать может сама система (SYSTEM) и Администраторы.

Оффлайн firex [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 943
  • Репутация: 203
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Прошу не считать это некропостингом, но все же я замучался  ;)

Банальный пример:
Код: AutoIt [Выделить]
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. В любом случае для корректной работы следует убрать проверку на получение прав.
« Последнее редактирование: Июнь 24, 2014, 08:24:22 от firex »

Русское сообщество AutoIt


Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2711
  • Репутация: 459
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
firex  [?]
Цитировать
Запускаем без полномочий администратора и жмем да, далее наблюдаем выполнение функции OnExit ( которого быть не должно ). Есть идеи почему так?
у меня, в учетке "гость", код крутится по кругу, пытаясь получить права админа (не удается), но не завершает работу
« Последнее редактирование: Июнь 24, 2014, 02:43:40 от joiner »
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
12 Ответов
9085 Просмотров
Последний ответ Март 15, 2010, 01:06:15
от bulldog5293
4 Ответов
1418 Просмотров
Последний ответ Октябрь 29, 2014, 10:01:03
от GUIMish
0 Ответов
768 Просмотров
Последний ответ Октябрь 31, 2014, 03:05:43
от Yashied
1 Ответов
1196 Просмотров
Последний ответ Август 08, 2015, 00:06:02
от Vovsla
0 Ответов
603 Просмотров
Последний ответ Январь 26, 2016, 21:18:45
от avtoIT
2 Ответов
719 Просмотров
Последний ответ Октябрь 30, 2016, 01:30:15
от Alofa
3 Ответов
505 Просмотров
Последний ответ Август 24, 2017, 17:28:26
от Prog
0 Ответов
196 Просмотров
Последний ответ Декабрь 11, 2017, 10:16:45
от Атос
0 Ответов
234 Просмотров
Последний ответ Январь 20, 2018, 09:04:01
от Бонифаций
6 Ответов
402 Просмотров
Последний ответ Апрель 06, 2018, 07:33:40
от zbz