我有一个运行使用的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
。
这就是说,我所有的想法,我没有考虑或其他解决方案。
标志着一个快捷方式文件的要求抬高官方的方式是通过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”