Что нового

Как запросить повышение прав в определенном участке кода Autoit?

kasper_sky

Antivirus
Сообщения
116
Репутация
1
Всем привет.

Затачиваю программу под UAC в Win7 и 8, изначально написанную под XP.
Вопрос: можно ли с помощью AutoIt в определенном участке кода запросить временное повышение прав?(например, для сохранения настроек, требующих прав админа)

Включение в начале скрипта директивы requireAdministrator не представляется возможным, так как скрипт должен стартовать вместе с Windows. Скрипт автоматически не запускается при старте Windows, если в директиве указаны права requireAdministrator или highestAvailable(оно и понятно - с чего бы винде запускать никем не подписанный exe, да еще и требующий наивысших прав?).

Или же, если решения для этой проблемы нет, то посоветуйте, как запустить определенный скомпилированный скрипт AutoIt с правами администратора из другого скрипта AutoIt(напоминаю, requireAdministrator использовать нельзя).
 
Автор
K

kasper_sky

Antivirus
Сообщения
116
Репутация
1
sngr
Смотрел в сторону этого варианта. Но мне заранее неизвестен пароль администратора, например.
Идеальным вариантом было бы, чтобы окошко UAC запрашивало разрешение/пароль.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
$user=InputBox()
$pass=InputBox()
runas($user,@ComputerName,$pass,1,....)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
kasper_sky,
А если как-то так попробовать?
Код:
#include <Restart.au3>

If Not @Compiled Then Exit 13

If WinExists(@ScriptName & '{[/@$@\]}') Then Exit
AutoItWinSetTitle(@ScriptName & '{[/@$@\]}')

If StringInStr($CmdLineRaw, 'admin') Then
	#RequireAdmin
EndIf

HotKeySet('^1', '_Restart_Admin');Ctrl+1
HotKeySet('+{Esc}', '_Exit');Shift+Esc
MsgBox(64, 'Info', $CmdLineRaw)
While 1
	Sleep(1000)
	ToolTip(@SEC, 0, 0)
WEnd

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Func _Restart_Admin()
	If Not $CmdLineRaw Then
		$CmdLineRaw = '"admin"'
	Else
		If Not StringInStr($CmdLineRaw, 'admin') Then $CmdLineRaw &= ' "admin"'
	EndIf
	_ScriptRestart()
EndFunc   ;==>_Restart_Admin

Restart.au3
 
Автор
K

kasper_sky

Antivirus
Сообщения
116
Репутация
1
sngr
ИМХО это будет выглядеть как вымогательство.

madmasles
И так пробовал - не подходит. Сразу же выскакивает UAC, то есть AutoIt не смотрит на условные операторы, а компилирует сразу же с директивой #RequireAdmin.
Я, вроде, какую-то дискуссию по этому поводу когда-то видел на этом форуме, но не вспомню где и как. Поиск тоже ничего не дает.
OffTopic:
Кстати, что случилось с поиском? Постоянно выдает "The database value you're trying to insert does not exist: id_search"
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Это будет выглядеть как вооружённое нападение, с нанесением тяжких телесных повреждений. Ты обкурился, что-ли? Чем InputBox хуже #RequireAdmin?
 
Автор
K

kasper_sky

Antivirus
Сообщения
116
Репутация
1
sngr
Я не курю, и вам не советую.
А как вымогательство это будет выглядеть потому, что пользователь может заподозрить, что данные, вводимые в эти инпутбоксы, могут где-то сохранить и применить в злых умыслах. Повторюсь, это мое ИМХО.

Если есть другие варианты - буду рад почитать.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
То есть убогий InputBox пособник террористов, наркоторговцев и прочих сил зла, его по лицу сразу видно, а окно RequireAdmin символизирует демократию и прочую херь. К тому же нарисовать похожее на RequireAdmin окно совсем невозможно, правда ведь? Но это всё лирика. Скажем, перерыл ты msdn и нашёл, как через dllcall вызвать RequireAdmin песередь скрипта. Телепатирую, что эта функция повышает права всему процессу. Закончился кусок кода, требующий повышеный прав - как ты собираешься понижать права обратно? Если не собираешься, то к чему все извращения? Не можешь обойтись без админских прав - требуй их с самого начала.
 
Автор
K

kasper_sky

Antivirus
Сообщения
116
Репутация
1
sngr [?]
Не можешь обойтись без админских прав - требуй их с самого начала.
Почитайте, пожалуйста, мой стартпост ЕЩЕ РАЗ и ПОВНИМАТЕЛЬНЕЕ:

kasper_sky [?]
Включение в начале скрипта директивы requireAdministrator не представляется возможным, так как скрипт должен стартовать вместе с Windows. Скрипт автоматически не запускается при старте Windows, если в директиве указаны права requireAdministrator или highestAvailable(оно и понятно - с чего бы винде запускать никем не подписанный exe, да еще и требующий наивысших прав?).



Добавлено:
Сообщение автоматически объединено:

sngr [?]
То есть убогий InputBox пособник террористов, наркоторговцев и прочих сил зла, его по лицу сразу видно, а окно RequireAdmin символизирует демократию и прочую херь.
Вы, видимо, с UAC не имели дела. Что же, вам повезло, если так.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
kasper_sky [?]
Скрипт автоматически не запускается при старте Windows, если в директиве указаны права requireAdministrator или highestAvailable
скрипт не запускается если при включенном UAC в скрипте не указано requireAdministrator, а при указании этого параметра, будет запрос на доступ.
но автор пишет об обратном. читаю и не могу понять что вообще надо :smile:


Добавлено:
Сообщение автоматически объединено:

да, возникло предположение- в системе отключен UAC и при определенных обстоятельствах нужно включить его , а после отключить. так?
вот интересные размышления http://forum.oszone.net/nextoldesttothread-216135.html
 
Автор
K

kasper_sky

Antivirus
Сообщения
116
Репутация
1
joiner [?]
читаю и не могу понять что вообще надо
Попробую объяснить еще раз.
Если скомпилировать скрипт с директивой requireAdministrator и поставить в автозагрузку Windows, то при запуске Windows скрипт не запускается.
И наоборот, если при компиляции не указывать никаких прав, то скомпилированный скрипт нормально стартует вместе с Windows.

Понятно изъясняюсь? ;)


Добавлено:
Сообщение автоматически объединено:

joiner [?]
да, возникло предположение- в системе отключен UAC и при определенных обстоятельствах нужно включить его , а после отключить. так?
Нет :smile:
В системе постоянно включен UAC. Скрипт я копилирую без запроса прав администратора. Но в определенный момент скрипта мне могут понадобится права админа для сохранения некоторых настроек.
Вот тогда-то мне и надо повышение прав.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
kasper_sky [?]
при запуске Windows скрипт не запускается
Единственный способ - использовать планировщик задач. Управлять им можно утилитой schtasks.exe. Но, чтобы создать задачу, нужны права администратора.
можно ли с помощью AutoIt в определенном участке кода запросить временное повышение прав?
С повышенными правами может быть запущен либо основной процесс, либо дочерний процесс (поток). Т.к. AutoIt с потоками не работает, то повышение прав возможно только перезапуском всего скрипта.
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Как вариант:
Генерировать код сохранения в виде *.au3 файла и кидать его в TEMP, затем используя собственный *.EXE как интерпретатор запускать этот код с правами админа.
Получится что-то вроде альтернативного потока.
 
Автор
K

kasper_sky

Antivirus
Сообщения
116
Репутация
1
InnI [?]
Единственный способ - использовать планировщик задач.
Использование планировщика тоже не приветствуется, к сожалению.

С повышенными правами может быть запущен либо основной процесс, либо дочерний процесс (поток). Т.к. AutoIt с потоками не работает, то повышение прав возможно только перезапуском всего скрипта.
Либо так, либо
kasper_sky [?]
посоветуйте, как запустить определенный скомпилированный скрипт AutoIt с правами администратора из другого скрипта AutoIt(напоминаю, requireAdministrator использовать нельзя)



Добавлено:
Сообщение автоматически объединено:

ynbIpb [?]
Как вариант:Генерировать код сохранения в виде *.au3 файла и кидать его в TEMP, затем используя собственный *.EXE как интерпретатор запускать этот код с правами админа.
Идея хороша.
Можно пример?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
kasper_sky [?]
посоветуйте, как запустить определенный скомпилированный скрипт AutoIt с правами администратора из другого скрипта AutoIt
Подготовить скомпилированный скрипт, выполняющий нужные действия и включающий ключевое слово
Код:
#RequireAdmin

Для включения/извлечения скрипта использовать функцию
Код:
FileInstall()

Запустить скрипт через
Код:
Run() ; или
ShellExecuteWait()

Удалить скрипт функцией
Код:
FileDelete()

Необходимые параметры можно передавать через командную строку или временный файл.


Добавлено:
Сообщение автоматически объединено:

Скрипт admin.au3 (он же admin.exe)
Код:
#RequireAdmin
RunWait("notepad.exe")

Скрипт test.au3
Код:
FileInstall("admin.exe", "*")
Run("admin.exe")
Do
  Sleep(100)
Until Not ProcessExists("admin.exe")
FileDelete(@ScriptDir & "\admin.exe")
MsgBox(0, "test", "the end")
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 243, 81, 608, 386)
$Button1 = GUICtrlCreateButton("Button1", 80, 24, 75, 25)
GUISetState(@SW_SHOW)


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            $script = '#RequireAdmin' & @CRLF & _
			'Run("cmd.exe")' & @CRLF & _
			'MsgBox(0,"", " скрипт запущен с запросом прав")'
            $file = FileOpen(@TempDir &'\1.tmp',2)
            FileWrite($file,$script)
            FileClose($file)
            Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @TempDir &'\1.tmp' & '"')
    EndSwitch
WEnd
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
kasper_sky сказал(а):
...можно ли с помощью AutoIt в определенном участке кода запросить временное повышение прав?

Нет, только на весь процесс целиком. Советую убрать из кода то, что требует повышенных прав. Ну, или пересмотреть логику взаимодействия программы с пользователем.

kasper_sky сказал(а):
...посоветуйте, как запустить определенный скомпилированный скрипт AutoIt с правами администратора из другого скрипта AutoIt.

Код:
ShellExecute(..., '', '', 'runas')
 
Автор
K

kasper_sky

Antivirus
Сообщения
116
Репутация
1
Проблема решилась благодаря подсказке пользователя ynbIpb:
ynbIpb [?]
Генерировать код сохранения в виде *.au3 файла и кидать его в TEMP, затем используя собственный *.EXE как интерпретатор запускать этот код с правами админа.

Если кому-то понадобится, то вот код (запускать скомпилированным):
Код:
#include <GUIConstants.au3>

If Not @compiled Then Exit 2

$gui = GUICreate('', 200, 50)

$icon = GUICtrlCreateIcon(@SystemDir & '\UserAccountControlSettings.exe', 0, 5, 7, 16, 16)
$button = GUICtrlCreateButton('Launch', 25, 5, 60, 20)

GUISetState()

Do
	$GuiMsg = GUIGetMsg()
	Switch $GuiMsg
		Case $button
			$sScript = '#RequireAdmin' & @CRLF & 'MsgBox(0, "IsAdmin = " & IsAdmin(), "Сейчас действуют права администратора")'
			_Script_Execute($sScript)
			MsgBox(0, '', 'Выполнение завершено')

	EndSwitch
Until $GuiMsg = -3





Func _Script_Execute($sScriptText)
	FileDelete(@TempDir & '\ExecuteWithAdminRights.au3')
	FileWrite(@TempDir & '\ExecuteWithAdminRights.au3', $sScriptText)

	RunWait(@AutoItExe & ' /AutoIt3ExecuteScript "' & @TempDir & '\ExecuteWithAdminRights.au3"')
	While True
		Sleep(50)
		$aiProcessList = ProcessList(@ScriptName)
		If $aiProcessList[0][0] == 1 Then ExitLoop
	WEnd

	FileDelete(@TempDir & '\ExecuteWithAdminRights.au3')
EndFunc
 

Yashied

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