Как олицетворять встроенную роль администратора Windows для приложения WinForms, C #? - PullRequest
1 голос
/ 07 августа 2010

Кажется, что повышение привилегий - обычное дело, с которым борются большинство разработчиков, поскольку в большинстве случаев они просто не имеют этого.Я, например, делаю, но борюсь с массивной подпрограммой Background Worker, и я пытаюсь сохранить свой код локально для класса, который будет его использовать.Учитывая количество кода и ссылок, которые создает мой фоновый работник, когда он завершает работу внутри метода-обработчика RunWorkerCompleted, его непросто принять это как жизнеспособную альтернативу:

HOMEWORK 1:

РАБОТА С 2:

РАБОТА С 3:

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

Омега-кодер:

Прочитав CAS для экзамена 70-536, я знаю,большинства терминов в этом примере выше, но я не смог понять, как и почему это работает?Может кто-нибудь объяснить, почему разрешение предоставлено методу ManagersOnly?Как только PrincipalPolicy изменяется на WindowsPrincipal, следующие два шага выглядят как обычные операторы создания объектов, представленные примерно так:

System.AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal, IPrincipal, IIdentity);

Очевидно, что такой перегрузки не существует, но она очень ясно показывает, что делает эта перегрузка,

Вопрос 1: Как пример OmegaCoders достигает этого эффекта?Потому что он определенно работает, так как мой пользователь является частью группы «BUILTIN \ Administrators».Я ищу ответ, основанный на литературных источниках, так что пойдите как можно подробнее.

ОБНОВЛЕНИЕ 1:

Вопрос2: Как бы я вернул PrincipalPolicy обратно к тому, что было раньше ... как только метод вернется, мне не нужно, чтобы PrincipalPolicy все еще было установлено значение «WindowsPrincipal» ???Так что приложение может продолжать работать как пользователь с более низкими привилегиями, как я и предполагал.

Вопрос 3: Как только возвращается метод 'ManagersOnly', отклоняется ли разрешение?Это ограничено жизненным циклом метода?

System.AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.NoPrincipal);

* ОБНОВЛЕНИЕ 2: *

Это оказывается трудным делом, так как на моей машине разработчика Win7 Pro я могутестировать и запускать что угодно, но когда я попытался протестировать некоторый код на простом домашнем ноутбуке с Win7, я обнаружил, что разрешения запрещены.В связи с этим возникают вопросы, связанные с изменением PrincipalPolicy на WindowsPrincipal, который работает не для всех пользователей Vista и Win7, поскольку многие даже не входят в группу администраторов.Так что этот вариант бесполезен ... Сидя на этом маленьком ноутбуке, становится довольно очевидным, что это не то решение, которое мне нужно.

IGNORE PREVIOUS Qs - с моим собственным исследованием я сделал, что они неосуществимы.

Вопрос 4: как можно программно и временно выдать себя за администратора в коде?

1 Ответ

1 голос
/ 07 августа 2010

Краткий ответ - НЕТ.

Похоже, что после всех циклов копания, которые я проводил, не похоже на прогрессивный способ повышения разрешений метода, поскольку CAS дополняет RBS, поэтому, если пользователь не входит в нужную группу. Тогда нет никакого смысла даже в доступе к правам администратора, поскольку rbs сообщает cas, что пользователь не является частью группы, поэтому запрос отклоняется, а разрешение отклоняется. В результате чего исключение.

Если пользователь входит в группу, в которой вы нуждаетесь, например, в Администраторах, то смена Domains PrincipalPolicy даст вам временное решение, но оно не обслуживает пользователей, которые просто не входят в группы администраторов. Вот где вышеуказанное решение разваливается.

Длинный ответ таков: отгрузите подверженный проблеме код в небольшой отдельный файл .exe и запустите его отдельно.

...