8

を使用して実行されるJScriptスクリプトがありますcscript.execscript.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」であるため、エスカレーションにマニフェストを使用することはできません。理論的には、Windowsディレクトリにcscript.exe.manifestをインストールすることもできますが、それが機能したとしても、明らかな理由から、それはひどい考えになります。

また、ダミースクリプトを使用しないことをお勧めします。これは、処理する余分なファイルであり、別の、一見合理的な解決策が手元にあるためです。ショートカットの[管理者として実行]チェックボックスをオンにします。

30秒間の調査により、WScript.ShellActiveXオブジェクトにこれに必要なインターフェイスがないことがわかりました。追加の調査は、IShellLinkDataListがそうすることを示唆しています。ただし、IShellLinkDataListは汎用COMインターフェイスです。私はインターネットの周りにいくつかの例を見ますが、ほとんどはここにリンクしています。ただし、すべての例はコンパイルされたコード(C ++、C#、さらにはJScript.NET)でそれを行います。から実行して、JScriptで直接実行できることを強く望んでいますcscript.exe

とは言うものの、私は思いもよらなかったアイデアや他の解決策を求めています。

4

1 に答える 1

8

ショートカットファイルを昇格が必要なものとしてマークする公式の方法は、を使用することですIShellLinkDataList。自動化環境からそのインターフェースを使用することは困難です。

ただし、ハッキングに満足している場合は、.lnkファイルを少し反転するだけでスクリプトで実行できます。

[シェルのプロパティ]ボックスの[詳細設定]タブで[管理者として実行]ボックスにチェックマークを付けるか、IShellLinkDataListを使用してフラグを含めるように設定するとSLDF_RUNAS_USER、基本的にファイルに1ビットを設定するだけです。

これは、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();
}
于 2012-06-23T01:50:47.320 に答える