У меня есть служба 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.