Esecuzione degli script DOS senza visualizzare la Console Windows

Quando vengono eseguiti gli script DOS (.bat e .cmd) Windows visualizza l’output nella Console Windows ovvero il Command Prompt (cmd.exe). Ovviamente ci sono casi in cui si preferisce non visualizzare la Console Window per evitare che l’utente venga distratto dall’output dello script che deve girare in modo silente.

Per ottenere tale risultato vi sono vari approcci a seconda del contesto in cui lo script viene eseguito.

Approccio 1: Nascondere la Console Window quando lo script è eseguito tramite un’operazione pianificata

Come discusso nel post The Startup Script is Dead di Mark Morowczynski (Senior Program Manager at Microsoft) sul blog Ask Premier Field Engineering (PFE) Platforms le operazioni pianificate sono un ottimo metodo per gestire l’automazione di task IT in quanto permettono un controllo granulare sulla modalità di esecuzione del task e una gestione centralizzata tramite le Group Policy Preferences:

“Windows scheduled tasks are a flexible and robust way to do IT automation—particularly for one-off cases where a broader framework would be overkill. Scheduled tasks give you fine grained control over scheduling, retries, security context, and conditions (like network connectivity). Task Scheduler is now a core component of Windows relied upon by Plug and Play, Group Policy, Diagnostics, PowerShell jobs, and more. Google relies on Task Scheduler to keep Chrome up to date. Unlike startup and logon scripts scheduled tasks always run independently of your logon critical path. Even if a logon triggered task takes a long time to run it will not block your logon.

To create Scheduled Tasks at scale, you can use one-time fan out approaches (suitable for modest number of reachable online servers) like PowerShell’s New-ScheduledTask. For broader reach you can also use pull based approaches like GPP: Scheduled Tasks.

With GPP: Scheduled Tasks you get all the goodness of Group Policy (e.g., scoping, layering, etc.), Group Policy Preferences (e.g., item level targeting), and the Windows Task Scheduler.

Need to run a script on thousands of machines, but not more than once a month—and it shouldn’t start until the network is online– and the script needs to do system level stuff without the end-user being a local admin—and the script should never block the user from logging in? GPP Scheduled Tasks can do that.”

Nel caso in cui si avvii uno script tramite un’operazione schedulata e si voglia evitare che venga visualizzata la Console Windows basterà selezionare l’opzione Esegui indipendentemente dalla connessione degli utenti, se lo script non deve accedere a risorse di rete per maggior sicurezza evitare di salvare la password dell’account con cui viene eseguita l’operazione schedulata selezionando l’opzione Non memorizzare la password. L’attività avrà accesso solo alle risorse del computer locale.

Approccio 2: Nascondere la Console Window quando lo script è eseguito tramite Group Policy all’accesso o alla fine sessione utente

Nel caso si esegua all’avvio delle sessione utente uno script tramite le Group Policy Utente in Impostazioni di Windows/Script/Accesso o Impostazioni di Windows/Script/Fine sessione per default le istruzioni non dovrebbero essere visualizzate in caso contrario è possibile utilizzare la Group Policy Utente in Modelli amministrativi / Sistema / Script / Nascondi gli script di accesso legacy durante l’esecuzione (per informazioni si veda Run legacy logon scripts hidden).

Approccio 3: Avviare lo script in modo silente tramite uno script VBS

Un’altra possibilità per eseguire in modo silente uno script DOS è quella di utilizzare un semplice script VBS per avviarlo come il seguente:

RunScriptHidden.vbs

CreateObject(“Wscript.Shell”).Run “””” & WScript.Arguments(0) & “”””, 0, False

Per avviare lo script DOS in modo silente si potrà utilizzare il seguente comando:

Wscript RunScriptHidden.vbs “[path to .bat/.cmd file] [argument]”

Approccio 4: Utilizzare un’utility di terze parti per eseguire lo script in modo silente

Per eseguire in modo silente uno script DOS è anche possibile utilizzare varie utility di terze parti, di seguito ne riporto alcune di esempio:

  • NirCMD by NirSoft: “NirCmd is a small command-line utility that allows you to do some useful tasks without displaying any user interface. By running NirCmd with simple command-line option, you can write and delete values and keys in the Registry, write values into INI file, dial to your internet account or connect to a VPN network, restart windows or shut down the computer, create shortcut to a file, change the created/modified date of a file, change your display settings, turn off your monitor, open the door of your CD-ROM drive, and more…”
  • HStart by ntwind software: “Hidden Start (or Hstart) is a lightweight command line utility that allows you to run console applications and batch files without any window in the background, handle UAC privilege elevation under Windows 10 and prior, start multiple commands in parallel or synchronously, and much more”
  • SilentCMD by Stephan Brenner: “Executes a batch file without opening the command prompt window”
  • Cmdow by Commandline: “Cmdow is a Win32 console application that allows program windows to be listed, moved, resized, renamed, hidden/unhidden, disabled/enabled, minimized, maximized, restored, activated/inactivated, closed, killed and more”
  • Quiet by joeware: “Command line tool to silently launch a process”

Approccio 5: Utilizzare un’utility di terze parti per convertire lo script in un file eseguibile

Un altro approccio per eseguire in modo silente uno script DOS è quello di convertire lo script in un file eseguibile da eseguire in modalità silente utilizzando una delle varie utility di terze parti disponibili, di seguito ne riporto una di esempio:

Bat To Exe Converter by F2KO Software: “Bat To Exe Converter can convert BAT (.bat) script files to the EXE (.exe) format”. F2KO Software ha anche reso disponibile un tool analogo per script PowerShell (Ps1 To Exe) e VBS (Vbs To Exe) inoltre gli stessi tool sono anche disponibili online ai seguenti

Approccio 6: Utilizzare un’utility per l’automazione di task IT per avviare lo script in un modo silente

Un ultimo approccio è quello di utilizzare un tool come AutoIt che consente di generare un eseguibile che avvia uno script in modo silente usando la funzione Run che ammette il flag @SW_HIDE:

“AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting. It uses a combination of simulated keystrokes, mouse movement and window/control manipulation in order to automate tasks in a way not possible or reliable with other languages”

Un’altra utility simile è AutoHotkey tramite la funzione Run che ammette il parametro Hide:

“AutoHotkey is a free, open-source scripting language for Windows that allows users to easily create small to complex scripts for all kinds of tasks such as: form fillers, auto-clicking, macros, etc.”