JavaScript ShellExecute – przykłady kodu ActiveX, Node.js, Electron, WSH

Pytanie

javascript shellexecute przykład kodu

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • W „czystym” JavaScripcie uruchamianym w przeglądarce nie da się bez­pośrednio wywołać ShellExecute.
  • Można to zrobić wyłącznie w środowiskach Windows, które udostępniają COM/ActiveX (WSH, HTA, Internet Explorer) lub w środowiskach serwerowych/desktopowych (Node.js, Electron).
  • Przykładowy, najprostszy kod dla ActiveX (działa tylko w IE/HTA/WSH):
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.

Szczegółowa analiza problemu

1. Kontekst i teoria

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.

2. Środowiska, w których można/nie można użyć 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

3. Przykłady kodu

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');

4. Bezpieczeństwo

• 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.

5. Praktyczne zastosowania

  • Automaty otwierające raporty PDF po wygenerowaniu (WSH/Node.js/Electron).
  • Integracje desktopowe (np. „Otwórz w Excelu” z aplikacji webowej → custom URL protocol).
  • Skrypty instalacyjne, które muszą wywołać instalator MSI.

Aktualne informacje i trendy

  • Microsoft zakończył wsparcie IE 11 (VI 2022) – ActiveX jest de-facto martwy.
  • Coraz popularniejsze jest desktop-web (Electron, Tauri, neutralinojs).
  • Node.js 20 wprowadza spawnSync z obsługą sigquit i strumieni wątkowych; Deno udostępnia Command API z granularnymi uprawnieniami.
  • Przeglądarki promują model „native messaging” (Chrome/Edge) i PWA zamiast ActiveX.

Wspierające wyjaśnienia i detale

  • Parametr vShow w ShellExecute:
    0 – SW_HIDE, 1 – SW_SHOWNORMAL, 2 – SW_SHOWMINIMIZED, 3 – SW_MAXIMIZE…
  • W Node.js spawn nie tworzy powłoki, więc minimalizuje ryzyko injection; exec tworzy powłokę (cmd/sh).
  • Custom URL protocol wymaga wpisów rejestru (HKEY_CLASSES_ROOT\myapp\shell\open\command).

Aspekty etyczne i prawne

  • Wywoływanie programów na komputerze użytkownika bez jego wiedzy narusza zasady bezpieczeństwa i może podlegać odpowiedzialności prawnej (RODO, Computer Misuse Act, prawo telekomunikacyjne).
  • Dystrybucja skryptów WSH/HTA wymaga podpisu cyfrowego w środowiskach korporacyjnych (GPO).

Praktyczne wskazówki

  1. Jeśli musisz pozostać w przeglądarce → rozważ custom protocol + service-side token (użytkownik świadomie klika).
  2. W Node.js zawsze waliduj dane wejściowe, unikaj konkatenacji command-line.
  3. W Electron korzystaj z shell lub IPC → main → child_process, nigdy bezpośrednio z renderera.
  4. W projektach korporacyjnych przygotuj polityki GPO umożliwiające uruchamianie podpisanego HTA.

Ewentualne zastrzeżenia lub uwagi dodatkowe

  • Rozwiązania ActiveX/IE przestaną działać na Windows 11 w trybie „IE mode” gdy Edge porzuci integrację (planowane w 2029).
  • xdg-open w Linux wymaga środowiska graficznego – na serwerach headless nie zadziała.

Sugestie dalszych badań

  • Sprawdź Tauri (Rust + JS) – lżejsza alternatywa dla Electron.
  • Zbadaj Native Messaging (Chrome Extension ↔ aplikacja native).
  • Zapoznaj się z WebUSB / WebSerial jeśli celem jest sterowanie sprzętem zamiast uruchamiania programów.

Krótkie podsumowanie

ShellExecute jest natywnym API systemu Windows, niedostępnym z poziomu „zwykłego” JavaScriptu w przeglądarce. Można z niego skorzystać jedynie:

  1. w legacy ActiveX (IE/HTA/WSH),
  2. w środowiskach serwerowych (Node.js) przez child_process,
  3. w desktopowych frameworkach (Electron) przez moduł 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.

Oceń odpowiedź:

Zadaj dodatkowe pytanie Sztucznej Inteligencji

Czekaj (1min)...
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.