2012-06-22 21 views
6

Tôi có tập lệnh JScript chạy bằng cscript.exe. Nó tạo ra một shortcut trên desktop (và trong menu start) chạy cscript.exe với các tham số để chạy một tập lệnh JScript khác. Có vẻ như, trong phần có liên quan, như sau:Làm cách nào để sử dụng JScript để tạo lối tắt sử dụng "Chạy với tư cách quản trị viên"

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(); 
} 

Nó được gọi là create_shortcut_at(desktop_folder, script_folder).

Và điều đó hoạt động, theo như nó đi. Nó tạo ra biểu tượng máy tính để bàn, chỉ đúng vào kịch bản và chạy nó khi nhấp đúp. Vấn đề là nó thực sự cần phải chạy kịch bản "như quản trị viên".

Và tập lệnh thực sự cần chạy "với tư cách quản trị viên" - nó cài đặt các ứng dụng (cho tất cả người dùng) và khởi động lại máy tính. (Đối với những người quan tâm, kịch bản là wpkg.js. Việc sửa đổi nó thành tự nâng cao là không mong muốn.)

Vì mục tiêu của lối tắt thực sự là "cscript.exe", tôi không thể sử dụng tệp kê khai cho việc leo thang . Tôi có thể về mặt lý thuyết có thể cài đặt một cscript.exe.manifest trong thư mục cửa sổ, nhưng ngay cả khi đó làm việc, nó sẽ là một ý tưởng khủng khiếp vì lý do đó là hiển nhiên.

Tôi cũng không muốn sử dụng tập lệnh giả, vì đó là tệp phụ để xử lý và có một giải pháp khác, có vẻ hợp lý, trong tầm tay: chọn hộp "Chạy với tư cách quản trị viên" trên lối tắt.

Ba mươi giây điều tra cho thấy đối tượng ActiveX WScript.Shell không có giao diện cần thiết cho việc này. Điều tra bổ sung cho thấy rằng IShellLinkDataList hiện. Tuy nhiên, IShellLinkDataList là một giao diện COM chung. Tôi thấy một số ví dụ trên Internet, hầu hết liên kết here. Tuy nhiên, tất cả các ví dụ làm điều đó trong mã biên dịch (C++, C#, thậm chí JScript.NET). Tôi thích có thể làm điều đó trực tiếp trong JScript, chạy từ cscript.exe.

Điều đó nói rằng, tôi tất cả vì những ý tưởng mà tôi không chiêm ngưỡng hoặc các giải pháp khác.

Trả lời

4

Cách chính thức để đánh dấu tệp lối tắt là yêu cầu độ cao là qua IShellLinkDataList. Rất khó để sử dụng giao diện đó từ môi trường tự động hóa.

Tuy nhiên, nếu bạn hài lòng với một hack, bạn có thể làm điều đó trong kịch bản, chỉ bằng cách lật một chút trong tệp .lnk.

Khi bạn đánh dấu vào ô "chạy dưới quyền quản trị" trong tab Nâng cao của hộp Thuộc tính Shell hoặc khi bạn use IShellLinkDataList to set the flags để bao gồm SLDF_RUNAS_USER, về cơ bản bạn chỉ cần đặt một chút trong tệp.

Bạn có thể làm điều đó "theo cách thủ công" mà không phải trải qua giao diện COM. Đó là byte 21 và bạn cần đặt bit 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

Để giúp mọi người trong tương lai, những người cần giải pháp này, các định dạng .lnk được quy định ở đây: http://msdn.microsoft.com/en-us/library/dd871305 (v = prot.13). Cụ thể, điều này sử dụng http://msdn.microsoft.com/en-us/library/dd891314(v=prot.13). Giải pháp rất thông minh, cảm ơn! – alficles