Как я могу автоматически поднять интерфейс COM, используемый для автоматизации? - PullRequest
0 голосов
/ 13 марта 2010

У меня есть служба Windows, созданная с помощью ATL для предоставления COM-интерфейса LocalServer32 для набора команд администратора, используемых для настройки службы, и их можно использовать из VBScript, например:

Set myObj = WScript.CreateObject("MySvc.Administrator")
myObj.DoSomething()

Я хочу, чтобы DoSomething запускался с повышенными правами, и я хотел бы, чтобы приглашение UAC автоматически появлялось при вызове VBScript. Возможно ли это?

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

objShell.ShellExecute WScript.FullName, Chr (34) и WScript.ScriptFullName & Chr (34), vbNullString, "runas"

например, для запуска самого VBScript с повышенными правами, и любой из них работает нормально - метод COM оказывается повышенным.

Тем не менее, AFAIK получает окно обозревателя с повышенными правами на рабочем столе запутанно (это не так просто, как щелкнуть правой кнопкой мыши Пуск / Стандартные / Проводник Windows / Запуск от имени администратора, что фактически не повышает или, по крайней мере, метод COM) не считает себя повышенным.) Я хочу, чтобы пользователь в локальной группе администраторов мог перетаскивать файлы и папки на сценарий, а затем вызывать сценарий для вызова интерфейса COM администратора с этими путями в качестве аргументов, и COM-метод должен быть повышен. (И я надеюсь на что-то более простое, чем разбираться с аргументами и использовать ShellExecute "runas".)

Я пытался установить для уровня выполнения UAC значение requireAdministrator в манифесте EXE-файла службы, а также установить Elevated / Enabled = 1 и LocalizedString в реестре для класса MySvc.Administrator, но это не помогает.

EDIT:

Когда я писал, что метод COM оказывается повышенным, я действительно имел в виду, что маркер безопасности входящего COM-запроса показывает, что он поступил от администратора. Я проверяю этот токен, чтобы увидеть, разрешен ли запрос. Процесс службы Windows, в котором находится COM-объект, вероятно, выполняется как LocalSystem.

Ответы [ 2 ]

0 голосов
/ 18 марта 2010

Чтобы ответить на мой собственный вопрос, да, возможно ли заставить диалог UAC появляться на лету из vbscript, который обращается к интерфейсу автоматизации моего сервиса.

У меня есть класс в службе Windows, который предоставляет интерфейс администратора для доступа к vbscripts. Этот интерфейс проверяет, есть ли у вас права на изменение службы, прежде чем вы сможете это сделать. Что происходит в Vista и Server 2008, так это то, что, если вы уже не находитесь в повышенном процессе (используя токен безопасности администратора), вы работаете с маркером ограниченного доступа, и поэтому интерфейс службы не позволяет вам что-либо делать.

Чтобы диалоговое окно UAC появилось и поднялось по пути к службе, я создал новый COM-сервер (EXE), который устанавливает тот же интерфейс администратора в классе и делает себя доступным для vbscript посредством автоматизации , Когда вы просите этот COM-объект сделать что-то, он просто обращается к службе, создает экземпляр COM-объекта службы и запрашивает у него ту же самую вещь, выступая в качестве прокси для пересылки запроса.

Этот новый COM-сервер аннотирован в реестре, чтобы разрешить повышение с помощью COM Elevation Moniker msdn link .

Затем в скрипте vbscript вместо CreateObject () вы можете вызвать GetObject («Высота: администратор! Новый :)». В этот момент, когда вы создаете объект COM, появляется диалоговое окно UAC, и этот объект запускается в повышенный процесс, и вуаля, я получаю то, что хотел: когда вам нужно получить доступ к интерфейсу администратора, в диалоговом окне UAC появляется отображаемая строка (и, возможно, значок) по вашему выбору, и вызов службы показывает привилегии администратора.

И я должен упомянуть, чтобы сохранить привилегии администратора для повышенного COM-объекта, поскольку он, в свою очередь, вызывает COM-объект службы Windows, я вызываю SetBlanket для использования маскировки при цепном вызове. Я нашел отличную информацию об этом здесь: Программирование на стороне клиента .

0 голосов
/ 14 марта 2010

VBScripts размещается в процессе размещения сценариев, поэтому сценарий «наследует» контекст безопасности хоста сценариев Windows. Если процесс хостинга повышен, то скрипт имеет повышенные права. Невозможно повысить уровень одного интерфейса или одного вызова метода вне контекста безопасности процесса хостинга.

Еще одна вещь, на которую следует обратить внимание, это то, что когда процесс без повышенных прав запускает UAC с повышенными правами, всегда отображается подтверждение. Таким образом, когда невыпущенный исследователь делает «runas» в сценарии, пользователь должен подтвердить. Когда сценарий без повышенных прав выполняет «runas» для себя, пользователь также должен подтвердить.

...