javascript shellexecute przykład kodu
ShellExecute
. var shell = new ActiveXObject("Shell.Application");
shell.ShellExecute("notepad.exe", "", "", "open", 1); // uruchamia Notatnik
Kluczowe punkty
• Przeglądarka ≠ system operacyjny – sandbox blokuje ShellExecute
.
• Działające rozwiązania: WSH/HTA (JScript), Node.js (child_process
), Electron (shell.openPath
/ shell.openExternal
).
• ActiveX i IE są przestarzałe – do nowych projektów zaleca się Node.js lub Electron.
ShellExecute
to funkcja WinAPI uruchamiająca programy, otwierająca pliki, adresy URL itp. JavaScript w przeglądarce pracuje w piaskownicy, dlatego bezpośrednie wywołanie takiej funkcji jest blokowane.
ShellExecute
Środowisko JS | Dostęp do ShellExecute |
Typowy mechanizm | Komentarz |
---|---|---|---|
Przeglądarka (Chrome/Edge/Firefox) | NIE | brak | Sandbox; można co najwyżej window.open() dla URL |
Internet Explorer (tylko Windows) | TAK (warunkowo) | ActiveX / COM | Wymaga obniżenia zabezpieczeń |
WSH / HTA (plik .js/.hta uruchamiany lokalnie) | TAK | ActiveXObject("Shell.Application") |
Brak UI-sandbox, pełne uprawnienia użytkownika |
Node.js | TAK | child_process.exec/spawn |
Wieloplatformowo; pełne uprawnienia procesu |
Electron / NW.js | TAK | shell.openPath , shell.openExternal + child_process |
Frontend + backend w jednym |
Deno | TAK (od v1.28) | Deno.run() |
Tylko z flagą --allow-run |
a) HTA / Internet Explorer (ActiveX, COM)
<!-- plik launch.hta uruchomiony lokalnie -->
<script language="javascript">
function runCalc() {
var sh = new ActiveXObject("Shell.Application");
sh.ShellExecute("calc.exe", "", "", "open", 1); // kalkulator
}
</script>
<button onclick="runCalc()">Uruchom kalkulator</button>
b) Windows Script Host – plik openPdf.js
// cscript openPdf.js "C:\\temp\\raport.pdf"
var sh = new ActiveXObject("Shell.Application");
var pdf = WScript.Arguments.Item(0);
sh.ShellExecute(pdf, "", "", "open", 1);
c) Node.js (child_process
) – wieloplatformowo
const { spawn } = require('child_process');
function openFile(path) {
let cmd, args;
switch (process.platform) {
case 'win32': cmd = 'start'; args = ['""', path]; break;
case 'darwin':cmd = 'open'; args = [path]; break;
default: cmd = 'xdg-open'; args = [path]; break;
}
spawn(cmd, args, { stdio: 'ignore', shell: true });
}
openFile('https://www.example.com'); // otworzy URL w domyślnej przeglądarce
d) Electron – natywny, najbezpieczniejszy odpowiednik
// w procesie renderera lub głównym
const { shell } = require('electron');
// Otwiera plik w skojarzonej aplikacji
await shell.openPath('C:\\temp\\dokument.pdf');
// Otwiera URL w domyślnej przeglądarce
shell.openExternal('https://example.com');
• ActiveX/COM daje pełny dostęp do systemu → używać tylko w zaufanych, lokalnych skryptach.
• W Node.js zabezpieczać wejście użytkownika (spawn
z tablicą argumentów zamiast exec
, whitelist programów).
• Electron domyślnie izoluje renderera; komunikacja powinna iść przez IPC, a operacje systemowe wykonywać w procesie głównym.
spawnSync
z obsługą sigquit i strumieni wątkowych; Deno udostępnia Command
API z granularnymi uprawnieniami. vShow
w ShellExecute
:spawn
nie tworzy powłoki, więc minimalizuje ryzyko injection; exec
tworzy powłokę (cmd/sh). HKEY_CLASSES_ROOT\myapp\shell\open\command
).shell
lub IPC → main → child_process
, nigdy bezpośrednio z renderera. xdg-open
w Linux wymaga środowiska graficznego – na serwerach headless nie zadziała. Native Messaging
(Chrome Extension ↔ aplikacja native). ShellExecute
jest natywnym API systemu Windows, niedostępnym z poziomu „zwykłego” JavaScriptu w przeglądarce. Można z niego skorzystać jedynie:
child_process
, shell
.Ponieważ ActiveX jest przestarzały, nowe projekty powinny wybierać Node.js, Electron lub alternatywy desktop-web, dbając o walidację danych i uprawnienia systemowe.