{"id":1453,"date":"2026-01-18T18:30:53","date_gmt":"2026-01-18T18:30:53","guid":{"rendered":"https:\/\/www.budus.it\/Blog\/?p=1453"},"modified":"2026-01-18T18:30:53","modified_gmt":"2026-01-18T18:30:53","slug":"eseguire-un-bat-che-si-auto-invoca-per-richiedere-i-privilegi-di-amministratore-se-non-presenti-e-restituisce-un-codice-di-uscita","status":"publish","type":"post","link":"https:\/\/www.budus.it\/Blog\/eseguire-un-bat-che-si-auto-invoca-per-richiedere-i-privilegi-di-amministratore-se-non-presenti-e-restituisce-un-codice-di-uscita\/","title":{"rendered":"Eseguire un bat che si &#8220;auto-invoca&#8221; per richiedere i privilegi di amministratore (se non presenti) e restituisce un codice di uscita."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Il comando di esempio che propongo come soluzione \u00e8 questo:<br><code>powershell -WorkingDirectory \"C:\\cartella\\di\\lavoro\\raggiungibile\\da\\admin\" -Command \"$p = Start-Process cmd.exe -ArgumentList '\/c', 'C:\\percorso\\raggiungibile\\da\\admin\\script.bat', '\/comando1', '\\\"C:\\un percorso con spazi\\giusto\\di\\esempio\\\"', 'PARAMETRO3' -Verb RunAs -Wait -PassThru; exit $p.ExitCode\"<\/code><\/p>\n\n\n<a class=\"wp-block-read-more\" href=\"https:\/\/www.budus.it\/Blog\/eseguire-un-bat-che-si-auto-invoca-per-richiedere-i-privilegi-di-amministratore-se-non-presenti-e-restituisce-un-codice-di-uscita\/\" target=\"_self\">Leggi tutto<span class=\"screen-reader-text\">: Eseguire un bat che si &#8220;auto-invoca&#8221; per richiedere i privilegi di amministratore (se non presenti) e restituisce un codice di uscita.<\/span><\/a>\n\n\n<p class=\"wp-block-paragraph\">Scenario: <strong>ho un file bat che deve eseguire delle operazioni con privilegi elevati (nel mio caso specifico, giusto per dare un esempio: registrare una DLL che rappresenta un Add-in del CAD SolidWorks)<\/strong> e &#8211; se non trovati &#8211; auto-invocarsi dopo aver chiesto le credenziali di amministratore, attendere che la &#8220;propria copia&#8221; eseguita nel &#8220;cmd.exe&#8221; appositamente creato faccia il suo lavoro e termini con un codice di uscita, il quale, deve poi essere catturato dal processo iniziale e gestito.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lo so, scritta cos\u00ec, \u00e8 un po&#8217; &#8220;arzigogolata&#8221; la cosa; una AI la scriverebbe cos\u00ec:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ho un file batch che deve eseguire operazioni con privilegi elevati (ad esempio, registrare una DLL che funge da add\u2011in per SolidWorks). Se la DLL non \u00e8 presente, il batch deve:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Richiedere le credenziali di amministratore.<\/li>\n\n\n\n<li>Ri\u2011eseguire se stesso in una nuova istanza di <code>cmd.exe<\/code> con i privilegi ottenuti.<\/li>\n\n\n\n<li>Attendere che la copia \u201ceseguita\u201d completi il lavoro e termini con un codice di uscita.<\/li>\n\n\n\n<li>Catturare quel codice di uscita nella sessione originale e gestirlo di conseguenza.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Forse sono io che ho posto male la domanda all&#8217;AI quando gli ho chiesto di realizzare la cosa ma, avendo tribolato molto per ottenere un risultato funzionante, magari l&#8217;esempio sopra pu\u00f2 servire a qualche disperato come me.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per quanto riguarda il comando di esempio, espongo la relativa descrizione (sempre fatta da AI):<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Spiegazione dettagliata del comando<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>powershell `\n  -WorkingDirectory \"C:\\cartella\\di\\lavoro\\raggiungibile\\da\\admin\" `\n  -Command \"$p = Start-Process cmd.exe `\n              -ArgumentList '\/c', `\n                           'C:\\percorso\\raggiungibile\\da\\admin\\script.bat', `\n                           '\/comando1', `\n                           '\\\"C:\\un percorso con spazi\\giusto\\di\\esempio\\\"', `\n                           'PARAMETRO3' `\n              -Verb RunAs `\n              -Wait `\n              -PassThru; `\n          exit $p.ExitCode\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1. <code>powershell<\/code> \u2013 avvio di PowerShell<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Il comando \u00e8 eseguito da un prompt di comando (<code>cmd.exe<\/code>) o da un altro script batch.<br><code>powershell<\/code> lancia una nuova istanza di PowerShell <strong>in modalit\u00e0 interattiva<\/strong> (o in modalit\u00e0 script, a seconda del contesto).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. <code>-WorkingDirectory \"C:\\cartella\\di\\lavoro\\raggiungibile\\da\\admin\"<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Imposta la cartella di lavoro corrente della sessione PowerShell.<br>Tutto ci\u00f2 che viene eseguito all\u2019interno di PowerShell (ad esempio i file batch o i comandi) verr\u00e0 cercato <strong>in questa directory<\/strong> se non viene specificato un percorso assoluto.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3. <code>-Command \"&lt;script&gt;\"<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Il parametro <code>-Command<\/code> indica a PowerShell di eseguire immediatamente la stringa di script che segue.<br>La stringa \u00e8 racchiusa tra virgolette doppie (<code>\"<\/code>), quindi \u00e8 interpretata come <strong>un unico argomento<\/strong> per PowerShell.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4. <code>$p = Start-Process cmd.exe ...<\/code><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">a. <code>$p =<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">La variabile <code>$p<\/code> conterr\u00e0 l\u2019oggetto <strong>Process<\/strong> restituito da <code>Start-Process<\/code>.<br>Questo oggetto fornisce, tra le altre cose, la propriet\u00e0 <code>ExitCode<\/code> che verr\u00e0 usata alla fine.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">b. <code>Start-Process cmd.exe<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Avvia un nuovo processo <code>cmd.exe<\/code>.<br>Questo \u00e8 il motivo per cui il comando \u00e8 avvolto in PowerShell: <code>Start-Process<\/code> \u00e8 un cmdlet nativo di PowerShell, non di <code>cmd.exe<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">c. <code>-ArgumentList '\/c', 'C:\\percorso\\raggiungibile\\da\\admin\\script.bat', '\/comando1', '\\\"C:\\un percorso con spazi\\giusto\\di\\esempio\\\"', 'PARAMETRO3'<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><code>-ArgumentList<\/code> specifica gli argomenti che verranno passati a <code>cmd.exe<\/code>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>'\/c'<\/code> dice a <code>cmd.exe<\/code> di eseguire il comando che segue e poi chiudersi.<\/li>\n\n\n\n<li><code>'C:\\percorso\\raggiungibile\\da\\admin\\script.bat'<\/code> \u00e8 il file batch da eseguire.<\/li>\n\n\n\n<li><code>'\/comando1'<\/code>, <code>'\\\"C:\\un percorso con spazi\\giusto\\di\\esempio\\\"'<\/code>, <code>'PARAMETRO3'<\/code> sono gli argomenti che il batch ricever\u00e0.<\/li>\n\n\n\n<li>L\u2019argomento con spazi \u00e8 racchiuso tra virgolette doppie (<code>\\\"...\\\"<\/code>) per garantire che venga passato come <strong>un singolo<\/strong> parametro a <code>cmd.exe<\/code>.<\/li>\n\n\n\n<li>Le virgolette doppie sono <strong>escape<\/strong> (<code>\\\"<\/code>) perch\u00e9 la stringa \u00e8 gi\u00e0 racchiusa tra virgolette doppie di PowerShell.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">d. <code>-Verb RunAs<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Chiede a Windows di eseguire il processo con privilegi elevati (prompt UAC).<br>Se l\u2019utente non \u00e8 gi\u00e0 amministratore, verr\u00e0 mostrata la finestra di dialogo \u201cRichiesta di credenziali\u201d.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">e. <code>-Wait<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Il comando PowerShell <strong>attende<\/strong> che il processo <code>cmd.exe<\/code> termini prima di continuare.<br>Ci\u00f2 garantisce che il batch abbia finito di lavorare prima di procedere.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">f. <code>-PassThru<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Restituisce l\u2019oggetto <code>Process<\/code> (che viene assegnato a <code>$p<\/code>).<br>Se non fosse presente, <code>$p<\/code> sarebbe <code>null<\/code> e non si potrebbe leggere <code>ExitCode<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5. <code>exit $p.ExitCode<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dopo che <code>cmd.exe<\/code> \u00e8 terminato, PowerShell esce con lo stesso codice di uscita del processo avviato.<br>Questo \u00e8 fondamentale se il batch viene chiamato da un altro script o da un sistema di automazione: il valore di ritorno indica se l\u2019operazione \u00e8 andata a buon fine o se \u00e8 stato riscontrato un errore.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Riepilogo in un unico flusso<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>PowerShell<\/strong> viene lanciata con una cartella di lavoro specificata.<\/li>\n\n\n\n<li>All\u2019interno di PowerShell, si avvia <strong>cmd.exe<\/strong> con:\n<ul class=\"wp-block-list\">\n<li><code>cmd.exe \/c script.bat \u2026<\/code> (il batch e i suoi argomenti)<\/li>\n\n\n\n<li>privilegi elevati (<code>RunAs<\/code>)<\/li>\n\n\n\n<li>attesa della terminazione (<code>-Wait<\/code>)<\/li>\n\n\n\n<li>restituzione dell\u2019oggetto processo (<code>-PassThru<\/code>)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Una volta terminato il batch, <strong>PowerShell<\/strong> termina con lo stesso codice di uscita del batch.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il comando di esempio che propongo come soluzione \u00e8 questo:powershell -WorkingDirectory &#8220;C:\\cartella\\di\\lavoro\\raggiungibile\\da\\admin&#8221; -Command &#8220;$p = Start-Process cmd.exe -ArgumentList &#8216;\/c&#8217;, &#8216;C:\\percorso\\raggiungibile\\da\\admin\\script.bat&#8217;, &#8216;\/comando1&#8217;, &#8216;\\&#8221;C:\\un percorso con spazi\\giusto\\di\\esempio\\&#8221;&#8216;, &#8216;PARAMETRO3&#8217; -Verb RunAs -Wait -PassThru; exit $p.ExitCode&#8221; Scenario: ho un file bat che deve eseguire delle operazioni con privilegi elevati (nel mio caso specifico, giusto per dare un esempio: registrare &hellip; <a href=\"https:\/\/www.budus.it\/Blog\/eseguire-un-bat-che-si-auto-invoca-per-richiedere-i-privilegi-di-amministratore-se-non-presenti-e-restituisce-un-codice-di-uscita\/\" class=\"more-link\">Leggi tutto<span class=\"screen-reader-text\"> &#8220;Eseguire un bat che si &#8220;auto-invoca&#8221; per richiedere i privilegi di amministratore (se non presenti) e restituisce un codice di uscita.&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[25,6],"tags":[285,99,98],"class_list":["post-1453","post","type-post","status-publish","format-standard","hentry","category-operating-system","category-software","tag-powershell","tag-script","tag-windows"],"_links":{"self":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/1453","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/comments?post=1453"}],"version-history":[{"count":1,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/1453\/revisions"}],"predecessor-version":[{"id":1454,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/1453\/revisions\/1454"}],"wp:attachment":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/media?parent=1453"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/categories?post=1453"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/tags?post=1453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}