如何使用JScript中创建使用“以管理员身份运行”的快捷方式(How can I use JScr

2019-06-25 16:29发布

我有一个运行使用的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.它修改自ELEVATE是不可取的。)

由于快捷方式的目标实际上是“的Cscript.exe”,我不能使用清单进行升级。 我大概可以安装在理论上在Windows目录中的cscript.exe.manifest,但即使奏效,这将是对于那些显而易见的原因,一个可怕的想法。

我也不想使用的虚拟脚本,因为这是一个额外的文件处理和还有另一个,看似合理,解决手头:勾选“以管理员身份运行”快捷方式框中。

调查的三十秒钟揭示了WScript.Shell ActiveX对象没有为此所需的接口。 进一步调查表明,IShellLinkDataList一样。 然而,IShellLinkDataList是一个通用的COM接口。 我看到周围的互联网的几个例子,大多数链接在这里 。 然而,所有的例子做在编译的代码(C ++,C#,甚至JScript.NET)。 我显著更喜欢能够直接做到在JScript中,从运行cscript.exe

这就是说,我所有的想法,我没有考虑或其他解决方案。

Answer 1:

标志着一个快捷方式文件的要求抬高官方的方式是通过IShellLinkDataList 。 这是很难使用该接口从自动化环境。

但是,如果你是幸福的一个黑客,你可以做到这一点的剧本,只是在.lnk文件翻转了一下。

当你打勾的壳牌属性对话框,或当您的高级选项卡中的“以管理员身份运行”框中使用IShellLinkDataList设置标志 ,包括SLDF_RUNAS_USER ,你基本上只设置一个位在文件中。

您可以在“手动”做而不需要通过COM接口去。 这是21个字节,你需要设置为0x20位上。

(function(globalScope) {
    'use strict';
    var fso = new ActiveXObject("Scripting.FileSystemObject"),
        path = "c:\\path\\goes\\here\\Shortcut2.lnk",
        shortPath = path.split('\\').pop(),
        newPath = "new-" + shortPath;

    function readAllBytes(path) {
        var ts = fso.OpenTextFile(path, 1), a = [];
        while (!ts.AtEndOfStream)
            a.push(ts.Read(1).charCodeAt(0));
        ts.Close();
        return a;
    }

    function writeBytes(path, data) {
        var ts = fso.CreateTextFile(path, true),
            i=0, L = data.length;
        for (; i<L; i++) {
            ts.Write(String.fromCharCode(data[i]));
        }
        ts.Close();
    }

    function makeLnkRunAs(path, newPath) {
        var a = readAllBytes(path);
        a[0x15] |= 0x20; // flip the bit. 
        writeBytes(newPath, a);
    }

    makeLnkRunAs(path, newPath);

}(this));

PS:

function createShortcut(targetFolder, sourceFolder){
    var shell = new ActiveXObject("WScript.Shell"),
        shortcut = shell.CreateShortcut(targetFolder + "\\Run The Script.lnk"),
        fso = new ActiveXObject("Scripting.FileSystemObject"),
        windir = fso.GetSpecialFolder(specialFolders.windowsFolder);

    shortcut.TargetPath = fso.BuildPath(windir,"system32\\cscript.exe");
    shortcut.Arguments = "\"" + sourceFolder + "\\script.js\" /aParam /orTwo";
    shortcut.IconLocation = sourceFolder + "\\icon.ico";
    shortcut.Save();
}


文章来源: How can I use JScript to create a shortcut that uses “Run as Administrator”