PDA

Показать полную графическую версию : [решено] Запуск приложения с обычными/пониженными правами


parkone
14-01-2014, 01:52
Сразу скажу: Разные похожие темы есть на форуме, но в них рассмотрено либо наследование прав, либо их повышение. Понижения или отключения наследования прав найти нигде не удалось.

Ситуация такая: определенная программа автоматически запускается с правами администратора при входе в виндовз (через плановщик винды),
в свою очередь она может запускать другие программы, которые по умолчанию наследуют ее права (т.е. будут вызваны от имени администратора).
А нужно чтобы дочерние программы запускались с обычными правами (т.е. как и большинство программ в системе), т.е. запретить RunAsInvoker (наследование прав от родительского процесса)

Что пробовал:

1) Стандартная утилита RUNAS (http://www.windowsfaq.ru/content/view/85/57/), которая запускает программы с разрешениями, отличными от тех, которые предоставляет текущая учетная запись
RUNAS /trustlevel:<TrustLevel> program
/showtrustlevels displays the trust levels that can be used as arguments to /trustlevel.
/trustlevel <Level> should be one of levels enumerated in /showtrustlevels.Говорят что работает, но моя попытка понизить права не удалась.
Elevation PowerToys (http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx), который как я понял основан на RUNAS тоже не выглядит работоспособным даже Elevation PowerToys последней версии (http://blogs.technet.com/b/deploymentguys/archive/2009/01/21/the-elevation-powertoys-and-windows-7.aspx).

2) Для повышения прав встречаются такие решения, может есть что-то подобное для понижения прав?
C:\Windows\System32\cmd.exe /C set __COMPAT_LAYER=RunAsInvoker & start “” “C:\Program Files (x86)\raidcall\raidcall.exe”Но судя по доступным флагам (http://support.microsoft.com/kb/286705/en-us) такой возможности не предусмотрено.

3) Утилита PsExec (http://technet.microsoft.com/ru-ru/sysinternals/bb897553.aspx) с ключом -l [и ключом -d, чтобы не появлялись черные окна, которые ожидают закрытия запускаемой программы]
Единственный вариант который работает (http://blogs.technet.com/b/markrussinovich/archive/2006/03/02/running-as-limited-user-the-easy-way.aspx), программа запускается с пониженными правами (хотелось бы конечно с нормальными) даже при том что родительский процесс имеет права администратора.
Но что-то с передачей параметров запускаемому приложению проблемно. Например, запуская такой код появляется только окно MS Access, а база не загружается с указанными параметрами (http://support.microsoft.com/kb/209207/ru)
PsExec.exe -l -d "C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE" "C:\база данных.accdb"Если ли еще варианты? Или как решить вопрос с передачей параметров в последнем варианте? Пробовал запустить батник, содержащий нужные инструкции - не помогло.
Upd: Похоже права понижаются слишком сильно (http://www.outsidethebox.ms/12167/), например, нет возможности создания пустой базы данных. Возможно ли повысить заниженные права до нормальных (чтобы Process Explorer показывал "средний обязательный уровень" вместо "низкий обязательный уровень")?

Тэги: Force Run As Limited User, Force a program to run without administrator privileges, Runs a program as non-elevated user, Запуск приложения без повышенных прав (с правами обычного пользователя), Понижение прав приложений

Vadikan
14-01-2014, 10:07
parkone, что мешает сделать еще одно задание планировщика без повышенных прав для запуска программ?

parkone
14-01-2014, 12:47
Vadikan, программа должна работать во всех приложениях, в том числе и тех, которые работают от имени администратора. Но дочерние процессы должны запускаться с обычными правами, иначе нарушается взаимодействие с другими приложениями, которые не имеют прав администратора. В целом: некоторым программам нужны эти права, другим нет, но винда дает нормальные средства только для повышения прав, понижение через одно место кое-как только работает.

Iska
14-01-2014, 13:29
но винда дает нормальные средства только для повышения прав, понижение через одно место кое-как только работает. »
Это Ваша цель достаточно специфична. Ничто не мешает Вам в этом случае написать свой «RunAsNormalUser.exe».

parkone
14-01-2014, 14:05
Iska, разве что Марк Руссинович залогинится и даст несколько советов как это сделать )

На текущий момент вижу только вариант иметь какую-то предварительно запущенную с нормальными правами оболочку, которая сможет принимать команды на запуск дочерних процессов от управляющей программы (имеющей права администратора). Может кто подскажет чем можно воспользоваться для этих целей?

Vadikan
14-01-2014, 17:09
parkone, тогда запускайте программу с обычными правами, а уже для запущенных из нее программ форсируйте повышение (ваш способ 2)

Просто мне непонятно, что это за мифическая программа, и почему решение должно быть именно таким, каким вы его сформулировали, но не нашли способов реализации.

parkone
14-01-2014, 17:41
Vadikan, совсем не мифическая ) программа - AutoHotkey, в моем случае ее скрипты должны иметь доступ ко всем приложениями, а т.к. некоторые приложения запущены от имени администратора, то понятно что и AutoHotkey должен иметь эти же привелегии. Кроме прочего, скрипты ahk запускают дочерние процессы, которые наследуют права администратора, последнее как раз мешает. Часть проблемы решается обходным путем, эмулированием нажатий Win+1,2,3 и т.п. Но прикреплять все программы в панель задач - нонсенс.
Решение с повышением понятно не подходит, т.к. ahk запущена перманентно.
Придется поковыряться еще с RUNAS и если не получится, то попробовать запустить nircmd как службу (http://support.microsoft.com/kb/137890) и попробовать сделать запуск через него, хотя службы похоже имеют еще большие права, но нужно попробовать )

Iska
14-01-2014, 18:28
parkone, здесь: Run as standard (limited) user - Scripts - AutoHotkey Community (http://www.autohotkey.com/board/topic/72812-run-as-standard-limited-user/) смотрели, пробовали?

parkone
14-01-2014, 18:32
Iska, попробую, спасибо!

То что по ссылке не заработало, но решение отсюда (http://code.google.com/p/7plus/source/browse/Release2.3.1/Generic/Run.ahk?r=747) работает (на основе Task Scheduler Scripting Objects (http://msdn.microsoft.com/en-us/library/windows/desktop/aa383607%28v=vs.85%29.aspx)) позволяя запускать с параметрами и средним обязательным уровнем. Собственно то что я хотел попытаться сделать, но до использования Task Scheduler в качестве оболочки вряд ли бы додумался, не говоря о реализации ))


RunAsUser(Target, Arguments, WorkingDirectory)
{
static TASK_TRIGGER_REGISTRATION := 7 ; trigger on registration.
static TASK_ACTION_EXEC := 0 ; specifies an executable action.
static TASK_CREATE := 2
static TASK_RUNLEVEL_LUA := 0
static TASK_LOGON_INTERACTIVE_TOKEN := 3
objService := ComObjCreate("Schedule.Service")
objService.Connect()

objFolder := objService.GetFolder("\")
objTaskDefinition := objService.NewTask(0)

principal := objTaskDefinition.Principal
principal.LogonType := TASK_LOGON_INTERACTIVE_TOKEN ; Set the logon type to TASK_LOGON_PASSWORD
principal.RunLevel := TASK_RUNLEVEL_LUA ; Tasks will be run with the least privileges.

colTasks := objTaskDefinition.Triggers
objTrigger := colTasks.Create(TASK_TRIGGER_REGISTRATION)
endTime += 1, Minutes ;end time = 1 minutes from now
FormatTime,endTime,%endTime%,yyyy-MM-ddTHH`:mm`:ss
objTrigger.EndBoundary := endTime
colActions := objTaskDefinition.Actions
objAction := colActions.Create(TASK_ACTION_EXEC)
objAction.ID := "7plus run"
objAction.Path := Target
objAction.Arguments := Arguments
objAction.WorkingDirectory := WorkingDirectory ? WorkingDirectory : A_WorkingDir
objInfo := objTaskDefinition.RegistrationInfo
objInfo.Author := "7plus"
objInfo.Description := "Runs a program as non-elevated user"
objSettings := objTaskDefinition.Settings
objSettings.Priority := 6 ; здесь работает
objSettings.Enabled := True
objSettings.Hidden := False
objSettings.DeleteExpiredTaskAfter := "PT0S"
objSettings.StartWhenAvailable := True
objSettings.ExecutionTimeLimit := "PT0S"
objSettings.DisallowStartIfOnBatteries := False
objSettings.StopIfGoingOnBatteries := False
; objSettings.Priority := 6 ; здесь выдает ошибку
objFolder.RegisterTaskDefinition("", objTaskDefinition, TASK_CREATE , "", "", TASK_LOGON_INTERACTIVE_TOKEN )
}


Не разобрался только как добавить приоритет создаваемой задачи, вот так не работает
objSettings.Priority := 6В свойстве TaskDefinition.Settings (http://msdn.microsoft.com/en-us/library/windows/desktop/aa382556%28v=vs.85%29.aspx) по документации присутствует свойство Priority (http://msdn.microsoft.com/en-us/library/windows/desktop/aa383480%28v=vs.85%29.aspx)

Upd. Разобрался, просто перенес свойство Priority повыше, начало нормально работать ) Мозг перегрелся, но вопрос решен. Спасибо Iska и Vadikan за помощь!

P.S. запуск с пониженными правами через командную строку и schtasks.exe (http://superuser.com/questions/243605/how-do-i-specify-run-with-highest-privileges-in-schtasks)




© OSzone.net 2001-2012