Как я могу использовать JScript для создания ярлыка, использующего «Запуск от имени администратора»

У меня есть сценарий 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.

Тем не менее, я полностью за идеи, которые я не рассматривал, или другие решения.

7
задан alficles 22 June 2012 в 19:23
поделиться