У меня есть сценарий JScript, который запускается с использованием cscript.exe
.Он создает ярлык на рабочем столе (и в меню «Пуск»), который запускает cscript.exe
с параметрами для запуска другого сценария JScript. В соответствующей части это выглядит так:
function create_shortcut_at(folder, target_script_folder)
{
var shell = new ActiveXObject("WScript.Shell");
var shortcut = shell.CreateShortcut(folder + "\\Run The Script.lnk");
shortcut.TargetPath = "cscript";
shortcut.Arguments = "\""+target_script_folder+"\\script.js\" /aParam /orTwo";
shortcut.IconLocation = target_script_folder+"\\icon.ico";
shortcut.Save();
}
Вызывается как create_shortcut_at(desktop_folder, script_folder)
.
И это работает, насколько это возможно. Он создает значок на рабочем столе, правильно указывающий на сценарий, и запускает его при двойном щелчке. Проблема в том, что действительно нужно запускать скрипт "от имени администратора".
И скрипт действительно нужно запускать «от имени администратора» — он устанавливает приложения (для всех пользователей) и перезагружает компьютер. (Кому интересно, это скрипт wpkg.js. Модифицировать его для самоповышения нежелательно.)
Поскольку целью ярлыка на самом деле является «cscript.exe», я не могу использовать манифест для эскалации. Вероятно, теоретически я мог бы установить cscript.exe.manifest в каталог Windows, но даже если бы это сработало, это была бы ужасная идея по очевидным причинам.
Я бы также предпочел не использовать фиктивный скрипт, так как это дополнительный файл, с которым нужно иметь дело, и есть еще одно, казалось бы, разумное решение: установить флажок «Запуск от имени администратора» на ярлыке.
Тридцатисекундное исследование показало, что объект ActiveX WScript.Shell не имеет необходимых для этого интерфейсов. Дополнительное исследование предполагает, что это делает IShellLinkDataList. Однако IShellLinkDataList — это универсальный COM-интерфейс. Я видел несколько примеров в Интернете, большинство из которых ссылаются на здесь. Однако все примеры делают это в скомпилированном коде (C++, C#, даже JScript.NET).Я значительно предпочитаю иметь возможность делать это непосредственно в JScript, работая из cscript.exe
.
Тем не менее, я полностью за идеи, которые я не рассматривал, или другие решения.