2012-06-22 72 views
6

我有一個使用cscript.exe運行的JScript腳本。它在桌面(和開始菜單)上創建一個運行cscript.exe並帶有參數的快捷方式,以運行另一個JScript腳本。看起來,在相關部分,像這樣:如何使用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,但即使這樣做,這顯然是一個可怕的理由。

我也不想使用虛擬腳本,因爲這是一個額外的文件來處理,還有另一個看似合理的解決方案:檢查快捷方式上的「以管理員身份運行」框。

三十秒的調查顯示WScript.Shell ActiveX對象沒有所需的接口。額外的調查表明,IShellLinkDataList可以。但是,IShellLinkDataList是一個通用的COM接口。我在互聯網上看到了幾個例子,大多數連接here。但是,所有示例都是以編譯代碼(C++,C#,甚至是JScript.NET)來完成的。我非常希望能夠直接使用JScript,從cscript.exe運行。

這就是說,我都爲我沒有考慮過的想法或其他解決方案。

回答

4

將快捷方式文件標記爲需要提升的官方方法是通過IShellLinkDataList。從自動化環境中使用該接口很困難。

但是,如果您對破解感到高興,您可以在腳本中完成,只需在.lnk文件中翻轉一下即可。

當您在「殼牌屬性」框的「高級」選項卡中勾選「以管理員身份運行」框時,或者當您將use IShellLinkDataList to set the flags包括在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(); 
} 
+0

爲了幫助誰需要這個解決方案未來的人,在這裏指定的.LNK格式:http://msdn.microsoft.com/en-us/library/dd871305( v = prot.13)。特別是,它使用http://msdn.microsoft.com/en-us/library/dd891314(v=prot.13)。非常聰明的解決方案,謝謝! – alficles

相關問題