Может ли Silverlight (SLOOB) запустить процесс даже при полном доверии?
-
21-09-2019 - |
Вопрос
Мне было поручено написать установщик с приложением silverlight out of browser.Мне нужно это сделать.
- получите версию из локального EXE-файла
- проверьте веб-службу, чтобы убедиться, что это самая последняя версия
- загрузите zip-файл, если нет
- распакуйте молнию
- перезапишите старый EXE-файл
- запустите исполняемый файл
Это установочное приложение сейчас написано на .NET WinForms, но .NET framework является препятствием для загрузки людьми.
Рекомендуемое решение - использовать SLOOB, однако я не уверен, как назначить полное доверие.Если я назначу полное доверие, смогу ли я запустить процесс.
Спасибо
Решение
Изучая это, я подозреваю, что вам придется создать процесс с использованием WMI через COM-интерфейс.В конце концов, это делает этот вариант очень сложным и очень подверженным сбоям по целому ряду причин (WMI отключен или защищен, пользователь не будет полностью доверять и т.д.). Я подозреваю, что вам было бы намного лучше создать пакет развертывания .msi или что-то подобное, который мог бы выйти и загрузить фреймворк, если это необходимо.Доступно множество моделей развертывания, почти все из которых превосходят эту.
Тем не менее, если вы собираетесь сделать это:
Чтобы получить COM-объект, вам нужно будет использовать AutomationFactory.CreateObject(...)
API. Тим Хойер приводит пример здесь.
Чтобы на самом деле выполнить сценарий WMI, вам потребуется создать WbemScripting.SWbemLocator
объект в качестве корня.Оттуда используйте ConnectServer
способ получить службу wmi на именованном компьютере.Затем вы можете допросить Win32_Process
модуль для создания новых процессов.
Редактировать:Я потратил немного времени на работу над этим, и даже на моем локальном компьютере в качестве администратора я сталкиваюсь с проблемами безопасности.Правильный код был бы чем-то похожим на:
dynamic locatorService = AutomationFactory.CreateObject("WbemScripting.SWbemLocator");
dynamic wmiService = locatorService.ConnectServer("winmgmts:{impersonationLevel=impersonate,authentationLevel=Pkt}//./root/cimv2");
dynamic process = wmiService.Get("Win32_Process");
dynamic createParameters = process.Methods_["Create"].InParameters.SpawnInstance_;
createParameters.CommandLine = "cmd.exe";
wmiService.ExecMethod("Win32_Process", "Create", createParameters);
Другие советы
Silverlight 4 будет иметь поддержку чего-то подобного: http://timheuer.com/blog/archive/2010/03/15/whats-new-in-silverlight-4-rc-mix10.aspx#sllauncher